В особенности траблы с врапперами всякой херни.
То в 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, потом остальные допишу (эт типа мультирендер возрождаю на С++)
Ещё написал базовый класс сцены, менеджера сцен, начал работу над логгером.
Маловато за сегодня но я просто ещё не привык к С++ : )
Перешёл на С++... решился таки..
У меня работа последние года 3 - разработка и поддержка движка (графического и не только). На C++. И вот уже с год посещают мысли типа нахера ж я его начал писать на C++, надо было на C# :)
ОтветитьУдалитьПравильной дорогой идёте, товарищ!
ОтветитьУдалитьНесколько советов, могут будут полезны. :)
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).
Кстати, если будет возможность попробуй оценить возможный перфоманс прошлых дем и нынешних на C++.
ОтветитьУдалитьТы и вправду полный нуб в С++. Да и софтверной инженерии вообще. Чему вас тока в ваших друцких вузах учат?
ОтветитьУдалитьБерем пример:
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?
Пример номер два:
ОтветитьУдалитьcase WM_KEYDOWN:
switch(wparam)
{
case VK_ESCAPE:
PostQuitMessage(0);
break;
}
break;
При нажатии клавиши ESC, сразу же посылаешь сообщение о выходе из цыкла обработки сообщений окна.
Корректней было уничтожать окно:
DestroyWindow(hwnd);
Тогда в начале выполниться обработчик WM_DESTROY, где можно было бы произвести очистку. (Например освободить устройство DirectX, вывод которого ассоциирован с данным окном.) В противном случае по выходу из приложения будешь получать фатальные ошибки.
А если честно... Я такие "движки" еще в школе писал. А ты взрослый детина, уже вуз закончил.
ОтветитьУдалитьМама все еще позволяет сидеть дома и играть в Final Fantasy X?
Хехе, откуда такая агрессия? :)
ОтветитьУдалитьto aglaranir
ОтветитьУдалить>Ты и вправду полный нуб в С++
::А я, кажется, этого и не скрывал.
>Да и софтверной инженерии вообще.
::OMFG! А сия утверждение из чего вытекает?
>Чему вас тока в ваших друцких вузах учат?
::Не знаю. Нас ни чему особо не учили : ) Всё, что знаю - выучил сам.
>ОМГ.. ты глобальные переменные используешь?!!!
::глобальные ВНУТРИ КЛАССА. В C# нельзя ни чего объявить ЗА пределами класса. Вот собсно привычка осталась.
>Что еще за g_hwnd?
::КЭП какбы намекает, что это хэндл окна. В C# он мне был нужен. Тут не знаю, оставил пока что.
>А если честно... Я такие "движки" еще в школе писал.
::да кросавчик, чо.
>Мама все еще позволяет сидеть дома и играть в Final Fantasy X
::вы бредите, сударь : ) Моя жизнь в моих руках.
Реально, откуда столько негатива? Может давай кто круче на C# напишет?? Омг. Я оконное приложение второй раз в жизни на С++ пишу. В первый раз - спи#дил код окошка, запустил и вырубил. Второй раз сам сидел вникал - вот что и получилось а тут ВНЕЗАПНО такой срач в мою сторону. Там, где я учился, такое НЕ ПОКАЗЫВАЛИ, у нас аще какаято хуета с занятиями была. Я всё на C# делал : DDD Макисмум в консоли делаи простые проги. Вообщем ни чему не учили : ))) Я и диплом на C# делал.
Но всёже спасибо за советы. Ты блин накинулся, будто я говорю - "ААА, лохи, смотрите какое я навороченное окно сделал!! Вы, ничтожества, такого ни когда не сделаете.". Как сумел так и сделал. Факт - РАБОТАЕТ. Появились бы траблы с юникодом - сделал бы как ты написал. Да, изначально я о таком не подумал, но это не значит что я так не могу сделать : ))) Просто у тебя бптт программирования на С++ есть а у меня НЕТ. Но скоро будет ; )
to Алмаз
ОтветитьУдалить>g_wndClass не стоит делать глобальным или даже членом класса, всё равно он нужен только при создании окна.
::Спасибо. Я какбэ не знал - пригодится ещё или нет, потому и сохранил : ) Теперь удалю : ))
>>Вместо обнуления memset(&g_wndClass,0,sizeof(WNDCLASSEX)),
делай сразу так
WNDCLASSEX g_wndClass = {NULL}.
:: дык у меня memset закомментен же ))
спасибо за советы, учёл, применю в коде сейчас же
Этот комментарий был удален автором.
ОтветитьУдалить>Реально, откуда столько негатива?
ОтветитьУдалитьЕсли когда-нибудь устроишься в геймдев-контору, ты еще не такого негатива от своего начальства наслушаешься. Хотя "крутые ковбои" в профессиональном геймдеве не приживаются.
>Может давай кто круче на C# напишет??
Да конечно, я. У меня шарп основной язык разработки.
>Появились бы траблы с юникодом - сделал бы как >ты написал
Нормальный разработчик обычно обо всем наперед думает. Но тебе похоже больше нравиться все переписывать.
>Ты блин накинулся, будто я говорю - "ААА, >лохи, смотрите какое я навороченное окно >сделал!! Вы, ничтожества, такого ни когда не >сделаете.".
А ты сам никогда не замечал как ты себя ведешь? У тебя все посты что здесь, что на форуме выдержаны в стиле "вы все лохи а я дартаньян".
>::вы бредите, сударь : ) Моя жизнь в моих
>руках.
не верю. я митрофанушек за милю чую.
А вообще пиши исчо, пейсатель. Мне нравиться вечерком после трудового дня заходить сюда и ржать над твоими "подвигами". Ты только не забывай добавлять побольше пафоса и понтов.
Ты ведь все-таки мир захватывать собрался.
Вдруг поможет:
ОтветитьУдалитьhttp://www.everfall.com/paste/id.php?ww45rq0q49rd
http://www.everfall.com/paste/id.php?op0rtm8vbkz1
Особо впечатлительных прошу не беспокоится.
to aglaranir
ОтветитьУдалить>Хотя "крутые ковбои" в профессиональном геймдеве не приживаются.
::С чего это у тебя обо мне такой образ сформировался? о_О
>Да конечно, я. У меня шарп основной язык разработки.
:: И что? По-моему это ты тут пафосом брыжжешь!
>Нормальный разработчик обычно обо всем наперед думает. Но тебе похоже больше нравиться все переписывать.
:: Да нет, не нравится : ) Тяжело думать на С++ : \ Темболее я не знал о _UNICODE и UNICODE. Спасибо, нагуглил и теперь знаю : )
>А ты сам никогда не замечал как ты себя ведешь? У тебя все посты что здесь, что на форуме выдержаны в стиле "вы все лохи а я дартаньян".
:: ОХРЕНЕТЬ! ()_() Это где такое? На форуме только одна тема моя в фальшиво-пафосном стиле про "нужность" движка. Называние его "сумер мега-убыйцей крайзиса" это САРКАЗМ. Естественно по сравнению чуть меньше чем со всеми движками мой - хуита. НУ И ЧТО? Как умею так и делаю : ) Я его не для тебя делаю! Да и опыта у меня в такх делах нет. Учусь потихоньку. Я обычно с БД работал (на реальной работе), так что... я много чего не знаю, конечно. Ну а ты.. ты с рождения знал как писать охеренно на С++? Как писать пе#датые движки?? НЕТ! ВОт и я нет. Вот я и учусь по-тихоньку. Чего накидываться.
>не верю. я митрофанушек за милю чую.
::Твоё право. За себя скажу что ты ошибаешься.
>Мне нравиться вечерком после трудового дня заходить сюда и ржать над твоими "подвигами"
::Ой ой, мистер совершенство. Не надо так опускаться. Подвиги.. они локальные подвиги лично для меня - что-то осилил, что-то придумал. И мне это нравится. Тебе не нужно всё это читать - ну и не читай. Я не пишу для кого-то. Это не пафос и не понты. эм, а ЧЕМ ПОНТОВАТЬСЯ? Никудышными скринами с нормалмаппингом, HDR и беспонтовой почти отсутствующей геометрией????? Ты сам себя понимаешь вообще? Как этим можно понтоваться. Я довольствуюсь тем , что есть, и стараюсь сделать это лучше.. как умею.
Эпик драма!
ОтветитьУдалитьТы перед каждым встречным так оправдываешься?)) Ну ниче, сходи мамке поплачься.:-)) Может быть ей твой ***движок*** пригодиться.
>Тебе не нужно всё это читать - ну и не читай. >Я не пишу для кого-то.
Однако ведь не лень строчить сумбурные посты о каждой сделаной фигне? Или за каким то хером спрашивать у всех "а не перейти ли мне на С++ О-о"?
А за всем этим стоит банальное тщеславие и желание выпендриться.
Ну ладно, оставлю тебя в покое. Я уже довел до психушки одного нервного юношу вроде тебя. Интересная была кстати история. За него пришла разбираться со мной его телка. Она мне втирала какой у её возлюбленного богатый внутренний мир, и как я посмел назвать его драгоценного тупым мудаком.
Но у него хотя бы девушка была. А тебя че есть кроме амбиций, фрик компьютерный?
Этот комментарий был удален автором.
ОтветитьУдалитьaglaranir, успокойся )
ОтветитьУдалить