Пятница, 26 Апреля 2024, 11:04

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » Общие обсуждения программистов » Управление временем. Алгоритм (Braid)
Управление временем. Алгоритм
Stalker_ShooterДата: Вторник, 17 Июля 2012, 14:40 | Сообщение # 1
3D XNA'шник
Сейчас нет на сайте
Всем доброго времени суток. Думаю, многие из вас играли (или хотя бы слышали) в такую игру, как Braid, которая является по истине шедевром инди-разработчиков.

Главная фишка игры - управление временем, которое реализовано на высоте. Так вот, в чем мой вопрос: как возможно реализовать что-то подобное? Как вы думаете, какой алгоритм использовал автор? Неужели он на протяжении всего уровня каждую долю секунды проводил сохранение игры? И если так, то почему игра не лагает безбожно, как должна это делать в таком случае?

Хочется услышать мнение опытных людей. За ранее благодарен!

P.S. Меня интересует не конкретный код, а только алгоритм, подсказка, в каком направлении копать...
P.S.S. Клон Брайда я делать не собираюсь, однако хотелось бы в игре добавить подобную фичу


*Не убегай от снайпера, умрешь уставшим.
*Мои статьи...


Сообщение отредактировал Stalker_Shooter - Вторник, 17 Июля 2012, 14:41
ArchidoДата: Вторник, 17 Июля 2012, 14:53 | Сообщение # 2
Сэнсэй
Сейчас нет на сайте
Quote (Stalker_Shooter)
Так вот, в чем мой вопрос: как возможно реализовать что-то подобное? Как вы думаете, какой алгоритм использовал автор? Неужели он на протяжении всего уровня каждую долю секунды проводил сохранение игры?

Та по поему так он почти и делал, через каждые N кадров делает "скриншот" позиции, угла, кадра текущей анимации для динамики. Для статики было\небыло + кадр анимации. Далее все это дело аккуратно интерполируется в обратном порядке, и получается "перемотка назад" - проигрывается анимация в обратном порядке, появляются подобранные ранее "плюшки" и т.п. Конечно там еще вероятно всяких плюшек прикручено к этому делу, но общая мысль мне видится примерно такой. Хранится все в оперативной памяти, ее хватит за глаза, т.к. "снимки" делаются не каждую мс + параметров не много, да и объектов судя по всему тоже.


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
ant0NДата: Вторник, 17 Июля 2012, 15:02 | Сообщение # 3
постоянный участник
Сейчас нет на сайте
Quote (Stalker_Shooter)
Braid
не играл, поэтому порошу объяснить подробнее, интересно стало чуток


Blender 3D, Godot Engine, LUA
Stalker_ShooterДата: Вторник, 17 Июля 2012, 15:27 | Сообщение # 4
3D XNA'шник
Сейчас нет на сайте
Quote (ant0N)
не играл, поэтому порошу объяснить подробнее, интересно стало чуток


Очень интересная игра. При нажатии определенной клавиши, в некоторых случаях при перемещении игрока и тп. время может отматываться назад. Т.е. например после смерти ГГ воскресает, и все, что происходило на экране запускается в обратном порядке.


*Не убегай от снайпера, умрешь уставшим.
*Мои статьи...
anton-garДата: Вторник, 17 Июля 2012, 15:27 | Сообщение # 5
WEBmaster
Сейчас нет на сайте
ant0N, сам не играл, вот нашёл видео - начинайте смотреть со 2 минуты.


counterДата: Вторник, 17 Июля 2012, 15:29 | Сообщение # 6
почетный гость
Сейчас нет на сайте
Вполне может быть там сделано не сохранение,а запись координат в файл,или в память,а потом считывание их но в обратном порядке smile
З.Ы играл в Braid давненько уже,скажу одно
Quote
является по истине шедевром инди-разработчиков
smile



ModelViewer
SpyDesktop
WebCam Manager
PDFToPNGConverter
Jack Dreams V_1.0
TimKruzДата: Вторник, 17 Июля 2012, 15:41 | Сообщение # 7
старожил
Сейчас нет на сайте
Да, достаточно сохранять все изменяющиеся параметры объектов - координаты x и y, изменение анимации, угол поворота (если нужен), и что там ещё у тебя будет использоваться. Не нужно сохранять каждый кадр, можно, например, раз в полсекунды, а потом восстанавливать движение, например: если в момент t=0 координата x=1, а в t=0.5 - x=10, логично предположить, что через каждые 0.05 секунды прибавлялась единица к координате x. Какой интервал брать - зависит от динамичности игры, хотя можно динамически подстраивать интервал сохранения, например, если игрок стоит на одном месте 5 секунд - его координаты вообще ни где не сохраняются (при этом координаты других движущихся объектов сохраняются), т.е. в памяти данные о состоянии игрока будут только в моменты t=0 и t=5. Так можно сжать объём сохраняемых данных в разы. Скажем, если ключ лежит на полу, но его можно поднять, его вообще не нужно трогать, пока его не подберут. С анимацией можно поступить ещё лучше: сохранять только ключевые моменты перехода, а потом проигрывать в обратном порядке. Например, игрок бежал 3 секунды, при этом анимация бега повторилась 6 раз по 15 кадров, а в памяти сохранить нужно только момент t=0 "переход с чего-то на бег" и t=3 "переход с бега на что-то другое", а при перемотке в момент t=3 запустить анимацию бега, но в обратном порядке, и в итоге получим все те же 90 кадров, что и при нормальном воспроизведении.

Quote (ant0N)
не играл, поэтому порошу объяснить подробнее, интересно стало чуток

Ну там можно в любой момент нажать Shift и перемотать время назад: изображение становится серым и размывается, а все объекты (за исключением тех, на которых не действует этот эффект) перемещаются в обратном порядке (в том числе оживают погибшие персонажи). Есть какое-то ограничение на длину возврата, но всё-таки много отмотать можно. Собственно вся эта игра со временем сделана для того, чтобы проходить уровни-головоломки. Например, дверь открывается рычагом (при этом на рычаг или дверь возврат времени не влияет), рычаг находится в комнате, проход в которую медленно закрывается камнем; заходим, жмём рычаг, но комната закрывается и мы оказываемся в ловушке; просто возвращаемся во времени туда, где ещё не вошли в комнату, но рычаг-то уже нажат, поэтому спокойно идём через дверь, которая уже открылась... Или другой пример: на ключ от двери не влияет изменение времени, но он весит над смертельно опасными шипами; прыгаем и ловим его, при этом герой погибает, упав на шипы; возвращаемся во времени - ключ остаётся в руках, идём открывать дверь. Ещё есть эффект, когда вернувшись во времени появляется призрак главного героя, повторяющий всё то, что сделал игрок.


ant0NДата: Вторник, 17 Июля 2012, 15:45 | Сообщение # 8
постоянный участник
Сейчас нет на сайте
anton-gar, спасибо за видео
да, интересная игра....
Quote (counter)
Вполне может быть там сделано не сохранение,а запись координат в файл,или в память,а потом считывание их но в обратном порядке

скорее всего так и есть... Записывается примерно 20сек, и потом как в видеорегистраторе циклично перезаписываются


Blender 3D, Godot Engine, LUA
counterДата: Вторник, 17 Июля 2012, 16:02 | Сообщение # 9
почетный гость
Сейчас нет на сайте
вот пример написанный на DarkBasic'e coordData хранит координаты но процесс выполняется "вперед",если код поправить можно сделать что юы наоборот считывал с конца.. в папке где эта прога появиться файл coordata.dat там и храняться координаты smile


ModelViewer
SpyDesktop
WebCam Manager
PDFToPNGConverter
Jack Dreams V_1.0
Stalker_ShooterДата: Вторник, 17 Июля 2012, 20:15 | Сообщение # 10
3D XNA'шник
Сейчас нет на сайте
Всем спасибо. Необходимый образ в голове сложился =)

*Не убегай от снайпера, умрешь уставшим.
*Мои статьи...
Форум игроделов » Программирование » Общие обсуждения программистов » Управление временем. Алгоритм (Braid)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг