Я работаю над игрой в автомобильные гонки и только что реализовал призрачный спрайт для воспроизведения прошлых гонок. Я использую физический движок, и после долгих чтений я пришел к выводу, что лучший способ сохранить данные-призраки для воспроизведения - это записать положение и поворот автомобиля в заданные моменты времени, как, например, описано здесь: https: // gamedev. stackexchange.com/a/8380/26261 .
Но что было бы хорошим способом найти эти моменты во время воспроизведения? Примером может служить запись с этими данными:
time: +3.19932 (seconds since race start)
position: 180,40 (position at that time)
rotation: 30.4 (rotation at that time)
Но у меня есть несколько проблем с этим:
Когда я повторяю, маловероятно, что я снова достигну точного момента времени в 3.19932 - более вероятно, что у меня будет момент времени около 3.1 и мне нужно будет найти ближайшую соответствующую запись. При интерполяции даже самое близкое совпадение сверху и снизу. Это звучит очень неэффективно и отнимает много времени?
В какой структуре списка я могу хранить эти записи для последующего воспроизведения? Массив? Не означает ли это, что время поиска записей, соответствующих определенному времени, увеличится, чем дольше будет гонка?
Какую частоту я должен использовать для временных точек? Каждый кадр был бы, я думаю, излишним, скорее я должен сохранять, т.е. каждый n-й кадр и интерполировать между ними, что делает вопросы хранения в 2. еще более трудными.
Так эта идея даже правильный подход? Если да, как я могу эффективно хранить и извлекать данные? Обратите внимание, что я, как правило, хотел бы использовать приведенную выше структуру данных, а не детерминированные игровые состояния, запись пользовательского ввода и т. Д.
Спасибо за любую помощь!
РЕДАКТИРОВАТЬ: я понимаю, что я должен описать среду, которую я использую: Cocos2D для iPhone. Есть способ update:(ccTime)delta
. В идеале этот метод вызывается каждые 1/60 секунды, но нет никакой гарантии - delta
это фактическое время, прошедшее с момента последней игры, и оно может быть намного больше или меньше 1/60. Именно в этом методе я хотел бы сохранить текущее состояние игры.
Ответы:
Нет :)
Допустим, вы храните его в виде массива (обратите внимание, что снимки расположены в хронологическом порядке, но не равномерно):
Затем, когда начинается воспроизведение / игра, вы получаете первый и второй элемент из массива:
Затем в каждом кадре (
currentTime
текущее время в этой новой игре):Конечно, это можно оптимизировать, кэшируя некоторые расчеты. Там нет поиска по массиву, просто поиск конкретных индексов.
источник
Это не так уж сложно. Вы можете хранить свои данные в произвольные моменты времени (чем больше, тем лучше), и вы можете интерполировать значения данных на основе искомой отметки времени и данных из двух ближайших записанных отметок времени, например:
Теперь представьте, что вы хотите получить положение и вращение в момент времени 0,10. Так как 0.10 находится между точками «1» (что означает время 0,05) и «2» (что означает время 0,15), необходимо их интерполировать.
Lerp
это просто линейная интерполяция .Итак, давайте заполним пробелы с некоторыми примерами (*).
НТН.
источник