Направленность: 2D игры (Визуальные новеллы, разного рода rpg и квесты). Платформа: Windows (Пока хватит и одной.) Язык программирования: C/C++ Открытый исходный код: нет, только для ограниченного круга лиц. API: OpenGL. Дата начала работ: 28.01.13 Последняя версия: 0.3.4b
Планируется: Система частиц. Реализовать простой GUI. Лог: Обработка ошибок и запись в файл лога. Шейдеры. Редактор карт.
Что уже готово: Инициализация окна средствами GLFW, полноэкранный\оконный режимы. Загрузка картинок и отрисовка спрайтов, поддерживаемые форматы - (BMP, JPEG, PNG, TGA). Приведение текстур размеру кратному степени двойки (для старых видеокарт). Загрузка TrueType шрифтов, вывод текста. Структуры для работы с вершинами и четырехугольниками (аналог RECT). Менеджер сортировки, загрузки\отрисовки спрайтов в VBO. Трансформация сцены. Система ввода. Работа с файлами.
Основные функции:
void InitWindow(int width, int height, char *title, int screen); // Инициализация окна. int MainLoop(); // Переключает буферы.
void View(int x, int y, float rot, float sw, float sh); // Трансформация сцены.
int Keyboard(int key); // Проверяет нажата ли клавиша, если да, возвращает истину если всегда. int KeyboardLock(int key); // Проверяет нажата ли клавиша, если да, возвращает истину только один раз.
int MouseClick(int key); // Проверяет нажата ли кнопка мыши. void MouseCoord(int &xpos, int &ypos); // Записывает в аргументы позицию мыши.
void Shutdown(); // Освобождает движок.
Класс Image
Методы:
Image(const char *file); // Конструктор. bool LoadFromFile(const char *file); // Загрузка текстуры из файла. bool LoadFromMemory(void *byte, int w, int h, int bbp); // Загрузка текстуры из памяти.
Использование: Image *img; img = new Image("Source/src_01.png");
Класс Sprite
Методы: Sprite(const Image &img); // Конструктор
void Draw2D(int x, int y); // Рисование спрайта с размерами загруженной картинки. void Draw2DEx(int x, int y, const NGRect &rc); // Рисование спрайта, с указанным регионом на картинке.
void SetRect(const SERect &rc); // Растягивание спрайта. void SetColor(float r, float g, float b, float a = 1.0f); // Установить цвет для вершин.
Использование: Sprite *spr; spr = new Sprite(*img); // Принимает загруженную картинку, и создает спрайт с размерами картинки.
spr->Draw2DEx(0, 0, SERect(0, 0, 32, 32));
Класс Animation
Методы: Animation(const Image &img, int w, int h); // Конструктор, принимает картинку и размеры одного кадра анимации.
void DrawA2D(int x, int y); // Рисует и обновляет анимацию.
void SetUpdate(float delay); // Устанавливает задержку. Изначально задержка равна одной секунде (1000). void SetRect(const SERect &rc); // Увеличивает/уменьшает реальный размер спрайта. void SetRegion(const SERect &rc); // Устанавливает область на картинке и расчитывает кадры на ней. (Изначально расчитывается из всей картинки.) void SetFrame(int frame); // Устанавливает кадр анимации, отсчет идет с 1. Если была выделена область, кадры расчитываются из этой области игнорируя остальную часть.
int GetFrame(); // Возвращает текущий кадр анимации.
Использование: Animation *ani; ani = new Animation(*img, 16, 32);
ani->DrawA2D(x, y);
Класс Font:
Методы: Font(const char *filename, int size_fnt); // Загрузка из файла.
void Print(const char *text, int x, int y); // Рисует текст. void SetColor(int r, int g, int b); // Устанавливает цвет.
Использование: Font *fnt;
fnt = new Font("verdana.ttf", 15); fnt->Print("Hello World.", 100, 100);
Сообщение отредактировал Lord_Zeon - Суббота, 23 Февраля 2013, 08:17
Для начала что нужно реализовать: Инициализация окна, что лучше использовать для этого? Кроссплатформенный FreeGlut как вариант, или все же писать свою обертку под winapi? Инициализация OpenGL. Если брать глут то это отпадает.
Я считаю, что лучше написать свою обертку, так как это может облегчить жизнь если надо будет что-то изменить в инициализации окна, не придется разбираться с чужим кодом. Управление таймером, перерисовкой и другими сообщениями будет своё.
Цитата (Lord_Zeon)
Реализовать вывод текста: Пока склоняюсь к стандартным функциям. Как можно другими способами?
Обычно шрифты делают через загрузку подготовленного изображения с символами, а текст выводят выбором символа по текстурным координатам.
Заметка по архитектуре: Если память выделяется в процедуре, то лучше сделать освобождение памяти текстуры тоже отдельной процедурой:
Lightsoft, С освобождением текстуры были мысли, но проект так или иначе был остановлен, в новом можно будет обойтись и без выделения памяти (Использование без указателей).
Как быть с загрузкой шрифтов из файлов? Что представляет из себя ttf?
Иногда взять чужое легче чем писать самому, все таки глут кроссплатформенный, пока буду использовать его, а позже если что можно переписать.
нафиг свою обертку писать, смысла нету практически, особенно для игр, тупо окно и работа с устройствами ввода/вывода, есть хорошая библиотека SDL можно прикрутить как OpenGL так и DirectX, есть еще GLFW для OpenGL хорошо тоже подходит, а вот glut не советю использовать, там даже unicode не поддерживается. для работы с ttf можно так же исопльзовать SDL но лучше взять FTGL очень удобная вещица, работает через FreeType, так что он тоже пригодится. ttf - это обычнй файл шрифтов.
нафиг свою обертку писать, смысла нету практически, особенно для игр, тупо окно и работа с устройствами ввода/вывода, есть хорошая библиотека SDL
С этим я с тобой не согласен, взяв даже тот же самый SDL как раз таки придется писать обертку. Тут всего навсего у меня больше свободы. Посмотрю GLFW. Спасибо за ответы.
Сообщение отредактировал Lord_Zeon - Вторник, 05 Февраля 2013, 18:08
dima9595, Об этом рано думать, для начала просто графический движок, потом можно прикрутить скриптовый язык, и сделать WYSIWYG редактор
Xakep, Глянул документацию GLFW, неплохая вещь, потестировал, не понравился только процесс создания окна. Переписал пару строк в исходнике, теперь отлично с окном.
Сообщение отредактировал Lord_Zeon - Вторник, 05 Февраля 2013, 14:05
AGENTX001, Спрашивалось не составляющие движка, а на что будет похоже. По моему ты путаешь игровой движок с графическим, у меня нет в планах писать компоненты входящие в игровой движок, я пишу только графическую часть.
Тема собственно нужна, чтобы в процессе создания можно было сразу исправить ошибки, последовать чьему-то совету.
Цитата (AGENTX001)
Могу загрузить и нарисовать текстуру на OpenGL != могу "пойти делать игры".
Lord_Zeon, ну-ну. Вперед. Два класса, с двумя методами - гуд граф. двиг! Даже анимацию не удосужился сделать.
Цитата (AGENTX001)
у меня нет в планах писать компоненты входящие в игровой движок, я пишу только графическую часть.
Цитата (Lord_Zeon)
потом можно прикрутить скриптовый язык, и сделать WYSIWYG редактор
Цитата (Lord_Zeon)
Тема собственно нужна, чтобы в процессе создания можно было сразу исправить ошибки, последовать чьему-то совету.
У тебя есть ошибки? Ты нуждаешься в совете? Вот когда будет более-менее полноценная либа, тогда бы тему и создал. Жутко бесят пустословые темы о создании "движка".
AGENTX001, Все с тобой ясно, читаешь ты через строчку. Такие посты как у тебя придают мне уверенности. Я не буду убеждать тебя в чем-то тратя свои силы на пустую болтовню и засорение темы, если ты не хочешь верить в меня, поверят другие.
Сообщение отредактировал Lord_Zeon - Среда, 06 Февраля 2013, 12:29
Lord_Zeon, просто с одной стороны AGENTX001 понять можно... Есть сотни страниц Интернета, десятки тем, где люди пишут, что вот, создам "такой двиг, что блин", со слюнями на монитор Я вот верю, что ты напишешь движок. Но Господа, давайте все же будем к друг-другу более благосклонны И старайся почаще обновлять нулевой пост. Будет свежая информация, будет и народ, и внимание к проекту, и советы P.S. Lord_Zeon, я, кстати, сам велосипедист еще тот тоже) Удачи проекту. Буду следить.
Lord_Zeon, с тобой тоже все понятно... Посмотри вот движок. И вот, например. Разницу чувствуешь? Эти темы были созданы, когда был реализован хоть какой-нибудь функционал. Когда было хоть на что-нибудь посмотреть. А что в твоем случае? Вот ты за эти два дня сделал что-то полезное для движка? Теме две недели, а прогресса - ноль...
Просто хочу чтобы люди видели, что я не сижу просто так, сложа руки и что-то делаю, может это кого-то подтолкнет на создание чего-то, а может кто-то захочет помочь или подскажет советом, для этого как раз таки и была создана тема. Может делать движки это и изобретение велосипедов, но по сей день люди занимаются одним и тем же. Так что не важно чем ты себя займешь в этой жизни, главное что бы это приносило пользу себе и окружающим.
AGENTX001, Любишь приходить на готовенькое? Я ведь написал в шапке темы что идет разработка. Не буду отрицать, что практически не занимался эти две недели движком. Но не забывай про то, что у человека может что-то происходить в жизни.
Обновил нулевой пост.
Добавлено (08.02.2013, 19:30) --------------------------------------------- Обновление (0.2.4): Добавлена анимация, упрощены основные функции. Убрана поддержка смены экранного режима после создания окна (временно).
Сообщение отредактировал Lord_Zeon - Пятница, 08 Февраля 2013, 19:32
2AGENTX001, может для оптимизации, ну Image - это что-то вроде текстуры, и это просто массив который не рендерится, а Sprite это статический объект без какой-либо анимации, а Animation уже с анмацией, естественное с анимацией будет жрать больше памяти и выполнять лишнии команды. Хотя название странное, лучше бы AnimSprite ну или как-то так, хотя может я не правильно понимаю назначение этого объекта))
Image отвечает за загрузку картинки и ее преобразования. Далее по плану она будет загружаться в память с помощью менеджера.
Sprite никак практически не связан с Image и содержит только ид загруженной картинки. Он имеет в себе только информацию о вершинах и дополнительные переменные для расчетов спрайта. (За отрисовку этой информации будет отвечать менеджер).
Animation имеет в себе объект спрайта (агрегация), реализует расчеты кадров, а за отрисовкой обращается к спрайту. Меньше кода, и можно изменять код в спрайте не затрагивая анимацию.
Система партиклов также будет иметь в себе объект спрайта.
Примерно выйдет вот так. Image -> Sprite -> Animation, Particles ...
Обновлен класс анимации, добавлены новые методы. (0.2.5)
Добавлено (14.02.2013, 00:02) --------------------------------------------- Сделал менеджер сортировки и загрузки\отрисовки спрайтов в VBO. (0.3.0) Тест демка анимации тут.
Увеличить объекты - Стрелка вверх. Очистить - Стрелка вниз.
Сообщение отредактировал Lord_Zeon - Четверг, 14 Февраля 2013, 00:06