Системы тайминга, обсуждение

Темы, связанные с проектированием и программированием roguelike-игр

Модераторы: Sanja, Максим Кич

Аватара пользователя
Toth
Сообщения: 327
Зарегистрирован: 11 ноя 2009, 13:36
Откуда: Красноярск

Системы тайминга, обсуждение

Сообщение Toth » 12 мар 2010, 13:02

Всем - привет.
После продолжительного отдыха - вернулся в разработку. Подзаточил генерацию, сделал статы, продумал систему перса. Существующая система тайминга самая примитивная: перс сделал ход/действие (неважно какое), монстры сделали ход/действие, обменялись ударами и т.д. Она, понятно, не устраивает. Покурил статьи, пришел примерно к следующему:
1) все действия совершаются мгновенно.
2) с момента отдачи команды (клава/мышь для перса, блок АИ для монстров) до ее завершения (с мгновенным выполнением действия) проходит некоторое время.
3) проверяем текущее состяние перса/существа, если оно свободно начинаем действие.
4) при начале действия ставим флаг, что оно началось устанавливаем время отсчета.
5) в главном цикле уменьшаем счетчик (касается всех существ и игрока), если счетчик - обнулился, немедленно выполняем действие.
5) обсчитываем последствия, выставляем состояние "свободен", идем в (3).

Кто как делал это, еще?

Аватара пользователя
Toth
Сообщения: 327
Зарегистрирован: 11 ноя 2009, 13:36
Откуда: Красноярск

Re: Системы тайминга, обсуждение

Сообщение Toth » 12 мар 2010, 13:06

Попытался выложит панцушот альфы - не вышло.

Аватара пользователя
Jolly Roger
Сообщения: 2973
Зарегистрирован: 27 ноя 2009, 09:10
Откуда: Minsk, Belarus

Re: Системы тайминга, обсуждение

Сообщение Jolly Roger » 12 мар 2010, 13:25

Недавно обсуждали этот вопрос.
http://www.rlgclub.ru/forum/viewtopic.p ... 3&start=30

Выходит страшно гемморно, одно сохранение действий как объектов чего стоит, а выхлоп на выходе не так уж и велик.
Последний раз редактировалось Jolly Roger 12 мар 2010, 14:34, всего редактировалось 2 раза.
Писать диздок спустя несколько лет разработки и множества изменений концепции - исконная русская девелоперская традиция.

Аватара пользователя
kipar
Сообщения: 2119
Зарегистрирован: 10 мар 2010, 13:16
Откуда: Москва

Re: Системы тайминга, обсуждение

Сообщение kipar » 12 мар 2010, 13:48

Имхо проще всего система где действие выполняется сразу, а после него идет кулдаун.

Ну т.е. игрок совершает действие требующее энергии 1200 (шаг вбок), после этого у него становится кулдаун 1200. Дальше - декрементируем у всех кулдаун, пока первый монстр из него не выйдет. Когда кулдаун становится 0 у монстра - выполняем АИ, исполняем действие (и он опять в кулдауне). Когда кулдаун становится 0 у игрока - ждем команды пользователя.

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

Аватара пользователя
Toth
Сообщения: 327
Зарегистрирован: 11 ноя 2009, 13:36
Откуда: Красноярск

Re: Системы тайминга, обсуждение

Сообщение Toth » 12 мар 2010, 15:42

Тот самый шот.

2 kipar: тоже самое, только наоборот - так?

2 Jolly Roger: не совсем понял, на выходе/сохранении счетчики обнуляем, т.е. трабла где?
Вложения
rl1.jpg
rl1.jpg (173.42 КБ) 9285 просмотров

Аватара пользователя
Maelstrom
Мастер
Сообщения: 2062
Зарегистрирован: 26 ноя 2006, 14:19
Откуда: г. Усть-Кирдык
Контактная информация:

Re: Системы тайминга, обсуждение

Сообщение Maelstrom » 12 мар 2010, 16:02

2 kipar: тоже самое, только наоборот - так?
А зачем делать наоборот, если система с кулдауном лучше?
Айв кнгенгах Йог-Сотот

Аватара пользователя
Maelstrom
Мастер
Сообщения: 2062
Зарегистрирован: 26 ноя 2006, 14:19
Откуда: г. Усть-Кирдык
Контактная информация:

Re: Системы тайминга, обсуждение

Сообщение Maelstrom » 12 мар 2010, 16:06

2 Jolly Roger: не совсем понял, на выходе/сохранении счетчики обнуляем, т.е. трабла где?
Берём монстра с большим временем атаки, чем у нас. Герой бьёт монстра раньше, а монтр ещё только начинает атаку. Сохраняемся, загружаемся, счётчик монстра сбрасывается, снова атакуем, снова раньше монстра, снова сохраняемся...
Круто, чё
Айв кнгенгах Йог-Сотот

Аватара пользователя
Toth
Сообщения: 327
Зарегистрирован: 11 ноя 2009, 13:36
Откуда: Красноярск

Re: Системы тайминга, обсуждение

Сообщение Toth » 12 мар 2010, 16:28

2 Maelstrom: save/load по определению нет. Хотя х/з вышел/зашел тоже самое получается. Понял, в чем разница.

Аватара пользователя
Anfeir
Сообщения: 724
Зарегистрирован: 14 дек 2007, 09:29
Контактная информация:

Re: Системы тайминга, обсуждение

Сообщение Anfeir » 12 мар 2010, 16:58

Toth, делай как больше нравится.
Бесполезно слушать советы .) (в том числе и этот совет).
Только нужно быть готовым к неожиданным трудностям в случае "реальной" модели. Например:
1)Под конец простых действий монстр может свалить на несколько клеток. Это приводит к проблемам с атакой, с дачей вещей, с разговором, с использованием всего-всего.
2) Очень нужно следить, чтобы не уничтожить раньше времени какой-нибудь объект. Или обходится без ссылок на них.
3) С сохранением, если сохранять, либо с читами, если не сохранять (было уже замечено). Лучше сделать, чтобы сохранение никак не влияло на игровой процесс вообще.
4) передвижение таким способом очень неоднозначно. Например, кому понравится, если идешь на клетку - а она уже занята монстром.
5) Летающие объекты. Продуманы? Стрелы, файрболты...

Аватара пользователя
Toth
Сообщения: 327
Зарегистрирован: 11 ноя 2009, 13:36
Откуда: Красноярск

Re: Системы тайминга, обсуждение

Сообщение Toth » 12 мар 2010, 17:15

Добрый ты человек, Anfeir, благодарю покорно. Чуть-чуть в такие дебри не ушел. Тем более, что магия у меня будет сносить половину карты или уничтожать все амулеты, например. Или, например, опять же - менять пол игрока.

П.С.: А что такое - "скользящий тайминг"?

Аватара пользователя
Toth
Сообщения: 327
Зарегистрирован: 11 ноя 2009, 13:36
Откуда: Красноярск

Re: Системы тайминга, обсуждение

Сообщение Toth » 12 мар 2010, 18:15

Maelstrom, тебе добра также.

Аватара пользователя
Максим Кич
Администратор
Сообщения: 1635
Зарегистрирован: 03 дек 2006, 20:17
Откуда: Витебск, Беларусь
Контактная информация:

Re: Системы тайминга, обсуждение

Сообщение Максим Кич » 13 мар 2010, 23:41

Toth писал(а):Добрый ты человек, Anfeir, благодарю покорно. Чуть-чуть в такие дебри не ушел. Тем более, что магия у меня будет сносить половину карты или уничтожать все амулеты, например. Или, например, опять же - менять пол игрока.

П.С.: А что такое - "скользящий тайминг"?
Этот термин, кажется, я вводил. Сводится примерно к следующим утверждениям:
  1. Игровое время квантуется по некоторым сравнительно малым отрезкам — «тикам». То есть ход игрока первого уровня занимает, например, тысячу «тиков».
  2. Любой персонаж, выбирая следующее своё действие «объявляет» его. Т.е. на уровне реализации, объект говорит системе, что он намерен, скажем, занять клетку слева от себя за 700 тиков. «Объявление» вешает на клетку маячок действия с TTL (таймер обратного отсчёта), равный некоторому числу тиков. Т.е. 700 в случае с примером. Маячок обозначает, что если в этой клетке ничего не случится в течении срока его жизни, действие будет осуществлено.
  3. Если в течении TTL маячка действия, на эту же клетку другой персонаж пытается навесить свой маячок, инициируется процесс разрешения (resolving) действий. Например, если одну и ту же клетку пытаются занять два персонажа, то удаётся это сделать персонажу, получившему согласно игровой механике преимущество (по совокупности параметров, спасброска и т.д.). Второй игрок получает штрафы, соответствующие текущему действию.
  4. Отсчёт квантов игрового времени осуществляется постоянно, пропорционально системному таймеру, пока очередное действие игрока не реализуется. Когда действие реализуется, согласно окончанию TTL маячка, либо прерыванию TTL согласно штрафу в процессе разрешения, игроку предоставляется возможность выбрать следующее своё действие.
Но у этой системы есть определённые практические проблемы с применимостью. Я сейчас не считаю, что есть смысл пытаться реализовать её на практике.
Dump the screen? [y/n]

Аватара пользователя
Anfeir
Сообщения: 724
Зарегистрирован: 14 дек 2007, 09:29
Контактная информация:

Re: Системы тайминга, обсуждение

Сообщение Anfeir » 14 мар 2010, 11:49

У меня немного проще. Есть единая временая ось. Есть классы, которым нужно действовать со временем. У каждого из этих классов есть virtual void Event(). Без параметров, без всего. Объект говорит - хочу, чтобы пришло событие в такое-то время (1 средний ход игрока = 100 временных единиц). Ему и приходит такое событие в нужное время. А там уже каждый объект сам решает, что ему с событием делать.
Такими объектами могут быть не только монстры и вещи, тут никаких ограничений нет.
Никаких операций с памятью new, delete при этом не происходит.
Свой пуд соли я на этом съел (в осн. следить под конец действия за возможными изменениями), но сама система с самого начала работала как часы. То же самое вполне можно использовать и для традиционной системы, где Event() будет приходить по окончанию cooldown-а.

Аватара пользователя
Maelstrom
Мастер
Сообщения: 2062
Зарегистрирован: 26 ноя 2006, 14:19
Откуда: г. Усть-Кирдык
Контактная информация:

Re: Системы тайминга, обсуждение

Сообщение Maelstrom » 14 мар 2010, 12:24

Объект говорит - хочу, чтобы пришло событие в такое-то время (1 средний ход игрока = 100 временных единиц).
У тебя что, очередь действий хранится?
Айв кнгенгах Йог-Сотот

Аватара пользователя
Anfeir
Сообщения: 724
Зарегистрирован: 14 дек 2007, 09:29
Контактная информация:

Re: Системы тайминга, обсуждение

Сообщение Anfeir » 14 мар 2010, 15:09

Maelstrom писал(а):
Объект говорит - хочу, чтобы пришло событие в такое-то время (1 средний ход игрока = 100 временных единиц).
У тебя что, очередь действий хранится?
Сами объекты выстраиваются в очередь (в "ячейке", отвечающей за нужное время). (Совершенно независимо от местоположения объекта (если оно есть, например, положение на карте для монстра)). На самом деле, немножко сложнее, но только для того, чтобы были оптимизировать удаленные события (скажем, событие через полгода - по игровым меркам вполне реально).

Действие (Action) монстра как объект тоже имеет свой Event().

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя