Итак, очередное обновление, в котором вы можете наблюдать новое здание - Разделитель. Кроме того, вы можете узнать первое название игры, пока рабочее, но перспективное, а также узнать о прочих мелочах, имевших место во время разработки.
Начнем непосредственно с видеодемонстрации.
Теперь по пунктам:
- Добавлен Разделитель - здание, делящее луч на два (после апгреда - три) луча, деля интенсивность изначального луча между ними. Лучи всегда под одинаковым углом (иначе реализация сильно бы осложнилась).
- Игре наконец-то подобрано название. Оно еще не окончательное, но шанс, что к концу разработки оно поменяется, очень мал. Отныне игра носит название Refraction. Прошу любить и жаловать.
- Появилась возможность приближать и отдалять камеру. При чем, чувствительность перемещения камеры меняется непосредственно с расстоянием.
- Заменен интерфейс, правда, теперь он состоит из одного курсора и отладочного текста. Тем не менее, именно к нему я буду лепить необходимые элементы.
- Значительно переработан базовый код башен, в ходе чего устранен серьезный баг, не замеченный мною ранее.
Технические подробности
Решенные проблемы
- Именно об этом баге я упоминал в последнем пункте описания нововведений. Вот в чем полагалась суть бага. При повороте башни для луча рассчитывалось положение выходного луча, а также то, попал ли он в какой-то объект или нет. Сюда входила и ситуация, попадает ли луч на другую башню или нет. Раньше я как проверял - если в кого-то попал, значит, просчитать влияние на этот объект отдельной функцией (сюда входило обновление информации о питающем луче башни, в которую луч непосредственно попадал), если не попал - проверяем, питал ли он перед этим какую-то башню, и если питал, то сделать так, чтобы он ее не питал. На деле же оказалось, что такое условие пропускает ситуацию, когда луч перескакивает с одной башни на другую. В итоге, если луч попадал с одной башни на другую, срабатывало условие "луч в кого-то попал", и этот луч все равно считался питающим для первой башни, пусть уже и не попадал в нее. Когда же, после длительного дебага я понял в чем проблема, она была решена довольно просто. Вместо связки "если-иначе" теперь используются два условия "если". Первое срабатывает, если луч ни с чем не столкнулся, или же столкнулся с объектом, не являющимся башней, которую он питал, и таком случае, в этой башни обнуляется питающий луч. А вот уже второе проверяет непосредственно сам объект, с которым столкнулся луч, и запускает влияние на этот объект.
Больше багов, по сути, нет. Проблемы же нерешенные пока не изменились, поэтому их я писать не буду.
Лирическое отступление
Небольшой совет для программистов игр, да и вообще для программистов. Никогда не ориентируйте свой код на одну задачу. Иначе рискуете делать куда больше работы, чем нужно.
Вот на моем примере. Базовые функции башни - добавление, удаление, просчет столкновения луча - были рассчитаны исключительно на переменную выходного луча, которая, по идее, есть во всех башнях. В итоге, когда речь зашла о Разделителе, который по определению должен работать с несколькими выходными лучами, эта одиночная переменная оказалась ни к чему, и мне пришлось бы для конкретно этого здания переписывать уже существующий код с учетом трех лучей. Но вместо этого, я просто поменял код базовой башни, заставив большинство функций принимать параметры вместо доступа к глобальной переменной. В итоге, код Разделителя состоит из функции расчета выходных лучей (которая, по сути, индивидуальная для каждой башни, ибо именно она играет определяющую роль), и перегруженной функции обновления положения лучей, в которой вместо одного вызова функции просчета луча, эта функция вызывается трижды. Также переработка кода, думаю, серьезно облегчит мне работу над следующей башней.
Ну что же, теперь я буду приниматься за следующую башню, которая будет соединять несколько лучей в один. А пока жду ваших отзывов.
Правда на этой идеи все и кончилось )