среда, 13 октября 2010 г.

Свершилось...

В общем меня много что достало при разработке движка на C#.

В особенности траблы с врапперами всякой херни.

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

Для C# не вижу я годных готовых мощных решений в плане звука, физики и графики и т.п.

Я ненавижу XNA и за бесплатно юзать ни за что не буду : ) Собсно других альтернатив, кроме SlimDX я не вижу.

Да ну.. к чёрту всё! Решил переписать движок на С++.

Вот, пол дня уже как сижу и пытаюсь его переписывать и с каждой минутой всё плотнее и плотнее приходит осознание того, как я херово знаю C++ : D

А ещё назло инет АЦЦКИ лагает - погуглить траблы аще нереально!!!!! >_< жопа какаято. После C# - С++ напрягает.

Но "врагу не сдаётся наш гордый варяг" же : \ Без гугла так моим любимым методом тыка напишу всёравно.

Долго и упорно вспоминал WINAPI : D

В итоге таки сделал окошко : ))


#include "RenderWindow.h"
#define L_WIN32

LRESULT __stdcall WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
{
switch(message)
{
case WM_DESTROY:
PostQuitMessage(0);
DestroyWindow(hwnd);
break;
case WM_KEYDOWN:
switch(wparam)
{
case VK_ESCAPE:
PostQuitMessage(0);
break;
}
break;
}

return DefWindowProc(hwnd, message, wparam, lparam);
}

RenderWindow::RenderWindow(int width, int height)
{
g_hInst = GetModuleHandle(NULL);
g_hwnd = NULL;

//memset(&g_wndClass,0,sizeof(WNDCLASSEX));

g_wndClass.cbSize = sizeof(WNDCLASSEX);
g_wndClass.cbClsExtra = NULL;
g_wndClass.cbWndExtra = NULL;
g_wndClass.hbrBackground = (HBRUSH)GetStockObject(1);
g_wndClass.hCursor = (HCURSOR)LoadCursor(g_hInst, IDI_APPLICATION);
g_wndClass.hIcon = LoadIcon(g_hInst, IDI_APPLICATION);
g_wndClass.hIconSm = LoadIcon(g_hInst, IDI_APPLICATION);
g_wndClass.hInstance = g_hInst;
g_wndClass.lpfnWndProc = WndProc;
g_wndClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
g_wndClass.lpszMenuName = NULL;
g_wndClass.lpszClassName = L"Onotole";

if(!RegisterClassEx(&g_wndClass))
{
MessageBox(g_hwnd, L"Can not create window class! We all gonna die!!", L"OH SHIT!", MB_OK);
}

if(!(g_hwnd = CreateWindowEx(NULL, L"Onotole", L"Onotole window", WS_OVERLAPPEDWINDOW, 10,10,width,height,NULL,NULL, g_hInst, NULL)))
{
MessageBox(g_hwnd, L"Can not create window! We all gonna die!!", L"HOLY SHIT!", MB_OK);
}

ShowWindow(g_hwnd, SW_SHOWNORMAL);
UpdateWindow(g_hwnd);
SetForegroundWindow(g_hwnd);
SetFocus(g_hwnd);

}

void RenderWindow::Update()
{
#ifdef L_WIN32
MSG msg;
while(PeekMessage(&msg,0,0,0,PM_NOREMOVE)) {
if(!GetMessage(&msg,0,0,0)) break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
#endif
}

void RenderWindow::SetCaption(wchar_t* text)
{
SetWindowText(g_hwnd,text);
}

RenderWindow::~RenderWindow(void)
{
}





Эт конечно только базовый вариант но уже оно есть, оно работает и это радует меня - нуба в С++ : )))

Также намутил главный класс движка, всякие енумы и т.п. Он может создовать рендерер:

g_pEngine.CreateRenderer(RT_DIRECTX10, RenderParams(320,240,0,false,false));

Пока что мегократко описал 4 рендерера - DX9,10, OGL, software. Буду вплотную заниматься DX10, потом остальные допишу (эт типа мультирендер возрождаю на С++)

Ещё написал базовый класс сцены, менеджера сцен, начал работу над логгером.

Маловато за сегодня но я просто ещё не привык к С++ : )


Перешёл на С++... решился таки..

16 комментариев:

  1. У меня работа последние года 3 - разработка и поддержка движка (графического и не только). На C++. И вот уже с год посещают мысли типа нахера ж я его начал писать на C++, надо было на C# :)

    ОтветитьУдалить
  2. Правильной дорогой идёте, товарищ!

    Несколько советов, могут будут полезны. :)

    g_wndClass не стоит делать глобальным или даже членом класса, всё равно он нужен только при создании окна.

    Вместо обнуления memset(&g_wndClass,0,sizeof(WNDCLASSEX)),
    делай сразу так
    WNDCLASSEX g_wndClass = {NULL}.

    UpdateWindow(g_hwnd); ну нужен, т. к. после команды ShowWindow() оно обновится по-любому.

    И это тоже лишнее if(!GetMessage(&msg,0,0,0)) break; PeekMessage() сообщает о наличии сообщения и при этом обновляет структуру msg. И, наверное, стоит ограничить отслеживаемые этой функцией сообщения от WM_CREAT до WM_MOUSELAST ну или чуть дальше. Для движка все остальные команды просто-напросто лишние. И погугли насчёт 5-го параметра этой функции - там тоже можно задать проверяемые сообщения.

    Как мне кажется, PostQuitMessage(0); правильнее было бы вызывать после вызова DestroyWindow(hwnd).

    ОтветитьУдалить
  3. Кстати, если будет возможность попробуй оценить возможный перфоманс прошлых дем и нынешних на C++.

    ОтветитьУдалить
  4. Ты и вправду полный нуб в С++. Да и софтверной инженерии вообще. Чему вас тока в ваших друцких вузах учат?

    Берем пример:
    void RenderWindow::SetCaption(wchar_t* text)...

    1)С-строки в С++ прогамме нормальные люди не используют.
    2)Локализация.

    Вот как сделано у меня в коде последней игры:
    #ifdef _UNICODE

    typedef std::wstring String;
    typedef wchar_t tchar;

    #define _text(str) L##str

    #else

    typedef std::string String;
    typedef char tchar;

    #define _text(str) str

    #endif

    Соотвественно, твой метод будет выглядеть так:
    void RenderWindow::SetCaption(const String& caption)
    {
    SetWindowText(g_hwnd, caption.c_str());
    }

    вызов метода:
    renderWindow.SetCaption(_text("Тестовое демо #1"));

    2. ОМГ.. ты глобальные переменные используешь?!!! Что еще за g_hwnd?

    ОтветитьУдалить
  5. Пример номер два:
    case WM_KEYDOWN:
    switch(wparam)
    {
    case VK_ESCAPE:
    PostQuitMessage(0);
    break;
    }
    break;

    При нажатии клавиши ESC, сразу же посылаешь сообщение о выходе из цыкла обработки сообщений окна.
    Корректней было уничтожать окно:
    DestroyWindow(hwnd);

    Тогда в начале выполниться обработчик WM_DESTROY, где можно было бы произвести очистку. (Например освободить устройство DirectX, вывод которого ассоциирован с данным окном.) В противном случае по выходу из приложения будешь получать фатальные ошибки.

    ОтветитьУдалить
  6. А если честно... Я такие "движки" еще в школе писал. А ты взрослый детина, уже вуз закончил.

    Мама все еще позволяет сидеть дома и играть в Final Fantasy X?

    ОтветитьУдалить
  7. Хехе, откуда такая агрессия? :)

    ОтветитьУдалить
  8. to aglaranir

    >Ты и вправду полный нуб в С++
    ::А я, кажется, этого и не скрывал.

    >Да и софтверной инженерии вообще.
    ::OMFG! А сия утверждение из чего вытекает?

    >Чему вас тока в ваших друцких вузах учат?
    ::Не знаю. Нас ни чему особо не учили : ) Всё, что знаю - выучил сам.

    >ОМГ.. ты глобальные переменные используешь?!!!
    ::глобальные ВНУТРИ КЛАССА. В C# нельзя ни чего объявить ЗА пределами класса. Вот собсно привычка осталась.

    >Что еще за g_hwnd?
    ::КЭП какбы намекает, что это хэндл окна. В C# он мне был нужен. Тут не знаю, оставил пока что.

    >А если честно... Я такие "движки" еще в школе писал.
    ::да кросавчик, чо.

    >Мама все еще позволяет сидеть дома и играть в Final Fantasy X
    ::вы бредите, сударь : ) Моя жизнь в моих руках.

    Реально, откуда столько негатива? Может давай кто круче на C# напишет?? Омг. Я оконное приложение второй раз в жизни на С++ пишу. В первый раз - спи#дил код окошка, запустил и вырубил. Второй раз сам сидел вникал - вот что и получилось а тут ВНЕЗАПНО такой срач в мою сторону. Там, где я учился, такое НЕ ПОКАЗЫВАЛИ, у нас аще какаято хуета с занятиями была. Я всё на C# делал : DDD Макисмум в консоли делаи простые проги. Вообщем ни чему не учили : ))) Я и диплом на C# делал.

    Но всёже спасибо за советы. Ты блин накинулся, будто я говорю - "ААА, лохи, смотрите какое я навороченное окно сделал!! Вы, ничтожества, такого ни когда не сделаете.". Как сумел так и сделал. Факт - РАБОТАЕТ. Появились бы траблы с юникодом - сделал бы как ты написал. Да, изначально я о таком не подумал, но это не значит что я так не могу сделать : ))) Просто у тебя бптт программирования на С++ есть а у меня НЕТ. Но скоро будет ; )

    ОтветитьУдалить
  9. to Алмаз
    >g_wndClass не стоит делать глобальным или даже членом класса, всё равно он нужен только при создании окна.
    ::Спасибо. Я какбэ не знал - пригодится ещё или нет, потому и сохранил : ) Теперь удалю : ))

    >>Вместо обнуления memset(&g_wndClass,0,sizeof(WNDCLASSEX)),
    делай сразу так
    WNDCLASSEX g_wndClass = {NULL}.

    :: дык у меня memset закомментен же ))


    спасибо за советы, учёл, применю в коде сейчас же

    ОтветитьУдалить
  10. Этот комментарий был удален автором.

    ОтветитьУдалить
  11. >Реально, откуда столько негатива?

    Если когда-нибудь устроишься в геймдев-контору, ты еще не такого негатива от своего начальства наслушаешься. Хотя "крутые ковбои" в профессиональном геймдеве не приживаются.

    >Может давай кто круче на C# напишет??

    Да конечно, я. У меня шарп основной язык разработки.

    >Появились бы траблы с юникодом - сделал бы как >ты написал

    Нормальный разработчик обычно обо всем наперед думает. Но тебе похоже больше нравиться все переписывать.

    >Ты блин накинулся, будто я говорю - "ААА, >лохи, смотрите какое я навороченное окно >сделал!! Вы, ничтожества, такого ни когда не >сделаете.".

    А ты сам никогда не замечал как ты себя ведешь? У тебя все посты что здесь, что на форуме выдержаны в стиле "вы все лохи а я дартаньян".

    >::вы бредите, сударь : ) Моя жизнь в моих
    >руках.

    не верю. я митрофанушек за милю чую.

    А вообще пиши исчо, пейсатель. Мне нравиться вечерком после трудового дня заходить сюда и ржать над твоими "подвигами". Ты только не забывай добавлять побольше пафоса и понтов.
    Ты ведь все-таки мир захватывать собрался.

    ОтветитьУдалить
  12. Вдруг поможет:
    http://www.everfall.com/paste/id.php?ww45rq0q49rd
    http://www.everfall.com/paste/id.php?op0rtm8vbkz1

    Особо впечатлительных прошу не беспокоится.

    ОтветитьУдалить
  13. to aglaranir

    >Хотя "крутые ковбои" в профессиональном геймдеве не приживаются.
    ::С чего это у тебя обо мне такой образ сформировался? о_О

    >Да конечно, я. У меня шарп основной язык разработки.
    :: И что? По-моему это ты тут пафосом брыжжешь!

    >Нормальный разработчик обычно обо всем наперед думает. Но тебе похоже больше нравиться все переписывать.
    :: Да нет, не нравится : ) Тяжело думать на С++ : \ Темболее я не знал о _UNICODE и UNICODE. Спасибо, нагуглил и теперь знаю : )

    >А ты сам никогда не замечал как ты себя ведешь? У тебя все посты что здесь, что на форуме выдержаны в стиле "вы все лохи а я дартаньян".
    :: ОХРЕНЕТЬ! ()_() Это где такое? На форуме только одна тема моя в фальшиво-пафосном стиле про "нужность" движка. Называние его "сумер мега-убыйцей крайзиса" это САРКАЗМ. Естественно по сравнению чуть меньше чем со всеми движками мой - хуита. НУ И ЧТО? Как умею так и делаю : ) Я его не для тебя делаю! Да и опыта у меня в такх делах нет. Учусь потихоньку. Я обычно с БД работал (на реальной работе), так что... я много чего не знаю, конечно. Ну а ты.. ты с рождения знал как писать охеренно на С++? Как писать пе#датые движки?? НЕТ! ВОт и я нет. Вот я и учусь по-тихоньку. Чего накидываться.

    >не верю. я митрофанушек за милю чую.
    ::Твоё право. За себя скажу что ты ошибаешься.

    >Мне нравиться вечерком после трудового дня заходить сюда и ржать над твоими "подвигами"
    ::Ой ой, мистер совершенство. Не надо так опускаться. Подвиги.. они локальные подвиги лично для меня - что-то осилил, что-то придумал. И мне это нравится. Тебе не нужно всё это читать - ну и не читай. Я не пишу для кого-то. Это не пафос и не понты. эм, а ЧЕМ ПОНТОВАТЬСЯ? Никудышными скринами с нормалмаппингом, HDR и беспонтовой почти отсутствующей геометрией????? Ты сам себя понимаешь вообще? Как этим можно понтоваться. Я довольствуюсь тем , что есть, и стараюсь сделать это лучше.. как умею.

    ОтветитьУдалить
  14. Эпик драма!

    Ты перед каждым встречным так оправдываешься?)) Ну ниче, сходи мамке поплачься.:-)) Может быть ей твой ***движок*** пригодиться.

    >Тебе не нужно всё это читать - ну и не читай. >Я не пишу для кого-то.

    Однако ведь не лень строчить сумбурные посты о каждой сделаной фигне? Или за каким то хером спрашивать у всех "а не перейти ли мне на С++ О-о"?
    А за всем этим стоит банальное тщеславие и желание выпендриться.

    Ну ладно, оставлю тебя в покое. Я уже довел до психушки одного нервного юношу вроде тебя. Интересная была кстати история. За него пришла разбираться со мной его телка. Она мне втирала какой у её возлюбленного богатый внутренний мир, и как я посмел назвать его драгоценного тупым мудаком.
    Но у него хотя бы девушка была. А тебя че есть кроме амбиций, фрик компьютерный?

    ОтветитьУдалить
  15. Этот комментарий был удален автором.

    ОтветитьУдалить