Визуальная новелла в Excel. Часть 2

Доброго времени суток господа и дамы.

В предыдущей заметке я рассказал о первой неделе разработки визуальной новеллы в Excel. Сделано было довольно много, пусть и не идеально. Я бы даже сказал удовлетворительно. Но останавливаться и переделывать все было нельзя, потому что я установил себе срок — две недели. Именно столько мне предстояло сидеть дома на карантине.

Визуальная новелла в Excel. Часть 2

Итак, подошла к концу вторая неделя. Доделал ли я игру? Ожидаемо нет, хотя работа была проведена большая, и к работе самого игрового движка вопросов практически не осталось. Я реализовал систему сохранений, добавил новые типы активных объектов, а самое главное — довольно неплохо (если это слово применимо к изначально неадекватной реализации) оптимизировал некоторые моменты.

Так, из-за неправильной системы проверки активных объектов, программа выполняла до 150 тысяч операций больше, чем требуется, и сильно занижала фреймрейт. Эта проблема лежала на поверхности, но обнаружил я ее не сразу.

Визуальная новелла в Excel. Часть 2

Вторая проблема заключалась в неправильном подсчете длительности одного кадра. Когда я переписал часть кода, чтобы решить эту проблему, то оказалось, что я забыл об одной важной детали: движение персонажа и смена кадров анимации зависят непосредственно от фреймрейта. Когда на экране мало различных цветов, то фреймрейт вырастает, а скорость персонажа и анимации увеличивается, и наоборот. По-хорошему, я должен был привязать все изменения в течение кадра к временной дельте, но лень дала о себе знать. В конце концов я просто ограничил фреймрейт 12-ю кадрами в секунду (на деле показатель варьируется от 8 до 10 FPS, но об этом позже), чтобы перепады в скорости передвижения главного героя не так сильно бросались в глаза.

Визуальная новелла в Excel. Часть 2

Почему же всего 8-10 кадров в секунду, а не установленные 12? Если программа успела выполнить все операции быстрее отведенного времени (то есть быстрее 1000/12FPS = 83,3 миллисекунд), то оставшееся время она ожидает. В обратном случае игра немного подтормаживает и тут же запускает следующую итерацию цикла.

Функцию ожидания нужно написать самостоятельно. Для этого берем функцию GetTickCount из WINAPI:

Sub delay(ms As Long) Dim curr_time As Long curr_time = GetTickCount() Do While GetTickCount() <= curr_time + ms DoEvents Loop End Sub

Заметили, что в теле цикла находится функция DoEvents? Из-за нее все проблемы. Эта функция обрабатывает события вне нашего цикла и не позволяет Excel впасть в вечную спячку. Если убрать эту функцию, то мы просто не сможем насладиться игрой, потому что экран не будет обновляться, а клавиши считываться.

Проблема заключается в том, что DoEvents тоже требует времени исполнения. Из-за этого функция delay выдает неверный результат. Допустим, программа должна приостановить исполнение на 30 миллисекунд, но из-за DoEvents она приостанавливает исполнение на 45-50 миллисекунд. В результате снижается фреймрейт. Решения этой проблемы я пока не нашел.

Визуальная новелла в Excel. Часть 2

От грустных новостей перейдем к еще более грустным, то есть к сюжету и уровням. Полностью готовы 3 уровня, один из которых я разбил на три части в целях снижения нагрузки. Четвертый уровень тоже готов, но пройти его пока невозможно. Поэтому не удивляйтесь, когда не сможете выбраться из последней локации. Цель простая — ходим, читаем, ищем активные зоны, которые проведут нас дальше, решаем абсолютно простые задачки. Сразу хочу извиниться за лабиринты, которые довольно проблематично пройти из-за низкого разрешения «экрана».

Если знать, куда идти, то все доступные на текущий момент уровни можно пробежать минут за пятнадцать.

Сюжета как такового пока не существует. Весь текст я писал в процессе создания уровней, отталкиваясь от придуманной завязки. Куда меня выведет эта дорога, я не знаю, но надеюсь на лучшее.

Визуальная новелла в Excel. Часть 2

Хотел рассказать больше, да нечего. Защиты «от дурака» практически нет, в код заглядывать не советую во избежание кровотечения из глаз. Попрошу только отписаться в комментариях о найденных проблемах, если все-таки кто-то попробует в это поиграть. Альфа-версию можно скачать на itch.io по ссылке:

UPD. В комментариях решили, что визуальная новелла без аниме-девочек не имеет права на существование. Пришлось это исправлять.

Визуальная новелла в Excel. Часть 2

Карантин закончился, текст получился коротким, а я задумался о будущем. Продолжать разработку изначально непопулярной и нерентабельной игры в Excel или перенести задумку на нормальный игровой движок? Придать этому большее значение, написать адекватный сюжет, собрать интересные уровни с интересными механиками? Уделить больше внимания спрайтам в частности и графике в целом? Ответ пока что скрыт туманом войны.

3434
12 комментариев

Комментарий недоступен

4
Ответить

Это немного другая визуальная новелла=) Но аниме девочек можно добавить и сюда

Ответить

Комментарий недоступен

3
Ответить

Надо было это в экселе написать)

Ответить

Комментарий недоступен

2
Ответить

Рад что вы побороли, даже если от части, просадки отрисовки.
Вспоминая свои самые первые потуги в играх, где на java собирал очень примитивно по старым книгам, там был такой момент отрисовка и хранения предыдущего кадра. Возможно, вы думали о таком, но озвучу.
Есть сетка, массив пикселей, и перед отрисовкой проверять предыдущий кадр с следующим. Помечая в следующем только те пиксели, которые нужно перерисовать. Заполняя массив предыдущего кадра текущим. Чтобы меньше было обращений к таблице в Excel. Такой себе промежуточный рендер пикселей.

1
Ответить

Спасибо вдвойне! Потому что я попробовал реализовать эту идею, и производительность выросла неплохо. 12 FPS теперь держит стабильно без просадок=) Но если ограничивать выше, то сильно скачет от 12 до 30, и играть не очень приятно становится.

1
Ответить