Логика и анимация
От: okon  
Дата: 26.04.19 04:58
Оценка:
Допустим у вас поле дискретно логически состоит из клеток , нажимаем кнопку вперед, "Марио" должен переместиться например в клетку Mario.X = Mario.X + 1.
При этом есть анимация ( не известно сколько секунд ) по перемещению из клетки A в клетку B.

Как правильнее сделать, при нажатии кнопки вперед, если клетка X + 1 свободна,

a) сразу меняем состояние на X + 1 , и паралельно запускаем анимацию.
— минус такого подхода что может быть паралельно другое событие например какой-нибудь враг за время анимации марио переместиться в эту же клетку.
получится что анимация перемещения еще не завершилась, а нужно уже запускать анимацию взаимодействия с врагом

б) меняем состояние на X + 1 , только по завершению анимации
— в этом случае также будет проблема рассинхрона, марио может "проехать" по врагу , при этом не будет определено что они одновременно находились в клетке X + 1

оба варианта похожи на неправильные ? а как собственно делают ?
”Жить стало лучше... но противнее. Люди которые ставят точку после слова лучше становятся сторонниками Путина, наши же сторонники делают акцент на слове противнее ( ложь, воровство, лицемерие, вражда )." (с) Борис Немцов
Re: Логика и анимация
От: kov_serg Россия  
Дата: 26.04.19 06:00
Оценка:
Здравствуйте, okon, Вы писали:

O>Допустим у вас поле дискретно логически состоит из клеток , нажимаем кнопку вперед, "Марио" должен переместиться например в клетку Mario.X = Mario.X + 1.

O>При этом есть анимация ( не известно сколько секунд ) по перемещению из клетки A в клетку B.

O>Как правильнее сделать, при нажатии кнопки вперед, если клетка X + 1 свободна,


Для чего вы используете клетки?
Что мешает в клетке находится нескольким объектам, имеющих с ней пересечение?
Re[2]: Логика и анимация
От: okon  
Дата: 26.04.19 06:27
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Здравствуйте, okon, Вы писали:


O>>Допустим у вас поле дискретно логически состоит из клеток , нажимаем кнопку вперед, "Марио" должен переместиться например в клетку Mario.X = Mario.X + 1.

O>>При этом есть анимация ( не известно сколько секунд ) по перемещению из клетки A в клетку B.

O>>Как правильнее сделать, при нажатии кнопки вперед, если клетка X + 1 свободна,


_>Для чего вы используете клетки?

А как делают иначе ? "Клетки" нужны для того чтобы как-то оперировать логикой типа проходимое, не проходимое.
Например не имея "клеток" как определить можно пойти вперед или нельзя ?
С клетками я просто смотрю что находится в клетке x + 1 , если там не проходимый объект, то нельзя ходить.
Также с клетками просто делается алгоритм для врагов, поиск пути для преследования.

_>Что мешает в клетке находится нескольким объектам, имеющих с ней пересечение?

Логически может быть и так но допустим персонаж и враг идут навстречу,
Персонаж в состоянии A1, враг в состоянии A3.
Логика выполняет команды
player.Move(A2);
enemy.Move(A2);

Запускается анимация перемещения

[A1] ****_[A2]_++++[A3]


При этом если в [A2] считать что уже находятся 2 объекта, еще до окончания анимации, то нужно запускать анимацию смерти персонажа.
Можно конечно поместить ее в очередь и когда закончатся обе анимации запустить анимацию смерти, но выглядит это сложно.

Если считать что персонаж находится в [A1] до окончания анимации, то анимация врага, закончившись раньше, сделает позицию врага = [A2]
дальше логика определит — раз игрок находится в [A1] надо двигать врага и вызовет enemy.Move(A1) враг начнет двигаться из A2 в A1,а игрок продолжит двигаться в A2.
получится визуально они "разойдутся" и возможна потенциально ситуация когда враг окажется в [A1], а игрок в [A2], если анимация завершится на одном фрейме у обоих.
”Жить стало лучше... но противнее. Люди которые ставят точку после слова лучше становятся сторонниками Путина, наши же сторонники делают акцент на слове противнее ( ложь, воровство, лицемерие, вражда )." (с) Борис Немцов
Re[3]: Логика и анимация
От: kov_serg Россия  
Дата: 26.04.19 08:13
Оценка:
Здравствуйте, okon, Вы писали:

O>"Клетки" нужны для того чтобы как-то оперировать логикой типа проходимое, не проходимое.

O>Например не имея "клеток" как определить можно пойти вперед или нельзя ?
O>С клетками я просто смотрю что находится в клетке x + 1 , если там не проходимый объект, то нельзя ходить.
O>Также с клетками просто делается алгоритм для врагов, поиск пути для преследования.
Так и используйте свои клетки для статических объектов, которые не двигаются.

_>>Что мешает в клетке находится нескольким объектам, имеющих с ней пересечение?

O>Логически может быть и так но допустим персонаж и враг идут навстречу,
Что мешает завести поле для динамических объектов.
По ячейке определяете кто рядом и дальше проверяете пересечение этих объектов на каждой итерации.

https://gamedev.stackexchange.com/questions/131133/monogames-most-efficient-way-of-checking-intersections-between-multiple-objects
Re[4]: Логика и анимация
От: okon  
Дата: 26.04.19 08:24
Оценка:
_>Что мешает завести поле для динамических объектов.
_>По ячейке определяете кто рядом и дальше проверяете пересечение этих объектов на каждой итерации.
_>https://gamedev.stackexchange.com/questions/131133/monogames-most-efficient-way-of-checking-intersections-between-multiple-objects

Возможно так и надо делать, но пока не понятно как тестировать правила игры независимо от графики.

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

Поэтому мне пока кажется немного странным если у фигур в логике будет некое графическое "пересечение" с чем-то.
”Жить стало лучше... но противнее. Люди которые ставят точку после слова лучше становятся сторонниками Путина, наши же сторонники делают акцент на слове противнее ( ложь, воровство, лицемерие, вражда )." (с) Борис Немцов
Re: Логика и анимация
От: IPv6 Россия http://www.lumarnia.com/
Дата: 26.04.19 15:28
Оценка:
Здравствуйте, okon, Вы писали:

O>a) сразу меняем состояние на X + 1 , и паралельно запускаем анимацию.

вот этот вариант обычно выходит самый понятный — если есть конфликты, то они всегда решаются в пользу "какое должно быть конечное состояние"
и анимация всегда работает из текущего состояния в конечное, не обращая внимания ни на что другое
Re[2]: Логика и анимация
От: okon  
Дата: 29.04.19 06:34
Оценка:
Здравствуйте, IPv6, Вы писали:

IP>Здравствуйте, okon, Вы писали:


O>>a) сразу меняем состояние на X + 1 , и паралельно запускаем анимацию.

IP>вот этот вариант обычно выходит самый понятный — если есть конфликты, то они всегда решаются в пользу "какое должно быть конечное состояние"
IP>и анимация всегда работает из текущего состояния в конечное, не обращая внимания ни на что другое

А как в этом случае решается проблема асинхронности, что в "логическом мире" могут произойти события например движение вперед и попадание в ловушку,
при этом в "визуальном мире" нужно сначала проиграть анимацию вперед, потом ловушку.
Т.е. делается очередь в которую кладуться анимации которые надо проиграть или иначе ? Через какой механизм делается синхронизация визуальной части и логической ?
”Жить стало лучше... но противнее. Люди которые ставят точку после слова лучше становятся сторонниками Путина, наши же сторонники делают акцент на слове противнее ( ложь, воровство, лицемерие, вражда )." (с) Борис Немцов
Re[5]: Логика и анимация
От: CEMb  
Дата: 30.04.19 02:41
Оценка:
Здравствуйте, okon, Вы писали:

O>Еще такой пример — если взять шахматную доску, будет выглядеть странно если в логике у фигур будет не жесткая привязка к клетке, а какие-то произвольные double координаты и коллайдеры.

O>Т.е. хотелось бы шахматную логику полностью отделить от графической анимации перемещения фигур и физики , например если заморочиться с украшательством — чтобы можно было задеть соседнюю фигуру и уронить и потом поднять, т.е. это чисто графические анимация, при этом логика самой игры в шахматы остается неизменной.

O>Поэтому мне пока кажется немного странным если у фигур в логике будет некое графическое "пересечение" с чем-то.


Надо решить, шахматы у тебя это TBS или RTS, если RTS, то тогда double и коллизии. Если TBS, то тогда проблем одновременного занятия одной клетки двумя юнитами быть не должно.

Если у тебя RTS, но с клетками, тогда надо завести коллизии(логическое пересечение, чтобы не было графического), и определять, как вариант, кто больше залез в клетку:
— два юнита начали движение X + 1 и X — 1
— в Х случилась коллизия
— определяем, кто ближе к X, тот остаётся в X
— оставшийся откатывается на свою предыдущую клетку.

Анимации обычно делаются переключающимися из одной в другую. Заводится контроллер анимаций, который следит за состоянием объекта и включает нужную последовательность, в зависимости от ситуации. К примеру, объект шёл в клетку (анимация "ходьба"), натолкнулся на врага, который ему вдарил (переключение на анимацию "получение урона"). В скелетной динамической анимации ещё хитрее, там вроде делают прям переход из одной анимации в другую.
taskbar organizer
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.