Допустим, у вас есть анимация, которую вы хотите получить при стрельбе из пули. Как бы вы получили пулю, чтобы показать в конце анимации. Единственное, что я могу выяснить, это знать продолжительность анимации и задержать установку позиции маркеров и активацию ее, пока не пройдет это количество времени. Мне просто интересно, если это лучший подход, как все остальные справляются с этим?
РЕДАКТИРОВАТЬ: Я думаю, что у меня проблемы с формулировкой вопроса должным образом.
Ответы:
По сути, вы на правильном пути - вам нужно знать, как долго длится анимация, чтобы делать подобные вещи. Анимации - это больше, чем просто набор кадров, вокруг них есть всякая другая информация, которая вам нужна. Например, сколько кадров, цикл анимации, как быстро он воспроизводится (например, 10 кадров анимации в секунду, или 25, или 60?). Каждая анимация может быть определена в виде нескольких фрагментов данных, которые некоторый обобщенный код анимации может просматривать и воспроизводить. Вы должны инкапсулировать часть анимации в свой собственный фрагмент кода, который ничего не знает, кроме этих определений анимации и способов отображения отдельных кадров изображения. Это значит, что у вас есть анимационный объект, который вы можете загрузить, начать воспроизведение, остановить воспроизведение и указать рендеринг в определенном месте на экране.
Гибкий подход заключается в использовании своего рода определения анимации для инкапсуляции информации такого рода. Поэтому вместо того, чтобы просто сказать «анимация Х - это все эти кадры, просто играть через них», вы получите что-то более сложное.
Например, с каким-то смоделированным форматом данных
Итак, ваш код говорит что-то вроде:
То, как вы обнаруживаете события, может быть либо с помощью кода анимации, который вам перезванивает (т. Е. Когда он обнаруживает новое событие, потому что анимация воспроизводится в определенном кадре, он вызывает код вашей игры, чтобы сообщить ему о новом событии), или путем анимация вроде так:
Примечания к сведению:
Если вам не нужно, чтобы выстрелы происходили внутри анимации, но только после того, как она закончилась, вы можете обойтись без гораздо более сложной системы без понятия событий. Но вам все еще нужна система, в которой анимации воспроизводятся сами по себе, знают, как долго они работают, и могут вызывать код игры после завершения анимации.
источник
В некотором смысле вам придется подождать, пока анимация не будет завершена, и создать пулю в этой точке.
Просто установите таймер, если вы уверены, что ваша скорость анимации фиксирована. В качестве незначительного изменения, вы могли бы иметь внутренний код для маркера, который заставит его невидимо подождать некоторое время, прежде чем появиться и двигаться.
В зависимости от вашей платформы разработки, у вас может быть какая-то функция обновления анимации или обратный вызов, который позволит вам точно ответить, когда анимация достигнет желаемой точки. Вот как я бы сделал это с Flixel, например.
источник
addAnimationCallback
Метод Flixel может быть использован на объекте обжига. В функции обратного вызова вы можете увидеть, является ли текущий кадр анимации стрельбы кадром, который должен создать объект маркера. Если это так, вы можете добавить пулю на экран.Прямой ответ: при условии, что у вас есть анимация, которую вы хотите воспроизвести, когда игрок нажмет кнопку «огонь», а затем выпустите пулю после завершения игры. В идеале вы должны избегать жесткого кодирования времени анимации и запускать пулю после завершения анимации (используя функцию обратного вызова или что-то еще, в зависимости от вашей платформы). Я не могу придумать какой-либо другой способ сделать это, который не слишком сложен.
Ответ альтернативного игрового дизайна: если нет действительно веской причины для этого, я бы избежал задержки с нажатием кнопки «огонь» и появлением маркера. Если анимация не очень-очень короткая (один или два кадра, макс, в основном дульная вспышка), это заставит реагировать на нажатие кнопки огня медленно, и это будет раздражать обычного игрока. Даже если вы решите использовать анимацию до того, как появятся пули (пошаговые RPG и тактические игры были бы приемлемыми причинами для этого), я бы подумал о включении где-нибудь опции «отключить анимацию», чтобы позволить игра, чтобы двигаться быстрее, если игрок хочет.
источник
Как говорит мистер Крэнки; держите анимацию и логику отдельно.
Но самое главное, логика должна оставаться главной частью.
Имейте в виду, что управление пользовательским интерфейсом из логики - единственный способ гарантировать, что вы сможете сохранить, повторно использовать и поделиться своей логикой позже (новый рендер, новая игра, версия сервера без рендерера ...)
источник
Во-первых, я бы использовал систему событий (шаблон наблюдателя?), Чтобы отделить части кода. Это не только для анимации, но, безусловно, применяется там. Тогда код анимации может просто сказать dispatchEvent (событие) и некоторая другая часть кода прослушивает это событие, при этом ни одна часть кода не должна знать друг о друге.
Теперь код анимации должен фактически иметь ссылку на диспетчер событий (это легко сделать с помощью внедрения зависимостей), и вам нужен XML или JSON, который фактически определяет ваши анимации. Что-то вроде:
Читайте данные при загрузке анимации, и пусть код анимации отправляет событие, когда оно находится в этом кадре во время воспроизведения.
источник