Как анимация взаимодействия персонажа / объекта работает в изометрических играх?

10

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

Персонажи (сотрудники / неигровые персонажи) в игре должны взаимодействовать с этими объектами, выполняя некоторые заранее определенные задачи, такие как набор текста на клавиатуре на столе или надпись на доске и т. Д.

В частности, меня интересует следующий сценарий:

Персонаж перемещается через офис (1) к своему столу (2), садится и начинает печатать (3).

Из того, что я понимаю, у меня был бы лист спрайта для движения персонажа (1) и статический спрайт для стола (2), но я не совсем понимаю, как будет обрабатываться третий шаг?

Существует ли комбинированный спрайт, содержащий как рабочий стол, так и персонажа? Я предполагаю, что нет, в противном случае мне понадобится спрайт-лист для каждой комбинации стола и персонажа.

Как это обычно обрабатывается?

РЕДАКТИРОВАТЬ:

Вот конкретный пример анимации из игры Theme Hospital. Вы можете посмотреть видео здесь .

Насколько я вижу, анимация разбита на несколько этапов.

Шаг 1 - Персонаж перемещается между столом и стулом.

введите описание изображения здесь

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

Шаг 2 - Персонаж садится за анимацию

введите описание изображения здесь

Обратите внимание, что в самом последнем кадре кресло ближе к столу.

Шаг 3 - Настольная анимация

введите описание изображения здесь

Шаг 4 - Вставай анимацию

Это то же самое, что сесть, но играть в обратном направлении.

Шаг 5 - Отойди

Используйте обычную анимацию движения, чтобы отойти.

У меня есть вопросы, как лучше всего разделить эти анимации и как художник-график обычно предоставляет эти анимации?

Персонаж сидит и печатает на столе на самом деле три разных спрайта (стол, персонаж и стул)? Кто-нибудь знает примеры спрайтов подобных анимаций?

РЕДАКТИРОВАТЬ 2:

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

Патрик Клуг
источник

Ответы:

8

Короткий ответ? Не объединяйте спрайты.
То есть, если вы объединяете, у вас должна быть анимация для каждой отдельной комбинации. Кажется странным, если вы просто хотите один стул. Но давайте представим, что ваш офис можно расширить в середине игры, где стулья теперь имеют более приятный спрайт. Вы бы просто добавили спрайт на стуле, или вы снова рекомбинируете и добавите всю анимацию каждого работодателя?

Давайте сделаем несколько кальков.

Представьте, что у вас есть 6 спрайтов на анимации набора текста работодателем, у вас есть 5 разных стульев и 10 разных типов работодателей.

Если вы просто нарисуете работодателя на стуле, это займет 10 * 6 + 5 спрайтов, 65 спрайтов.
Если вы объединяете и делаете каждую комбинацию, это займет 10 * 6 * 5 спрайтов, то есть 300 спрайтов. Будет такой болью для вас сделать простую таблицу спрайтов для простой анимации!

РЕДАКТИРОВАТЬ:

Ну, если вы не знаете, как это сделать, было бы лучше определить ваш стул в качестве фона, а персонал - в качестве активных спрайтов. Легче для тебя.

Background.draw();
Foreach(employer i in staff)
    I.draw();

Это должно держать ваш персонал отделенным от вашего шасси (фон). Также, обновляйте кадры анимации персонала самостоятельно.

EDIT2:

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

Чтобы переместить кресло ближе, обновите его положение на несколько пикселей вверх и влево или сделайте это на самом спрайте.

Ты понимаешь про Z align? это должно играть много вещей ...

Вы можете видеть, что некоторые части стула остаются позади персонажа, другие появляются спереди. Так как же это возможно, если это всего лишь один спрайт? Z выровнять!

Два способа достижения эффекта. Держите маску (не так просто) или разделите ваш спрайт на две части.

Я просто упомяну второй метод, так как у меня сейчас не так много времени. Вы должны порезать спрайт на своем стуле, в тех частях, которые были бы впереди, а что позади. Затем поместите их в то же положение. легко! Здесь играет Z Align. Части позади должны быть нарисованы сзади, персонаж посередине и передние части кресла спереди.

Я не знаю, какой lib / api / sdk / toolset вы используете. Но большинство делает это следующим образом: используйте фактор выравнивания az, который определяет, что находится позади или что впереди, или то, что вытягивает первым, идет сзади, то, что вытягивает последним, идет впереди. Так что вы должны иметь это в виду.

Густаво Масиэль
источник
Да, спасибо. Я тоже так думал, но я не понимаю, как анимация будет тогда достигнута. Вы знаете пример, который я мог бы рассмотреть? это было бы лучше всего!
Патрик Клаг
Вы имеете в виду код или игру? Если вы хотите игру, попробуйте увидеть Game Dev Story от Kairosoft для Android и iOS. Пример кода, который я не знаю ...
Gustavo Maciel
Ответ пересмотрен. Посмотрите, соответствует ли это вашим потребностям (:
Gustavo Maciel
Я обновил свой вопрос конкретным примером. Мне действительно интересно, как будут выглядеть спрайты или какие графические художники используются для их предоставления. Анимации в GameDev Story слишком просты для того, что я имею в виду.
Патрик Клаг
Прочтите Редактировать 2, я улучшил ответ, надеюсь, он удовлетворит ваши потребности.
Густав Масиэль
2

Альтернативной идеей было бы включить изображение буфера глубины / Z со своими спрайтами, аналогично тому, как 3D API (OpenGL) гарантируют, что полигоны не перекрываются. Для основной спрайтовой игры это может быть просто набор из 0/1 битов (черно-белое растровое изображение) (хотя вы можете использовать больше уровней глубины, если хотите).

Если у вас есть комбинированный спрайт «Deskchair» и вы хотите, чтобы кресло появилось перед любыми другими спрайтами (то есть людьми) на этом квадрате, вы сделали бы Z-Buffer версию char «черным», в то время как стол был бы «белым». ,

Когда вы визуализируете динамический спрайт (человека) на этой плитке, он проверяет, какой цвет находится в буфере глубины. Для пикселей, которые равны 0 (черный), вы пропускаете рисование пикселов спрайтов человека и просто оставляете те пиксели стула там.

Вместо того, чтобы проверять каждый пиксель 1 за раз, более простым способом проверки будет умножение пикселей-спрайтов на значение буфера глубины, так как более близкая глубина будет равна 0, и отмена. Затем, конечно, вы должны выбрать цвет (если у вас нет альфа-канала).

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

Дэвид С. Бишоп
источник
Глубинный слой с маской, о котором я упоминал при редактировании (:
Густаво Масиэль