HCG 2D Engine
| |
Kwant | Дата: Понедельник, 27 Декабря 2010, 20:32 | Сообщение # 1 |
почетный гость
Сейчас нет на сайте
| Build: Unicode Render: DX8 & 9 Input: DI8 Sound: Squall Web/Lan/Internet: Socket Language: C++ Тестировался на OS: Win XP/Vista/7 Среда разработки: MVS 2010 Есть класс по работе с ядром, таймером, вводом, рендером и менеджером ресурсов, сетью/интернетом, изображениями (спрайты, анимационные ленты), шрифтом, INI файлами, StringTable файлами и др. -Возможность аттачить свои классы с функциями Бегин/Енд - действия/события на ввод, степ, рендер -Есть возможность вынести рендер в отдельный поток -Довольно простой в изучение Как может выглядеть класс Объект: Code class Object : public IHCGEventRoot, IHCGEventGraphics { public: VOID BeginStep( DOUBLE Delta, const INPUT_EVENT_INFO& Info, const LPHCGROOT pRoot ) { x += dx * Delta; y += dy * Delta; xscale += dxscale * Delta; yscale += dyscale * Delta; rot += drot * Delta;
if(x > 800 || x < 0.0f) dx = -dx; if(y > 600 || y < 0.0f) dy = -dy; if(xscale > 2.0f || xscale < 0.5f) dxscale = -dxscale; if(yscale > 2.0f || yscale < 0.5f) dyscale = -dyscale; }
VOID EndStep( DOUBLE Delta, const INPUT_EVENT_INFO& Info, const LPHCGROOT pRoot ) { }
VOID BeginDraw( const LPHCGGRAPHICS pGraphics ) { if(pSprite) pSprite->DrawEx(x, y, rot, xscale, yscale); }
VOID EndDraw( const LPHCGGRAPHICS pGraphics ) { }
public: Object( VOID ) { if(g_pHelper) pSprite = g_pHelper->CreateSprite();
x = 0.0f, dx = 0.0f, y = 0.0f, dy = 0.0f; xscale = 1.0f, dxscale = 0.0f, yscale = 1.0f, dyscale = 0.0f; rot = 0.0f, drot = 0.0f; }
~Object( VOID ) { if(g_pHelper) g_pHelper->DestroySprite(pSprite); } public: FLOAT x, dx, y, dy; FLOAT xscale, dxscale, yscale, dyscale; FLOAT rot, drot;
LPHCGSPRITE pSprite; }; Как может выглядеть файл ресурсов: Code <HCG-Resource> <TEXTURE> <!-- Load Texture - Name | Path --> <load name="Name1" path="Graphics/s_hero.dds">0</load> <load name="Name2" path="Graphics/s_airstr.png">1</load> <load name="Name3" path="Graphics/b1id.png">2</load>
<!-- Create Texture - Name | Width | Height --> <create name="Name14" width="200" height="200">13</create> </TEXTURE>
<SURFACE> <!-- Create Surface - Name | Width | Height --> <create name="Surface0" width="333" height="333">0</create> <create name="Surface1" width="254" height="254">1</create> </SURFACE>
<FONT> <!-- Load Font - Name | Path --> <load name="Font0" path="FontID0.fnt">0</load> </FONT>
<SHADER> <!-- Load Font - Name | Path --> <load name="PSO0" type = "ps" class = "object" path="PS0.pso">0</load> <load name="PSH1" type = "ps" class = "asm" path="ps1.psh">1</load> <load name="PS1HLSL" type = "vs" class = "hlsl" function = "Ripple" target = "vs_2_0" path="vs_0.hlsl">3</load> </SHADER> </HCG-Resource>
Пока шаманю еще над многими вещами, но одному все же трудновато на все разорваться ) Линк для скачки: перейти...
Сообщение отредактировал Kwant - Понедельник, 27 Декабря 2010, 21:46 |
|
| |
SanAV | Дата: Понедельник, 27 Декабря 2010, 20:53 | Сообщение # 2 |
Alex Versus
Сейчас нет на сайте
| Движок впечатлил. Посмотрел демку, понравилось. Но запустить собственноручный скомпилированный проект так и не смог, увы.
My Games: · [2D, TDS] Death Embrace.
|
|
| |
Kwant | Дата: Воскресенье, 03 Июля 2011, 21:37 | Сообщение # 3 |
почетный гость
Сейчас нет на сайте
| Хм, странно, давал как то тестировать его и проекты запускались у другого пользователя... Собранный проект в юникоде? Добавлено (29.12.2010, 09:55) --------------------------------------------- Что то я запамятовал кинуть в архив генератор шрифтов... Использовалась программа Bitmap Font Generator v1.12 К следующей сборке дам линк на тулзу (в архив, к движку, пока что класть не буду), если лень искать Добавлено (30.12.2010, 00:05) --------------------------------------------- [ Update ] Скачать: Bitmap Font Generator v1.12 246 Кб Скачать: HCG 2D Engine SDK 1.0 Мб Было исправлено множество ошибок и недочетов, добавлены новые функции. Надо бы днем пошурику накатать пару турторов и небольшую доку, а ща пойду пощемаю на диванчике ) Добавлено (18.01.2011, 00:46) --------------------------------------------- Блин, что то я подтормозил с некоторыми вещами, которые хотел выложить ) Просто в армии немного неудобно кодить ^^ Мм...надо толи осилить что нить, толи до дома подождать х) Добавлено (27.01.2011, 04:59) --------------------------------------------- Такс... Начал клепать турторы и справку, начало пока слабенькое..., но все таки какое то. Также склепал временную страничку, т.к. всему этому делу надо же где то обитать, на протяжение моей службы ) Есть пример по созданию простого окна и созданию менеджера ресурсов с загрузкой ресурса. И есть махонькая "справка", которую буду потихоньку пилить ) Все можно найти тУт. Дальше сделаю примеры по работе со спрайтами, шрифтом, ini файлы, строковый таблицы..м.. ну и т.д. Может появится вопрос, почему я не написал о планах доработки/улучшению двига..., ну, просто.., просто - это армия ) Вернусь домой через 4 мес и проапгрейжу двиг, а пока поиск багов, расширение справки и базы примеров. Добавлено (25.06.2011, 03:34) --------------------------------------------- Йааа дома, епт 8) Хохо, можно браться за дело ^^
Архитектура:
Как видно, взаимодействие с модулями возможно непосредственно через интерфейс в обход Core, по большому счету, эта библиотека нужна для сильного упрощения общения с модулями. При сильном желании, можно любому написать альтернативу библиотеке Core.
Модуль Root содержит в себе элементы по работе с главным окном, менеджером ресурсов, таймером и прочими вспомогательными классами. Из схемы видно, что он также использует модули графики и звука. Например, класс HCGSprite - вызов функции Draw(...).
---
Вообще, я переписал ~30% рендра, пофиксил баги в нескольких модулях, изменил принцип работы некоторых функций вспомогательных классов Анимации и Шрифта, класса по работе с ini файлами. Добавил новые функции по созданию граф устройства, окна - простое, по типу Create() (создать окно и граф устройство) и расширенный вариант, куда передается структура с данными (для окна и граф устройства).
Уже на ~40% навоял класс Частиц. Добавлено (25.06.2011, 15:43) --------------------------------------------- Обновление модулей: Перейти...
Хочется упомянуть, что пока я не поддерживаю разработку рендра DX9, на то есть пока причины.
Забыл в тот раз упомянуть о появление в Root функции, для получения информации о вводе: PINPUT_EVENT_INFO GetInputInfo( VOID ); И в структуру PINPUT_EVENT_INFO добавлена Z координата (колесико) для мыши.
Ща еще работаю над автопатчером, чтобы сам сливал все нужные апдейты/файлы с хоста для обновления движка Добавлено (03.07.2011, 21:37) --------------------------------------------- Так, своял что то, вроде патчера х)) Прошу, посмотрите, если будет на что...оцените минимализм х)
Перейти
Сообщение отредактировал Kwant - Четверг, 27 Января 2011, 21:28 |
|
| |
Demeron | Дата: Воскресенье, 03 Июля 2011, 21:50 | Сообщение # 4 |
User created in C++
Сейчас нет на сайте
| Хм... Как по мне движок стоит внимания. Пересмотрев код, понял, что движок будет не так уж и прост в использовании, но с большым выбором параметров. Единственно, что мне пока что не понравилось, так это 6 dll файлов движка, общим весом меньше метра...
|
|
| |
Kwant | Дата: Вторник, 19 Июля 2011, 21:56 | Сообщение # 5 |
почетный гость
Сейчас нет на сайте
| Thx Но, я как бы стараюсь его постоянно упростить и сохранить гибкость ) Quote Единственно, что мне пока что не понравилось, так это 6 dll файлов движка, общим весом меньше метра... А что я сделаю то ) Ну модульный двиг, суть его в модулях ^_^, поэтому и куча dll`ов Могу в Core.lib запихать код, который позволит загружать dll ки из ресурсов exe`шника )
Code HHCGMODULE LoadDLLFromResource( HINSTANCE hInstance, PTCHAR pName, PTCHAR pType = NULL );
мм, как то так )
Я еще переписал автопатчер, работает получше, нормально качает/докачивает, висит в трее и больше ни где старается не палиться . Выложу новую версию, как подготовлю новый UD движка.
Добавлено (19.07.2011, 21:54) --------------------------------------------- Скоро думаю залить UD, сделал много изменений: добавление функций, классов, изменение работы внутренних механизмов - в общем много изменений, я не осилю все перечислять х) Написал класс для упрощения работы с движком: CGame - Game.h/cpp С ним код может выглядеть как то так: Code #include "../Game.h"
CGame g_oGame; LPHCGSPRITE g_pSprite = NULL;
VOID CALLBACK EvDraw( VOID ) { g_pGraphics->Clear(ARGB(255, 125, 200, 100)); g_pSprite->Draw(100, 100); }
INT WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, INT ) { if(g_oGame.Create()) { if(g_oGame.LoadResource(_TXT("../media/r_file.xml"))) { g_oGame.SetEvent(AE_RENDER, (LPVOID) &EvDraw);
if(g_pSprite = g_oGame.CreateSprite()) { g_pSprite->SetTexture(g_oGame.GetTexture(_TXT("Name1")))
g_oGame.FuckItAll();
g_oGame.DestroySprite(g_pSprite); } }
g_oGame.Destroy(); }
return( 0 ); }
Тут рисуется 1 спрайт, за Вас все уже подключено, объявлено - все само загрузится, выгрузится х) Ну, как бы вот... Все проверки, в коде выше, сохранены, т.е. если чего будет не так: нету длл, нет ресурса, указатель = NULL, все обрабатывается и уж0сающих синих экранов, RT ерроов не будет наблюдаться )
Сообщение отредактировал Kwant - Вторник, 19 Июля 2011, 21:59 |
|
| |
mihas2 | Дата: Вторник, 19 Июля 2011, 22:10 | Сообщение # 6 |
UDK User
Сейчас нет на сайте
| Quote (Kwant) g_oGame.FuckItAll();
|
|
| |
Kwant | Дата: Понедельник, 29 Августа 2011, 16:10 | Сообщение # 7 |
почетный гость
Сейчас нет на сайте
| Охох, ну что же, лето к концу, трудовые будни постепенно начинаются х) Такс, что я тут нового сделал: [+] Добавил: -класс HCGUtil -логи во все модули -различные функции в класс IHCGResourceManager, IHCGRoot, CGame (класс для упрощения взаимодействия с движком) [+] Добавляю на данный момент: -работа с архивами -частицы или гуи писать сюда есть смысл? А то я их добавляю уже стопитцот поколений...они все добавится не могут...
[+] Исправления: -убрано 6 ошибок -изменение работы некоторых классов и функций: IHCGResourceManager, IHCGRoot, IHCGCore
Над модулем сети поработать бы еще - добавить пару чтук, ну и пробую звуковую часть поковырять, пару мыслей есть, но....мысли, они и в Африке мысли ) В целом, по тихоньку дело идет Может я че упустил, забыл...эээ....но пока вот..., что есть - изменения идут: упрощаю, добавляю....кручу верчу запутать хочу =D В общем, числа 2-4, след мес, выложу нарн, т.к. косяки с интернетом у меня...
|
|
| |
Kornival | Дата: Понедельник, 29 Августа 2011, 16:27 | Сообщение # 8 |
The Witcher
Сейчас нет на сайте
| Вопрос тем, кто тестировал двиг: какие впечатления он оставляет по сравнению с WindMill Engine?
|
|
| |
Kwant | Дата: Понедельник, 29 Августа 2011, 16:52 | Сообщение # 9 |
почетный гость
Сейчас нет на сайте
| Ща, то, что на сайте лежит и то, что есть у меня - имеет двольно неплохую разницу ) Если со мной поделятся, одни хорошие люди, интернетом, то я выложу, может, сегодня вечером-ночью, и тогда можно что-то оценивать, эт я так, к слову :3
А сейчас я откланиюсь пожалуй, время Theatre Of Tragedy - Crash/Concrete оО, ДАА!! Чем обрабатывается металл?!! Электрогитарой! \m/>_<\m/
Сообщение отредактировал Kwant - Понедельник, 29 Августа 2011, 16:56 |
|
| |
Kornival | Дата: Понедельник, 29 Августа 2011, 16:59 | Сообщение # 10 |
The Witcher
Сейчас нет на сайте
| Ждем.
|
|
| |
Kwant | Дата: Воскресенье, 11 Сентября 2011, 17:39 | Сообщение # 11 |
почетный гость
Сейчас нет на сайте
| ыЫ, я тут подзадержался немного ) Ну, я скоро, еще чуток ... пару часиков и все х) Доизвращался аж до такого:
Code #include "../Game.h"
VOID CALLBACK EvDraw( LPVOID lpParam ) { GfxClear();
GetSprite(_TXT("Spr_0"))->Draw(100, 100); GetFont(_TXT("Fnt_0"))->Draw(222, 222, TXA_CENTER, _TXT("X-TEXT")); }
INT WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, INT ) { if(Create()) { SetEvent(AE_RENDER, &EvDraw);
AddSprite(_TXT("Spr_0")); AddFont(_TXT("Fnt_0"));
GetSprite(_TXT("Spr_0"))->SetTexture(LoadTexture(_TXT("../media/Hex.png"))); GetFont(_TXT("Fnt_0"))->SetFont(LoadFont(_TXT("../media/FontID0.fnt")));
FuckItAll();
RemoveAllObjects(); Destroy(); }
return( 0 ); }
Это все, что требуется написать, чтобы начать создавать что либо. Вверху загружается изображение, шрифт, и выводятся % )
Конечно это не железный стандарт, тут 3 обертки, которые доступны для чтения/изменения, чем ниже обертка - тем сложнее ) Кароче, тут жопа полная % ) (Не умею я объяснять нарн ^^)
Кхм, в общем, выглядит это так: (3 LvL) Function (2 LvL) CGame / Class : child (1 LvL) HCGControl / Class : parent ----------------------- (0 LvL) HCGEngine
Все сверху, это просто упрощения и все, показательные, но эт не значит, что я их написал от балды ) Нет, просто, кто захочит большего контроля, то может использовать CGame или еще глубже - HCGControl. (блин, это есесные вещи и че я Вам объясняю - на схеме се видно, да? )
Как то так оно в общем...да, и я подза...долбался с этими архивами х) Но поддержка ресурсов в архивах будет...пароли-не пароли там...
Добавлено (31.08.2011, 04:14) --------------------------------------------- А, и в ближайшее время верну рендер DX9 )
Добавлено (11.09.2011, 17:39) --------------------------------------------- Ну, я залил то, что пока есть, не все успел впихнуть, т.к. времени вообще катастрофично не хватает, даже на личную жизнь...начинает казаться, что она у меня где то в области иррационального сейчас %-)
Скачать можно с помощью APE или по ссылке ниже: Перейти...
Там, в архиве, тествовый код есть и 2 файла на которые стоит обратить внимание: HCG[Control].h и Game.h
Сообщение отредактировал Kwant - Воскресенье, 11 Сентября 2011, 17:40 |
|
| |
Rorschach | Дата: Воскресенье, 11 Сентября 2011, 17:41 | Сообщение # 12 |
участник
Сейчас нет на сайте
| Код ужасен.
Never compromise. Not even in the face of Armageddon.
|
|
| |
Kwant | Дата: Воскресенье, 11 Сентября 2011, 17:44 | Сообщение # 13 |
почетный гость
Сейчас нет на сайте
| На вкус и цвет..., лично мне, не особо, что ужасное, видно в этом коде. Ну или прошу поделится широтой вашей мысли А HCG[Control].h и Game.h - лишь показательные.
Сообщение отредактировал Kwant - Воскресенье, 11 Сентября 2011, 17:48 |
|
| |
Rorschach | Дата: Воскресенье, 11 Сентября 2011, 17:51 | Сообщение # 14 |
участник
Сейчас нет на сайте
| Думаю немного критики вам не помешает. Quote (Kwant) На вкус и цвет... Хмм, по-вашему вот это: Code GetSprite(_TXT("Spr_0"))->Draw(100, 100); GetFont(_TXT("Fnt_0"))->Draw(222, 222, TXA_CENTER, _TXT("X-TEXT")); Code GetSprite(_TXT("Spr_0"))->SetTexture(LoadTexture(_TXT("../media/Hex.png"))); GetFont(_TXT("Fnt_0"))->SetFont(LoadFont(_TXT("../media/FontID0.fnt"))); выглядит хорошо? Огромное вам уважение за работу, которую вы делаете, но такие заковыристые конструкции могут отпугнуть большинство новичков. Надеюсь в будущем АПИ предоставляемый движком изменится в лучшую сторону.
Never compromise. Not even in the face of Armageddon.
Сообщение отредактировал Rorschach - Воскресенье, 11 Сентября 2011, 17:51 |
|
| |
Kwant | Дата: Воскресенье, 11 Сентября 2011, 18:03 | Сообщение # 15 |
почетный гость
Сейчас нет на сайте
| ^^ эт я так упростил...вроде =D
Тут не стоит путать понятие объекта(игрового) и спрайта, что происходит часто. При переделки это на игровой объект, все будет, примерно, таким образом:
oHero.SetTexture(GetTexture(L"hero")); oHero.SetPos(12, 45); oHero.Draw();
Я не вижу ни каких проблем в данной реализации. То, что там - выше, это лишь пример, двиг обладает множеством функций, он спокойно загрузит все ваши ресурсы: LoadResource(L"Res.my"); и птом получайте их: GetTexture(L"fuck");.
Пугает _TXT() ? Так это не железно, хотите - не пишите, эт ведь просто дефайн на юник, чтобы быстро рекомпильнуть с Юни на АНСИ.
Короче, пошел я жарить яишнецу, все тут и так просто
ЗЫ: то, что вы привели, в пример, это надстройка Game.h, она расчитана на обучающие цели, а не: "О, епт, нефига у него код у двига" )
Сообщение отредактировал Kwant - Воскресенье, 11 Сентября 2011, 18:13 |
|
| |
Demeron | Дата: Воскресенье, 11 Сентября 2011, 18:08 | Сообщение # 16 |
User created in C++
Сейчас нет на сайте
| Code oHero.SetTexture(GetTexture(L"hero")); oHero.SetPos(12, 45); oHero.Draw(); Мдааа... Выглядит ужасно, нельзя что ли заменить на: Code oHero.SetTexture(L"hero"); oHero.Draw(12, 45); В Draw добавить SetPos, а в функции SetTexture добавить GetTexture. Так не только меньше писать, но и глаз больше радует.
Сообщение отредактировал Demeron - Воскресенье, 11 Сентября 2011, 18:11 |
|
| |
Kwant | Дата: Воскресенье, 11 Сентября 2011, 18:11 | Сообщение # 17 |
почетный гость
Сейчас нет на сайте
| Да епт, можно, эт я протупил х) ЖРАТь я хочу =D Конечно можно в реализацию героя пихнуть:
VOID Object::SetTexture( ... ) { SetTexture(GetTexture(...)); }
Я это просто к тому, что я не связываю тут ни кому руки и все элементарно правится под любой вкус и цвет ) И в Draw нельзя SetPos... Либо напрямую рисуем по координатам переданным в Draw, либо SetPos(); Draw();, т.к. первое используется в месте, где общитывается физика, а второй в области рендра
Сообщение отредактировал Kwant - Воскресенье, 11 Сентября 2011, 18:15 |
|
| |
Demeron | Дата: Воскресенье, 11 Сентября 2011, 18:18 | Сообщение # 18 |
User created in C++
Сейчас нет на сайте
| Quote (Kwant) И в Draw нельзя SetPos... Либо напрямую рисуем по координатам переданным в Draw, либо SetPos(); Draw();, т.к. первое используется в месте, где общитывается физика, а второй в области рендра напрямую рисуем по координатам - да
|
|
| |
Kwant | Дата: Воскресенье, 11 Сентября 2011, 18:23 | Сообщение # 19 |
почетный гость
Сейчас нет на сайте
| Чо да? Физика те SetPos(), объект в жопе какой нить, а ты рендришь напрямую Draw(0, 0); - жопа тут полная ) Draw напрямую над ток спрайту, объекту вообще не вперлось это
|
|
| |
Demeron | Дата: Воскресенье, 11 Сентября 2011, 18:41 | Сообщение # 20 |
User created in C++
Сейчас нет на сайте
| Kwant, если на то пошло (используется физика), то SetPos будет "менять" законы физики (чувак пролетел сквозь потолок и оказался в "жопе") А если не используется физика? 1) Используется физика: нужна функция GetPos, что бы Draw(GetPos().x,GetPos().y), а физика там что-то сама делает... Ну или оставить как есть 2) Не используется физика: просто рисуем в нужной позиции Draw(x,y);
Но решать тебе, что делать...
PS: Если я что-то неправильно понял - поправь меня.
|
|
| |
|