воскресенье, 28 апреля 2013 г.

Cone-код или чудеса оТПимизации.

Кодю генератор растительности. Собственно, сам генератор уже готов - теперь занимаюсь тем, чтобы мне не пришлось вручную указывать, какие модели грузить из архива. Они грузятся все :D

std::map< std::string, std::vector< Node*> >assets;

Bundle *b = Bundle::create( "res/assets/tree.gpb" );
_loader = b->loadScene();
for ( ; _loader->getFirstNode() != NULL; )
{
     Node* asset = _loader->getFirstNode();
     _scene->addNode(asset);
     asset->getModel()->setMaterial("res/anim.material");
     Animation* an = asset->getAnimation();
     AnimationClip* cl = an->createClip("idle", 0, an->getDuration() );
     cl->setSpeed(1);
     cl->setRepeatCount(0);
     cl->play();
     assets["trees"].push_back(asset);
}
_loader->release();
SAFE_RELEASE(b);

for (size_t i = 0; i < dots.size(); i++)
{
     dots[i].ID = rand() % assets["trees"].size();
}

Cхемка простейшая, но через полгода едва ли я смогу объяснить, как она работает, поэтому сейчас расскажу :D

В игре есть две сцены - _scene и _loader. Одна отвечает за отрисовку, а другая только за загрузку дополнительных ресурсов. А всё потому, что в этом движке невозможно заранее узнать, какие именно объекты хранятся в архиве, поэтому ресурсы из архивов я гружу целиком в _loader.

Открывается файл "tree.gpb" со скелетными моделями, из него все ресурсы грузятся во временную сцену _loader, а дальше начинается МАГИЯ. Если из сцены _loader добавить объект в сцену _scene, то из _loader он попросту удалится - поэтому цикл for организован таким странным образом (скорее всего лучше было бы обойтись while do).

Node* asset - это указатель на внутриигровой объект, у которого есть матрица трансформации, модель, материал, физический объект, источник звука и эмиттер системы частиц (аналог DummyCube из GLScene). Этому объектику в качестве мамы указываем совсем не родную сцену _scene, тем самым уменьшая счетчик объектов в сцене _loader.
Присваиваем модели объекта asset материал "aim.material", чтобы заработала скелетная анимация, рассчитываемая на GPU. Создаем анимационный клип длиной со всю анимацию, устанавливаем ему скорость, зацикливаем и запускаем.

А дальше - мое маленькое чудо (в любое другое время я вряд ли бы стал юзать такую страшную, но ужасно удобную конструкцию) - есть мап assets, в котором сразу же создастся раздел "trees", хранящий в себе вектор указателей на игровые объекты. В этот вектор и добавится наш объект.

Зачем это нужно: вместо того, чтобы создавать тысячу разных векторов под всякие нужды (для моделей персонажей, деревьев, предметов, других объектов), я аккуратно запаковал всё это дело в подобие словаря, где я могу обратиться к нужной странице ("tree") и отрисовать определенный объект ( assets["tree"][dots[i].ID]->getModel()->draw() ).

Днем таким же макаром буду запаковывать модели из другого архива в раздел "actors".

четверг, 4 апреля 2013 г.

VoxelRobbers кусочек №6

Ихха! Я наконец-то исправил текстурные координаты на человечке, и теперь могу со спокойной душой запекать анимацию бега в пак!
Довольный спецназовец бежит на месте, надеясь однажды добежать до финиша :D

Подумываю о зашивании кучи текстур персонажей в один большой атлас, чтобы быстрее между ними переключаться, ибо грузить кучу почти что одинаковых текстурок 32х32 - это тоже не очень хорошо.

На повестке дня стоят создание пары пушек, шапок, еще парочки однокадровых анимаций и... затекстуривание горящего такси с медведем :D

вторник, 2 апреля 2013 г.

VoxelRobbers кусочек №5

Хае, товарищи!
Я наконец-то защитил диплом и могу с новой силой творить этих чудесных мелких человечков! =)

Пока что изменений очень мало - я готовлю базовый контент для сборки первой демки.
Похоже, что придется переделать автомобильчики и сделать в них интерьер, ведь персонажики должны будут высовываться из кабины, чтобы вести огонь...

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

Вы мне вот что скажите: достаточно ли вам будет увидеть анимированных человечков, бегущих по скроллящейся дороге от полицейских машин, чтобы представить себе, как будет выглядеть окончательный геймплей или же вам больше интересно самим потыкать кнопочки в абсолютно сырой и неиграбельной демке?

пятница, 28 декабря 2012 г.

VoxelRobbers кусочек №4

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

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

Все путем =)

четверг, 27 декабря 2012 г.

VoxelRobbers кусочек №3

Вчера вместо того чтобы мучиться с аккумулятором, попросту заменил свечи в двигателе и завел машину даже при еле живом стартере)) Затем три часа простоял в пробках, но все-таки успешно добрался домой почти без приключений) Почти - потому что прямо передо мной огромный черный грузовик с прицепом и не работающими задними фарами влетел в отбойник - я еле успел перестроиться в другой ряд, чтобы не задеть его.. как-то так..)

Теперь по делу: вчера в ленивом темпе сделал кусочек дороги с 3 текстурами, канистру, отбойник (пока не затекстурировал); сегодня замоделил и затекстурил полицейскую патрульную машину и нарисовал текстурку для копа. В итоге получилось так:
Модификатор Unwrap UVW ведет себя крайне странно, если текстурировать только половинку модели - он отправляет одну вершину в бесконечность в левый верхний угол, из-за чего при попытке передвинуть любой кусочек развертки макс зависает секунд на 30.. Решил эту проблемку выделением всей модели и применением Unfold Mapping, ну и затем отзеркалил и склеил обе части модели воедино.

Самый минимальный базовый контент почти готов... остается собрать тротуар, какой-нибудь заборчик или здание для заднего фона, затекстурить отбойник, сделать пару шапок (как минимум - полицейскую фуражку), пару пушек (или как минимум - полицейскую дубинку), и можно будет собирать демосценку с бесконечными бандитами и копами... Пока всё позитивно)

Нашел для себя старый, но удобный способ выбора палитры, чтобы текстурировать игровые объекты: беру фотографию интересующего меня объекта, уменьшаю ее до предполагаемых размеров объекта и получаю палитру :D затем просто рисую объект с нуля, используя только что полученные цвета - это очень удобно, так как не приходится самому постоянно копаться в настройках цвета, чтобы выбрать нужный.

вторник, 25 декабря 2012 г.

VoxelRobbers кусочек №2

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

Текстура человечков универсальна. Изменяя ее, можно создавать любые костюмы.

Далее на повестке дня будет создание полицейского автомобиля, нескольких головных уборов(полицейске фуражка и шлем, шлем футболиста - не скажу, для чего, но он будет очень важен :P).

Затем, когда сделаю кусочек дороги, я запрограммирую мокап, где будут ехать пара машинок и бежать несколько человечков. В таком виде дам его посмотреть всем желающим - чтобы стало ясно, как я себе представляю игровую механику.

понедельник, 24 декабря 2012 г.

VoxelRobbers

Давненько я тут ничего не писал...
Живу хорошо, перебрался на работу в Москву, попробовал фрилансить в свободное от работы время - все ок)

Но сейчас о сабже:
Играя на андроиде в игры с потенциально бесконечным геймплеем, где надо до бесконечности прокачивать персонажа, чтобы он двигался вперед, у меня возникло желание сделать подобную игрулю самому. Примеры: Beach Buggy Blitz, Berzerk Ball 2 и др.

Суть:
Есть персонаж игрока, который задумал ограбить банк и сбежать за границу.
Вроде все просто, НО... У него нет ни оружия, ни автомобиля, ни гроша в кармане, чтобы купить себе хоть что-нибудь... Значит первым делом он будет грабить фургон мороженщика =))
Потихоньку накопит на оружие, чтобы разом получать больше денег; купит рюкзак, чтобы нести больше денег; накопит на автомобиль со свалки, чтобы уезжать от бегущих следом копов; наймет себе единомышленников и отправится грабить банк.




Тут-то и начнется самое интересное:
Копы пересаживаются на мотоциклы и автомобили. Попутные и встречные автомобили мешают уходить от погони. По тротуарам в панике разбегаются люди (я очень надеюсь их сделать). Копы вызывают подкрепление, вслед за копами подоспевает мафия - итальянская на скутере, развозящем пиццу, русская - на Лада-Позора, британская - на автобусе дабл-декере, а в финале - .... не скажу :D

Пока что готовлю базовый контент. Готова анимация бега персонажа, пара вариантов костюмов и пара автомобилей...

Я особо не тороплюсь, но надеюсь до апреля сделать работоспособный прототип.