Время - назад!

1
Ня! Тоже решил поддаться всеобщему литературно-повествовательному настрою и черкнуть пару строк.
Последовательность событий такая:
Участвовали в Y8-конкурсе -> Выиграли -> Многие спрашивают, как я сделал эффект перемотки времени назад.
Чтобы не расписывать каждому отдельно, решил рассказать здесь.



Y8-конкурс


Они объявили, сроки — с 9ого по 16ое, мы целый первый день убили на придумывание игры. Было скучно и переживательно. Хотелось не участвовать. Но после окончательной придумки «стреляем тридцать секунд, а потом всё заново, но на уровне есть я из прошлого» решили доделать до конца.


Time Hotel


Не буду особо рассказывать как делалась игра, какие переделки мы вносили, как кранчевали. Мне кажется, зачастую от таких рассказов можно уснуть…
Просто скажу, что в такие сжатые сроки было адски-сложно довести ее до финального состояния. За меня скажут мои помидоры ;) До этого я работал по пять штук в день, но во время конкурса приходилось чертовски перерабатывать:




Эффект перемотки


Забавно, но эта фишка сделалась быстро (11ое марта, два последних ночных помидора). Хотя вся игра делалась с нуля на голом флеше (из старого кода использовал только растеризацию), но смех в том, что больше всего времени убил 16ого числа на рандомную компоновку этажей… Итак, про перемотку. Стоп-кадр перемотки выглядит так:



Многих интересуют вот эти классные полоски-искажения, а-ля перемотка на старых видеопроигрывателях.
Делаю так:

1. Во время игры я сохраняю каждый десятый кадр. Рендер в битмат-дату. Всё это барахло отъедает более 100Мб оперативки.
2. Когда нужно отмотать время назад — я начинаю рисовать эти битмап-даты в обратном порядке.
3. Теперь самое интересное — искажения. Процесс отрисовки одной битмап-даты выглядит так:
  • Сначала делаю copyPixels всей битмап-дате. Получается кадр без искажений.
  • Затем поверх я рисую полоски. Беру куски из оригинальной картинки и рисую через copyPixels на экран, при этом делаю небольшой сдвиг влево-вправо. Получается, я рисую полоски поверх «кадра без искажений».
  • Затем рисую в том же месте еще одну полоску, но поуже и с бОльшим сдвигом. Приглядитесь на скрин выше — из-за такого приема торцы искажений выглядят более дугообразными по форме
  • Затем сдвигаю полоски вверх или вниз. Имеется ввиду просто число «теперь полоска в координате y+10». У каждой храню просто рандомную скорость. Так они ползают во время перемотки.
  • Если полоска дошла до границ экрана — перекидываю обратно, чтобы она продолжила искажать картинку.

Уф-ф-ф… Вот, собственно, и всё. Магия закончилась.
Перенести такой подход на мобильные девайсы не получится — слишком много оперативки отъедает. Да и рисовать их потом накладно. Тот же copyPixels не пройдет. Видимо нужны шейдеры + тупое сохранение всех-превсех состояний объектов.

В итоге наша игра выиграла. Было дико неожиданно узнать о победе! Фантастика на самом деле.


Мой велосипед

Я уже рассказывал про своё садо-мазо увлечение. Скажу одно — пока дела складываются нормально. К предыдущему переключателю добавился сосед:



Приходится его переключать для компиляции в полный экран на десктопе (кстати, кто-нить знает как в FDT шарить исходники для нескольких проектов?)
Правда игру для тестов я выбрал неудачно. Стратегия — не то, с чего нужно начинать. Поэтому сейчас забросил это дело и подчищаю хвосты — делаю сайтлоки, плачу квартальную бухгалтерию, договариваюсь о продаже Time Hotel.


DevGAMM


Из-за всей этой суматохи с конкурсом я выбился из колеи. Уже и не думаю о том, чтобы привезти какую-нибудь новую игру на конференцию. Буду просто тусовать… но ведь все будут мериться писями! Что же делать? Подумываю о том, чтобы записаться на операцию по удлинению. Безпроигрышный вариант.

На этом всё… Пойду прикуплю штанцы посвободнее! Трам-парам-пурум.

Комментарии (17)

0
Буду просто тусовать… но ведь все будут мериться писями!
я тоже просто тусовать приезжаю
0
это пять! (но вроде у вас с Генералом готовится психодел с медмедем, не?)
0
ну у меня вроде проектов 9 по плану сейчас готовится (и 5 сделано), но ни один не буду показывать.
0
святая лепёшка!.. ты крут!
(ну вот, уже мериться начали)))))
0
все длиной, а я количеством. Хитрый план же.
0
ты безоговорочно лидируешь!))… (смущаюсь даже представить себе такое)))
0
Поздравляю с победой! А где поиграть в игру? Сцылку можно?
0
Пасибки))
Конкурсная версия.
работаю над небольшими косметическими улучшениями…
0
«на зад» это шутка такая?
0
делал картинку второпях… и шрифт какой-то неудачный попался, спейсинги местами большие у него. и сразу так и запросился лишний пробел между «а» и «з»)) поэтому, если коротко, то да — большой промежуток не случаен…
0
И еще вопрос. Я не прогер и извиняюсь сразу если глупость скажу. Но если реализовано отматываение времени зачем сохранять в буфер все битмапы? Не проще генерировать (отрисовывать) «на ходу» каждый кадр в битмап при отмотке назад? Тогда памяти уж точно намного меньше потребуется.
+1
всё путем))
как раз отматывание времени назад и реализовано сохранением битмап. то есть объекты не умеют сохранять свои состояния (позиции, повороты, прозрачность) и отмотка в духе «я сейчас буду объекты обратно двигать» не вышла. вот я и прибег к простому выходу — сохраняю кадры-картинки.

p.s. при подходе «сохранять стейты объектов» памяти, конечно, меньше требуется. но заморочек больше. например, как сохранять частицы? освобождать неиспользуемые уже не получится… ибо они должны хранить весь путь своей жизни.
0
спасибо за ответ:)
0
Отличная игра получилась.
0
ух ты! очень приятно это слышать от вас! благодарю!
0
Прикольная игрушка!
Идея с своим «призраком» хорошая. Вспомнила призрака в гонках!
ПОЗДРАВЛЯЮ!!!
0
Вопрос с памятью, для перехода на мобилки, можно весьма просто решить:
при сохранении кадров для эффекта перемотки, сохранять их в 2 раза сжатыми по высоте. Т.е. размер занимаемой памяти сразу ополовинивается.
А при воспроизведении — рисовать строки через одну (пустые строки оставлять черными или копировать предыдущую с понижением яркости) — полосатость будет естественным образом напоминать interlaced режим, в котором как раз старинные видаки и телевиденье работают.
  • ADF
  • ADF
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.