Суббота, 20 Апреля 2024, 08:41

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Форум игроделов » Ваши проекты » Разработка движков и сред разработки » HCG 2D Engine (C++, DX8 & 9, Web/Lan/Internet: Socket)
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
К следующей сборке дам линк на тулзу (в архив, к движку, пока что класть не буду), если лень искать smile

Добавлено (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 biggrin
Но, я как бы стараюсь его постоянно упростить и сохранить гибкость )
Quote
Единственно, что мне пока что не понравилось, так это 6 dll файлов движка, общим весом меньше метра...

А что я сделаю то )
Ну модульный двиг, суть его в модулях ^_^, поэтому и куча dll`ов
Могу в Core.lib запихать код, который позволит загружать dll ки из ресурсов exe`шника )

Code
HHCGMODULE LoadDLLFromResource( HINSTANCE hInstance, PTCHAR pName, PTCHAR pType = NULL );


мм, как то так )

Я еще переписал автопатчер, работает получше, нормально качает/докачивает, висит в трее и больше ни где старается не палиться happy . Выложу новую версию, как подготовлю новый 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();

smile


KwantДата: Понедельник, 29 Августа 2011, 16:10 | Сообщение # 7
почетный гость
Сейчас нет на сайте
Охох, ну что же, лето к концу, трудовые будни постепенно начинаются х)
Такс, что я тут нового сделал:
[+] Добавил:
-класс HCGUtil
-логи во все модули
-различные функции в класс IHCGResourceManager, IHCGRoot, CGame (класс для упрощения взаимодействия с движком)

[+] Добавляю на данный момент:
-работа с архивами
-частицы или гуи писать сюда есть смысл? А то я их добавляю уже стопитцот поколений...они все добавится не могут...

[+] Исправления:
-убрано 6 ошибок
-изменение работы некоторых классов и функций: IHCGResourceManager, IHCGRoot, IHCGCore

Над модулем сети поработать бы еще - добавить пару чтук, ну и пробую звуковую часть поковырять, пару мыслей есть, но....мысли, они и в Африке мысли )
В целом, по тихоньку дело идет smile
Может я че упустил, забыл...эээ....но пока вот..., что есть - изменения идут: упрощаю, добавляю....кручу верчу запутать хочу =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. (блин, это есесные вещи и че я Вам объясняю - на схеме се видно, да? smile )

Как то так оно в общем...да, и я подза...долбался с этими архивами х)
Но поддержка ресурсов в архивах будет...пароли-не пароли там...

Добавлено (31.08.2011, 04:14)
---------------------------------------------
А, и в ближайшее время верну рендер DX9 )

Добавлено (11.09.2011, 17:39)
---------------------------------------------
Ну, я залил то, что пока есть, не все успел впихнуть, т.к. времени вообще катастрофично не хватает, даже на личную жизнь...начинает казаться, что она у меня где то в области иррационального сейчас %-)

Скачать можно с помощью APE или по ссылке ниже:
Перейти...

Там, в архиве, тествовый код есть и 2 файла на которые стоит обратить внимание: HCG[Control].h и Game.h smile


Сообщение отредактировал 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 будет "менять" законы физики (чувак пролетел сквозь потолок и оказался в "жопе") surprised А если не используется физика?
1) Используется физика: нужна функция GetPos, что бы Draw(GetPos().x,GetPos().y), а физика там что-то сама делает... Ну или оставить как есть smile
2) Не используется физика: просто рисуем в нужной позиции Draw(x,y);

Но решать тебе, что делать...

PS: Если я что-то неправильно понял - поправь меня.
Форум игроделов » Ваши проекты » Разработка движков и сред разработки » HCG 2D Engine (C++, DX8 & 9, Web/Lan/Internet: Socket)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг