Sigel Tutorial 1. Свой Crimsoland.
Вложений: 6
писать буду в несколько заходов.
приветствуется критика и вопросы. Описание статьи и «игры»: Разработка игры на Sigel. На примере небольшой 2д стрелялки. Аля свой crimsoland на С++ и Sigel. Будут рассматриваться сам язык С++ (вкратце, предполагаю что читатель уже слышал о таком и писал что то стоящее на каком нибудь другом), движок Sigel (архитектура, основы, нюансы), немного glsl (шейдеры). Сама игра будет предельно проста, но все же в меру технологична (освещение на шейдерах, запеченная в текстуру кровища, MRT и отложенное освещение). Будем в ней бегать и стрелять. Вид сверху. 2д. Освещаться будет зона вокруг игрока, и будет свет от пуль, возможно еще какие нибудь «светлячки». Но в целом мир будет темным. Поэтому освещение будет отложенным (т.е сначала формируем screen-space текстуры с диффуз-картой и нормал-картой и потом уже освещаем). Также будут «моря крови», естественно с записью в текстуру. Игрок будет спрайтом, свет тоже будет спрайтом, и враги будут спрайтом, и пули :) Также будут звуки и музыка. Меню не будет (не думаю что с этим могут возникнуть сложности). Также будет синхронизация по времени (delta time). Далеко не все в туториале сделано оптимально. Часто можно былобы сделать попроще или побыстрее, но так как цель этого туториала показать движек. То и решаются задачи по разному. Немного терминологии движка: Entity (ентити) — некий абстрактный объект. Обладает ориентацией и позицией в пространстве. Можно к нему прикреплять текстуры, шейдеры и прочую муть. Surface (сюрфейс) — некая сетка геометрии. Рендерится за один батч (дип), с настройками объекта. Ну, с описанием покончено, перейдем собственно к уроку. Предполагаю что MSVS 2005, Sigel и драйвера уже установлены и настроены. Создаем новый проект: Вложение 5718 выбираем тип проекта — SigelApp, и вводим имя проекта (я его назвал в честь игрушки _Ish, написанной еще на блице). Вложение 5719 Далее, выбираем какие компоненты будут использоваться. Я решил что будут использоваться Devil и bass. Первый — для загрузки разных форматов текстур. (в первую очередь — ради png, его ядро движка не держит на данный момент). Второй — для звука и музыки. Физика, скрипты и сеть не нужны для данной игры. Да и не сделаны они еще на должном уровне. Вложение 5720 После нажатия на Finish, мастер сам создаст и скопирует нужные файлы, и простым щелчком на исходнике — мы переходим к его редактированию: Вложение 5721 В итоге у нас получается исходник: Код:
#define SIGEL_USE_ONLY Убираем отсюда все что связано с CameraHelper (ch). CameraHelper – это специальный объект, которым можно управлять с мыши и клавиатуры, он бывает полезен для отладки сцен, а камеру создавать и писать управление ею — лениво. Создаем свою камеру. Тут важно заметить, что объекты в сижеле могут быть двух типов — сами объекты и так называемые «инструменты». Если первые могут иметь позицию, шейдер, цвет, текстуру и т.д., то вторые всего этого не имеют, но у них есть ссылка на так называемые entity-hoster. Как правило это пивот. Но это не обязательно. Например для зеркал это обычно сюрфейс. Код:
Camera *eye = new Camera(); Объявим entity игрока. Этот объект явно будет много где еще использоваться, поэтому он должен быть глобальным. т.е. Объявлен до точки вход sGAME по умолчанию. Проще всего объявить так: Entity *player = 0; Заметьте, сам объект мы будем создавать уже после инициализации! Сам игрок будет квадом. Впрочем много чего будет квадами, пожалуй даже все. Пишем до sGAME: Код:
Surface *bb = 0; Код:
bb = new Surface(); Для этого надо создать квад, загрузить текстуру, создать entity и затекстурить его. Вообще надо четко разделять геометрию и ее представление. Все это — сюрфейсы, террайны, биллбоарды и партикловые системы — это геометрия, которая рендерится каким то особым способом. Вот например куб — это сюрфейс из 12 трисов и 24 вершин. У нас может быть 1000 таких кубов. Это будет тысяча entity, но только один сюрфейс, который, тем ни менее, будет рендерится 1000 раз за кадр. Но в разных позициях, с разными материалами и шейдерами. Создаем сюрфейс, грузим текстуру и создаем ентити. Код:
Surface *sfloor = new Surface(); Код:
player -> Position(128.0f,0.5f,128.0f); //ставим игрока на середину. (чуть выше земли). Код:
cam->Position(player); \\ставит камеру в позицию игрока Код:
#define SIGEL_USE_ONLY Вложение 5723 Следующим шагом загрузим текстуры игрока и курсора, также заставим игрока двигаться и поворачиваться в сторону курсора. Для перемещения придется ввести dt. Это переменная тоже должна быть глобальной, значит надо ее объявить где? Правильно, в начале (не в функции точки входа по крайней мере). Узнать текущее время кадра можно функцией GetFrameTime(). float dt = 0; в цикле: Код:
ft = GetFrameTime(); Код:
Texture *playerdiffus[19]; Так в нашем случае Texture *playerdiffus[19]; - это массив из 19 указателей на текстуры. Заметьте — что индексация происходит в ранге 0..18. т.е. На 1 меньше. Циклы for имеют следующий синтаксис — у них есть три выражения, они разделены точкой с запятой. Первое — инициализация, второе — условие ПОВТОРЕНИЯ, последнее — что делать с переменной. sprintf_s – эта команда пишет в массив char-ов некую строку. Сама строка задается третьим параметром, вторым идет макс число элементов в массиве. В этой строке "media/solider/%d.png", %d заменяется на следующий параметр (целочисленный), так например %s для строки, а %f для float. Также нам нужны будут переменные для текущего кадра и флаг движется игрок или нет — чтобы его анимировать. Конечно, игрока нужно затекстурить: Код:
int move = 0; Код:
move = 0; Потом просто перемещаем наш объект. Translate перемещает объект не обращая внимание на его направление, в отличие от Move. С анимцией тоже не сложно. Просто прибавляем к кадру некую цифру помноженную на dt (я ее вывел методом проб и ошибок )) ) Если кадр выходит за максимальный, то мы просто отнимаем от него это число. Это нужно, чтобы анимация выглядела более плавной. Ну и прикрепляем текстуру с нужным индексом. Код:
float a = atan2f((float)((ScreenWidth()/2)-MouseX()),(float)((ScreenHeight()/2)-MouseY())); Заметьте в Sigel-е углы задаются в градусах, а с++ считает в радианах. Поэтому надо домножить на (180 / pi) — примерно 57.1f. Кстати, f на конце числа означает что это число float, а если оно не указано, то компилятор считает что ето double. Так как все расчеты внутри движка ведутся в float-то и в игре удобно оперировать ими. Грузим курсор в картинку. Код:
Image *cur = new Image(“media/cur.jpg”); Код:
Blend(BM_ADD); ну и наконец — последний стришок — прячем стандартный курсор. HidePointer(), незабываем его показать при выходе из программы — ShowPointer(): вот такой исходник: Код:
#define SIGEL_USE_ONLY Вложение 5724 скачать исходник и "игру" можно тут: http://rghost.ru/177603 |
Ответ: Sigel Tutorial 1. Свой Crimsoland.
Вложений: 1
теперь научим нашего игрока стрелять. Для этого надо описать класс пули. Какие должны быть данные у пули? Как она должна обновляться? Все это нужно описать в структуре класса и его методах. Кроме самой пули еще нужны впсышки от выстрелов. По хорошему надо бы реализацию классов и их описание писать в разных .cpp и .h файлах, но мне влом. Тем более они будут сильно завязаны как друг на друге, так и на игроке (глобальная переменная, не забыли? :) )
кроме того, нужны будут глобальные переменные для спрайта вспышки выстрела и его текстуры, и текстуры пули. Пишем: Код:
Billboard *bspark; Код:
typedef std::list<Bullet*> TBList; Конструктор Bullet: Код:
Bullet::Bullet() Кроме того, на месте пули создаем вспышку. И собственно добавляем созданный экземпляр в список. this – это указатель на текущий (создаваемый объект). Деструктор пули: Код:
Bullet::~Bullet() Функция обновления пули (она должна иметь именно такой формат): Код:
void Bullet::Update() Конструктор Flash: Код:
Flash::Flash(Entity *asent) Деструктор Flash аналогичен деструктору Bullet. Метод обновления даже проще: Код:
void Flash::Update() Код:
bspark = new Billboard(1.0f); Ну и грузим две текстуры. Ничего сложного ;) до главного цикла объявили переменную float – fire. Код:
if(MouseDown(1)) Если ствол остыл (fire<1) то можно стрелять. Поэтому создаем новую пулю, не волнуйтесь, она не засрет память, даже если мы и теряем ее указатель, так как в списке она осталась, и будет корректо почищена. Ствол остывает - fire = max_(0,fire-dt); следующие две строчки очень интересны. Они запускают обновление элементов в списке. Он отличается от std::for_each тем, что в нем элементы во время обновления могут удалить сами себя. А в for_each теряется итератор. AnimUpdate – обновляет все анимированные объекты. Параметр — это twin. Исходник: Код:
#define SIGEL_USE_ONLY Вложение 5725 |
Ответ: Sigel Tutorial 1. Свой Crimsoland.
Вложений: 1
последняя версия исходника, описание как делалось / делать выложу вечером.
Код:
#define SIGEL_USE_ONLY Дальше будет в основном только украшение (враги-невидимки, свет от пуль, кровища, бамп/спекуляр на земле и т.д.) "игра" и исходники: ttp://rghost.ru/177734 скрин: Вложение 5726 |
Ответ: Sigel Tutorial 1. Свой Crimsoland.
Хм, мб у меня с видеодравом что-то не так, мб комп тупой, мб из-за висты, но при запуске проекта - такой эффект красивый, как буд-то flip'а нету, а картинку фона провели слева направо и остаолся тако эффект, и что-то там видно на ней, но все равно. а при принтскрине монитор вообще погас, и затем видодрайв восстановился, но игра уже была в отключке.
|
Ответ: Sigel Tutorial 1. Свой Crimsoland.
Данил
кинь плиз sigel.log. |
Ответ: Sigel Tutorial 1. Свой Crimsoland.
запустил еще раз - этого бага не заметил.
мб из-за какого-то приложения, запущенного... |
Ответ: Sigel Tutorial 1. Свой Crimsoland.
|
Ответ: Sigel Tutorial 1. Свой Crimsoland.
|
Ответ: Sigel Tutorial 1. Свой Crimsoland.
HolyDel
Поздравляю, растешь! |
Ответ: Sigel Tutorial 1. Свой Crimsoland.
у меня тоже не запускается =\\ черный экран и все
|
Ответ: Sigel Tutorial 1. Свой Crimsoland.
Aceton, дай мне sigel.log пожалуйста.
|
Ответ: Sigel Tutorial 1. Свой Crimsoland.
Вложений: 1
лови Вложение 5742
|
Ответ: Sigel Tutorial 1. Свой Crimsoland.
Aceton
не должно же быть черного экрана. должно же все вылететь нафиг. это глюк в драйверах судя по всему. в новой версии его исправили. |
Ответ: Sigel Tutorial 1. Свой Crimsoland.
оно еще открывает вижал студио и просит выбрать тип дебугера
|
Ответ: Sigel Tutorial 1. Свой Crimsoland.
Вложений: 1
Вложение 5749
Aceton, проверь эту версию плиз: http://rghost.ru/180172 кстати, тут уже можно набрать очки и проиграть)) управление WASD + мыш(3 кнопки) вот ее исходник: Код:
#define SIGEL_USE_ONLY //указываем что движек будет юзаться не весь |
Часовой пояс GMT +4, время: 19:32. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot