Анимация и логика

Здесь я обрисовываю в общих чертах быстрое исправление

  1. , замените <% @a = ("a".."z").to_a %> на <% alpha_numbers = ("A".."Z").to_a %>. Вы используете <ol type="A">, который печатает список в верхнем регистре, а не в маленьком.
  2. Переместитесь над фрагментом вне цикла @free_questions.each_with_index, чтобы в итоге не инициализировать один и тот же массив для каждого вопроса в цикле.
  3. Заменить @free_choices.where(question: question.id).sort_by{rand}.each do |choice| на question.choices.shuffle.each_with_index do |choice, index|. Согласно модельному соотношению, question.choices даст тот же результат, что и @free_choices.where(question: question.id). shuffle это лучший способ сделать sort_by{rand}.
  4. В модель Choice добавить attr_accessor :alpha_order. Это создаст методы доступа.
  5. Над <li><%= choice.name %></li> добавьте строку <% choice.alpha_order = alpha_numbers[index] %>. Эта строка устанавливает текущий алфавитный порядок выбора в переменной экземпляра.
  6. Заменить @free_choices.where(question: question.id, correct: TRUE).each do |choice| на question.choices.select { |choice| choice.is_correct }.each do. Это зацикливает только те варианты выбора для данного question, где is_correct равно true.
  7. Если вы хотите привязать алфавитный номер к выбору, получите к нему доступ, используя choice.alpha_order, что даст правильный альфа-порядок.

Надеюсь, это поможет.

6
задан John Leidegren 25 March 2009 в 08:36
поделиться

7 ответов

Решение зависит от геймплея, для которого Вы идете. Если геймплей составляет управляемых кодом 100%, anim управляется состоянием объекта (управляемая состоянием анимация). Если это - graphics/animation-driven, anim длина определяет сколько времени объект в том состоянии (anim-управляемое состояние).

Последний обычно более гибок в коммерческой продуктивной среде, поскольку разработчик может просто сказать, что "нам нужна та смерть anim, чтобы быть короче", и она согласовывается. Но когда Вы имеете очень точные правила в виду или моделируемую систему как физика, управляемая состоянием анимация может быть предпочтительной. Существует номер 100%-е ортогональное и чистое решение для общего случая.

Одна вещь, которая помогает помешать ему становиться слишком грязным, состоит в том, чтобы считать игру шаблонами AI:

Игра AI обычно реализуется как некоторая форма конечного автомата, возможно несколько конечных автоматов или разделяется на уровни в некотором роде (наиболее распространенное подразделение, являющееся высокоуровневым форматом сценариев с низкоуровневыми действиями/переходами).

На низком уровне можно сказать вещи как "в состоянии hitreact, воспроизвести мой hitreact anim, пока это не заканчивается, затем найдите из высокоуровневой логики что состояние продолжиться от". На высоком уровне существует множество способов пойти об определении логики, но простые циклы повторения как "подход/нападение/отступление" являются хорошим способом запуститься.

Это помогает сохранить два вида поведений - запланированные операции и реакции на новые события - от того, чтобы быть слишком смешиваемым. Снова, это не всегда решает, что путь на практике, по тем же причинам, что иногда Вы хотите, чтобы код управлял данными или наоборот. Но это - AI для Вас. Никакие общие решения здесь!

5
ответ дан 17 December 2019 в 02:33
поделиться

Я предполагаю, что действительно не вижу проблемы.

Если у Вас было некоторое вложенное множество обратного вызова, я видел, почему за вещью могло бы быть трудно следовать, но если Вы только имеете, каждый перезванивает для всех событий анимации и одной функции обновления, которая запускает анимации, довольно легко следовать коду.

Таким образом, что Вы получаете путем разделения их?

0
ответ дан 17 December 2019 в 02:33
поделиться

Анимация может назвать функцию обратного вызова, которую Вы предоставляете или передаете универсальное событие обратно коду. Этому не нужны что-то большее чем это, которое сохраняет всю логику в коде. Просто введите обратный вызов или соедините событие, когда анимация будет создана.

0
ответ дан 17 December 2019 в 02:33
поделиться

Я думаю, что необходимо разделить рендеринг от игровой логики.

У Вас есть по крайней мере два других вида объектов:

  • Объект, который содержит данные единицы (очки жизни, положение, скорость, сила, и т.д.) и логика (как это должно переместиться, что происходит, если это исчерпывает очки жизни...).
  • Его представление, которое является спрайтом, цветами, частицы, присоединенные к нему, звуки, безотносительно. Представление может получить доступ к данным объекта, таким образом, это знает положение, очки жизни, и т.д.
  • Возможно, контроллер, если объектом могут непосредственно управлять человек или AI (как автомобиль на автомобильном моделировании).

Да, который походит на архитектуру Образцового Контроллера Представления. Существует много ресурсов об этом, видит эту статью от deWiTTERS или Партизанское Руководство по Игровому Коду Jorrit Rouwé для определенных для игры примеров.

О Ваших проблемах анимации: для умирающей единицы, когда Модель обновляет свой объект и выясняет, она больше не имеет очков жизни, она могла установить флаг, чтобы сказать, что это мертво, и удалите объект из игры (и из памяти). Затем позже, когда Представление обновляет, оно читает флаг и запускает умирающую анимацию. Но может быть трудно решить, где сохранить этот флаг, так как объект объекта должен исчезнуть.

Существует лучший путь в моем скромном, по моему скромному мнению. Когда Ваш объект умирает, Вы могли отправить событие всем слушателям, которые регистрируются к UnitDiedEvent, который принадлежит этому определенному объекту, затем удалите объект из игры. Объект представления объекта слушает то событие, и его обработчик запускает умирающую анимацию. Когда анимация закончена, представление объекта может наконец быть удалено.

Шаблон разработки наблюдателя может быть полезным, здесь.

0
ответ дан 17 December 2019 в 02:33
поделиться

Для пары игр я сделал для решения этой проблемы, я создал два класса анимации

asyncAnimation - Для огня и забывают анимации типа

syncAnimation - Если я хотел ожидать анимации для разрешения перед возвращением управления

Поскольку игры обычно имеют основной цикл, он выглядел примерно так, C# разрабатывают код psuedo

while(isRunning) 
{

   renderStaticItems();
   renderAsyncAnimations();

   if (list_SyncAnimations.Count() > 0)
   {
       syncAnimation = list_SyncAnimations.First();
       syncAnimation.render();

       if (syncAnimation.hasFinished()) 
       {
           list_SyncAnimations.removeAt(0); 
           // May want some logic here saying if
           // the sync animation was 'player dying' update some variable
           // so that we know the animation has ended and the
           // game can prompt for the 'try again' screen
       }

   }
   else
   {
       renderInput();
       handleOtherLogic(); // Like is player dead, add sync animation if required.
   }
}

Таким образом, то, что делает код, ведут список синхронизирующих анимаций, которые должны быть разрешены прежде, чем продолжить игру - Если необходимо ожидать нескольких анимаций, просто складывают их.

Кроме того, это могла бы быть хорошая идея изучить шаблон "команда" или обеспечить обратный вызов для того, когда синхронизирующая анимация закончила обрабатывать Вашу логику - ее действительно, как Вы хотите сделать это.

Что касается Вашей "Икры в секунду 1.13", возможно, класс SyncAnimation должен иметь переопределяемый.OnUpdate () метод, который может сделать некоторую пользовательскую логику (или назвать сценарий),

Это зависит, каковы Ваши требования могут быть.

0
ответ дан 17 December 2019 в 02:33
поделиться

У вашего врага должно быть несколько состояний. Живых и мертвых недостаточно. Живой, умирающий и мертвый может быть. Ваш вражеский цикл обработки должен проверить свое состояние и выполнить различные операции:

if(state == alive and hp == 0)
{
   state = dying
   currentanimation = animation(enemy_death)
   currentanimation.play()
}
elseif(state == dying and currentanimation.isPlaying == true)
{
    // do nothing until the animation is finished.
    // more efficiently implemented as a callback.
}
elseif(state == dying and currentanimation.isPlaying == false)
{
    state = dead
    // at this point either the game engine cleans up the object, or the object deletes itself.
}
1
ответ дан 17 December 2019 в 02:33
поделиться

I try as much as possible to keep callbacks out of child animations. Animations should indicate that they are complete, the actions taken on an animations completion should be called from the controller level of the application.

In Actionscript this is the beauty of event dispatching/listening - The controller object can create the aimation and then assign a handler for an event which the animation dispatches when it is complete.

I've used the pattern for several things in Flash projects and it helps keep code independent far better than callbacks.

Especially if you write custom event objects which extend Event to carry the kind of information you need. such as teh MouseEvent that carries localX, localY, and stageX and stageY. I use a custom I've named NumberEvent to broadcast any kind of numerical information around my applications.

in actionscript controler object:

var animObj:AwsomeAnim = AwsomeAnim();
animObj.start();
animObj.addEventListener(AwsomeAnim.COPLETE,_onAnimFinish);

function _onAnimFinish():void
{
    // actions to take when animation is complete here
}

In javascript where custom events do not exist. I just have a boolean variable in the animation object, and check it on a timer from the controller.

in javascript controller object:

var animObj = new animObj();// among other things must set this.isComplete = false
animObj.start();

function checkAnimComplete()
{
    if(animObj.isComplete == true)
    {
        animCompleteActions();

    }else{
        setTimeout(checkAnimComplete,300);
    }
}
checkAnimComplete();


function animCompleteActions()
{
    // anim complete actions chere
}
0
ответ дан 17 December 2019 в 02:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: