Mennyire bonyolult Windowsra csinálni DirectX segítségével, akár 2D/3D -s játékot? Van magyar leírás egészen az alapoktól?
Talán megérhetnéd, hogy ha ismersz pár függvényt, attól nem ismered a C++.
Alap dolog:
#include <windows.h>
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
char szClassName[ ] = "MyApp";
int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil)
{
HWND hwnd;
MSG messages;
WNDCLASSEX wincl;
wincl.hInstance = hThisInstance;
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure;
wincl.style = CS_DBLCLKS;
wincl.cbSize = sizeof (WNDCLASSEX);
wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL;
wincl.cbClsExtra = 0;
wincl.cbWndExtra = 0;
wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
if (!RegisterClassEx (&wincl)) return 0;
hwnd = CreateWindowEx(0, szClassName, "MyApp", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 544, 375, HWND_DESKTOP, NULL, hThisInstance, NULL);
ShowWindow (hwnd, nFunsterStil);
while (GetMessage (&messages, NULL, 0, 0))
{
TranslateMessage(&messages);
DispatchMessage(&messages);
}
return messages.wParam;
}
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_DESTROY:
PostQuitMessage (0);
break;
default:
return DefWindowProc (hwnd, message, wParam, lParam);
}
return 0;
}
ismerős ?
WNDCLASSEX -nél egyszerűbb ha így incializálod: WNDCLASSEX wincl = {0} és akkor
nem kell 0 -át értékül adni a tagoknak ha azt akarod null legyen. (Ez csak annál a
structnál müködik amelyiknek nincs konstruktora).
Használhatod a ZeroMemory macrot is ami egy szimpla memset hívás 0 -val.
De biztosabb ha csinálsz egy template funkciót rá aminek két előnye is van:
1: Egyel kevesebb paraméterrel kell meghívni.
2: Biztonságosabb lesz hiszen ellenőrzöd nem e nullptr -re hívod meg.
template<typename T>
void SafeZeroMem(T *t)
{
if (t)
memset(t, 0, sizeof(T));
}
Elfelejtetted ellenőrizni a HWND -t nem null -e a CreateWindowEx után.
A TranslateMessage csak akkor szükséges ha kezeled a WM_CHAR üzenetet is hiszen a
Virtual Key kódot alakítja át karakterre.
A DispatchMessage pedig értelemszerűen továbbítja az üzenetet.
A GetMessage és a PeekMessage között a különbség, hogy az egyik vár az üzenetre a
másik nem. Utóbbit ezért is használják játékoknál általában.
2 hét alatt mit nem értesz meg?
Hosszú a lista:
- programozói gondolkodás
- paradigmák, főleg az OOP
- a C++ minden feature-je a c++14 -ig
- programtervezési minták, azok alkalmazása
- Winapi
- A memória működése
- A compiler működése (nagyon fontos, sok hibaüzenetet megértesz belőle)
- egyszerű elemzők felépítése, implementálása (resource managerhez XML minimum...)
- egy egyszerű játék felépítése (main loop, game statek ...)
- vektorműveletek
- mátrixműveletek
- shader programok
és még sorolhatnám...
Jajj és van mit felmutatnom. Melyik projektemet linkeljem be GitHub-ról? A multitasking operációs rendszer kernelemet, az OpenGL alapú game enginemet, a saját programnyelvem interpreterét, vagy netán egy sz*rrá optimalizált CPU rendederrel rendelkező javaban írt engine-t?
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!