нелегкие времена настают... надо работать продуктивнее, качественнее и активнее - это несомненно. сейчас думаю над многими аспектами игры: звуки, музыка, история, сеттинг, система хинтов, уровни, сложность объектов, направленность головоломок и т.д... графика сейчас довольно здоровская! мне нравится! нужно думать над всем остальным... а главное - делать! иногда замечаю, что отвлекаюсь на разное, уделяя мало времени игре... надо исправляться! сделано немного, но все же:
- теперь добавлять текстуру для использования можно непосредственно из скриптов. чаще использую так: подгружаю текстуру хинта или растений в инициализационной части; отрисовываю как неигровой объект; скрываю, когда необходимо; уничтожаю материал в деструктор-скрипте уровня.
- сделал нормальную загрузку профиля из внешнего файла. пока ничего серьезного там нет: имя игрока, громкость звуков и музыки, использовать ли Vbo (встретил ошибку на ноутбуке при включенном vbo), видна ли дебаг-информация.
- добавил возможность объявлять тела сенсорами; почти сразу добавил луч, при пересечении которого, запускается скрипт.
- добавил возможность фильтрации столкновений (стандартная фича Box2d)... где использовать - уже придумал, но физические объекты под задумку еще не готовы.
- из скрипта доступны теперь координаты курсора мыши - проверил на хинтах, привязанных к области уровня, все работает. подсказка появляется и пропадает когда нужно.
- появился объект-индикатор, вроде лампочки, меняющей свой цвет при различных событиях.
- добавили множество физических и графических объектов.
- вылепил два уровня, на которые, в принципе, можно ровняться в будущем.
- общий рефакторинг с уклоном в графическую часть... осталось подумать над вплетением vbo-объектов в общую иерархию...
- и самое большое изменение в логике программы... теперь рендер всех объектов ведется вручную! да-да! создается TGLDirectOpenGl, в событии OnRender() которого, мы пробегаем по всем объектам и вызываем Render() для каждого, предварительно вызвав PrepareBeforeRender(). зачем столько мороки? все пошло оттого, что каждый графический объект всего лишь ссылается на материал из библиотеки материалов. возникает проблема с объектами, которые что-то изменяют в своих материалах. к примеру, объект "дым" меняет текстурные координаты материала, примененного к обыкновенному спрайту. также имеются всякие индикаторы и прочая нечисть, которая изменяет текстурные координаты, прозрачность или цвет материала. выходов (как я понимаю) два - либо иметь уникальный материал для каждого объекта (при этом дублировать текстуру в памяти), либо выставлять параметры у материала перед рендером каждого объекта. я выбрал второй вариант - так, казалось бы, появляется некоторая свобода в действиях при минимальной затрате памяти (что произойдет с фпс - отдельная история). но стандартный рендер объектов в GlScene довольно стеснительная операция, не позволяющая "влезания" извне. можно, конечно, произвести наследование от сценовских объектов, и перекрыть Render(), или даже линковать события что-то вроде OnBeforeRender(), но, как я уже описал, я поступил иначе... проблем оказалось несколько: внутри моего списка граф. объектов ни коим образом не учитывается последовательность для рендера (последний объект в списке граф. объектов мог замечательно рендериться посередине всех объектов, так как GlScene хранит свое дерево для рендера). но теперь я завел еще один список для дочерних объектов, чтобы соблюсти порядок вызова Render() у объектов. звучит зловеще, но суть простая: необходимо отрисовывать объекты в нужном порядке: фон, задние объекты, базовые объекты, сочленения, передние объекты, ближние "украшательные" (листочки, пылинки, паутинки, спец.эффекты и другое) части.
уф... приближается dead-line, установленный мною когда-то давно, жестко не успеваем...
0 коммент.:
Отправить комментарий