játékfejlesztés.hu
FórumGarázsprojectekCikkekSegédletekJf.hu versenyekKapcsolatokEgyebek
Legaktívabb fórumozók:
Asylum:    5448
FZoli:    4892
Kuz:    4455
gaborlabor:    4449
kicsy:    4304
TPG:    3402
monostoria:    3284
DMG:    3172
HomeGnome:    2919
Matzi:    2520

Pretender:    2498
szeki:    2440
Seeting:    2306
Geri:    2188
Orphy:    1893
Joga:    1791
Bacce:    1783
MaNiAc:    1735
ddbwo:    1625
syam:    1491
(C++) Foxi 2D-s programozás leckéi 1. - Bevezetés, saját ablak 2006.12.22 01:29


Bevezető

A leckesorozatot azért hoztam létre, hogy aki szeretne programozni, vagy valamilyen szinten egy egyszerűbb játékot megírni, annak segítsek.

A c++ nyelv ismerete alapvető szükségesség, de ahol úgy gondolom magyarázatokat is írok. MSVC6.0 -hoz írom meg a progikat, de a DEVC++ fordító is lefordítja ingyenesen letölthető, a 4.9.9.2 -es verziót kell letölteni. Ez már kezeli a .h és .lib fájlokat. A régebbi verziónak a lib fájlok kiterjesztése .a volt. MSVS6.0 ez egy "régi" fordítónak számít, de mivel 32 bites bőven jó.

Ha letöltöd a Directx9.0 sdk-t minden további nélkül fordítja annak header állományát is. A példaprogram kitér a saját windows ablak létrehozására, a saját directx felület létrehozására a megjelenítendő képek betöltése memóriába, képek megjelenítésére a képernyőn. Az egyes képdarabok átlapolása a képernyőfelületre, ezek után jönnek a sprite -ok, megtanulunk struktúrát létrehozni, új osztályokat fogunk létrehozni, a megalkotott sprite -okat mozgatjuk a képernyőn, ütközéseket fogunk vizsgálni.Ha minden grafikai dolgot kimerítettünk, megtanuljuk a midi, mp3 és wav fájlok használatát a progiban. A billentyűzetet is lekérdezzük, megtanuljuk az egér használatát, és marad még az időzítők használata. Persze nem külön-külön példákkal, hanem egy projectet létrehozva miden egyszerre működik. Mivel ezek többnyire külön osztályokból épülnek, változtatás nélkül használható más alkalmazásokban is. Ebből következik,hogy az egyes leckék egymásra épülnek, és a letölthető forrásfájlok mindig csak az utolsó lecke anyagát tartalmazza. Önállóan nem futtathatóak.

SOK SIKERT

Saját ablak

Nos első lépésként készíts egy új mappát a c meghajtó főkönyvtárában progi néven. Indítsd el a fordítót, és készíts egy új projectet:

DEV C++: fájl -> új project -> válaszd az empty project nevet, mentsd el az előzőleg létrehozott mappába, és adj hozzá egy új fájl-t nevezd el main.cpp -nek.

MSVC6.0: fájl -> új -> win32application ikon    név: progi     célmappa pedig a progi legyen!



Az ok-ra kattintva válaszd az an empty project-et, és finish. A source mappában adj hozzá egy új fájl-t main .cpp néven.

Nos akkor van kétféle projectünk, és két üres main.cpp fájl-unk, azaz nektek csak 1 féle. Azért csináltam így,mert innen meglehetősen egyforma lesz a progi felépítése: Azért, hogy windows ablakot tudjunk létrehozni a fordítónak tudnia kell, hogy hogyan vannak dekralálva a különböző struktúrák, osztályok ehhez kell beírni:

#include <windows.h>

//dekralációk:

HWND hwnd;

bool fut= true;
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
void uzenetkezelo();

A HWND egy azonosító, ami akkor kap értéket, ha az ablakunk létrejött, fontos a dx felület létrehozásakor időzítőknél, hang kreálásakor stb.

fut : logikai változó ha false értéket vesz fel, a programunk véget ér.

LRESULT CALLBACK WindowProcedure(.....) visszatérési függvény, a windows üzenetek feldolgozásához.

uzenetkezelo() : függvény ami lekérdezi az üzeneteket és továbbitja a visszatérési függvénynek.

A dekralációk után jönnek a

//MEGVALÓSÍTÁSOK:

Elsőnek a main() függvény..... ezt azért nem kell dekralálni, mert ha egy függvényt "megvalósítunk", mielőtt használnánk, akkor az egyben a dekralációja is.

int WINAPI WinMain(HINSTANCE hThisInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument,int nFunsterStil)
{
    WNDCLASSEX wincl; // ITT FOGLALOD LE A STRUKTÚRÁT

    wincl.hInstance = hThisInstance; //ADATOK KITÖLTÉSE
    wincl.lpszClassName = "progi";
    wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */
    wincl.style = CS_DBLCLKS; /* Catch double-clicks */
    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; /* No menu */
    wincl.cbClsExtra = 0; /* No extra bytes after the window class */
    wincl.cbWndExtra = 0; /* structure or the window instance */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
    if (!RegisterClassEx (&wincl))return 0;
    hwnd = CreateWindowEx (0,"progi","Első ablakom",WS_POPUP ,0,0,800,600,NULL,NULL,NULL,NULL);
    while (fut)
    {
        uzenetkezelo();
    }
    return 0;
};

Nos az első függvényünk a main(....) egy statikus struktúra létrehozásával kezdődik: WNDCLASSEX tipusú és wincl; nevű struktúra, aminek kitöltjük az egyes tagjait. Ezután beregisztráljuk a windows-ba : RegisterClassEx (&wincl) a címének megadásával (& a cime operátor). Létrehozzuk az ablakot, a CreateWindowEx (...) függvény hívásával, a visszatérési érték az ablakunk HWND-je. Az ablak megjelenítése pedig a ShowWindow(hwnd,nFunsterStil); függvénnyel lehet. És létrehozunk egy végtelen ciklust, tehát a programunk soha sem fog megszakadni, amig a fut változó értéke hamis nem lesz. Ezt majd az esc billentyű figyelésével fogjuk megoldani.

Most nézzük a visszatérési függvényt!

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message) /* vizsgáljuk az üzenet tipusát */
    {
        case WM_KEYDOWN:
            switch(wParam)
            {
                case VK_ESCAPE:fut=!fut;break;

            }
            break;

        case WM_DESTROY:
            PostQuitMessage (0); /* ha bezárod az ablakot elküldi a vége üzenetet */
            fut=false;break;

        default:
            return DefWindowProc (hwnd, message, wParam, lParam);

    }

    return 0;
}

Tulajdonképpen ez a függvény kezeli az üzeneteket, és most a billentyű lenyomása eseményt figyeljük, és ha az esc-t nyomtuk, akkor tud kilépni az alkalmazásunk a végtelen ciklusból.

Maradt még az uzenetkezelo() függvény:

void uzenetkezelo()
{
    MSG msg;
    if( PeekMessage (&msg,NULL, 0,0,PM_REMOVE))
    {
        TranslateMessage(&msg);DispatchMessage(&msg);
    }
}

Ez lekérdezi az üzenetekt, és tobábbítja feldolgozásra.

fordítás -- futtatás ....

Ha minden jól megy, akkor lesz egy szép szürke semmitmondó ablakunk, ami eltűnik az esc billentyűre. Hát ez kell nekünk.

itt a kód

foxi


Kapcsolódó linkek:

Értékelés: 6.00

Új hozzászólás
Tartuffe          2009.02.13 03:51
visual c++ 2005-ben nekem ilyen hibákat ír ki:

c:\progi\progi\progi\main.cpp(2 : error C2664: 'CreateWindowExW' : cannot convert parameter 2 from 'const char [6]' to 'LPCWSTR'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

c:\progi\progi\progi\main.cpp(16) : error C2440: '=' : cannot convert from 'const char [6]' to 'LPCWSTR'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast


ezt én nem értem, mitől lehet? valaki pls help!
Mystin          2007.08.14 09:30
Nekem nem akarja behozni DEVC++ on az ablakot, hanem helyette megnyitja a parancssort, és azon semmit nem tudok csinálni. SEGÍTSÉG!!!
Csaba42          2006.12.24 04:38
Bocs, nem FOxy, hanem Foxy, csak sajna nem szerkeszthetem a hsz-em .
Csaba42          2006.12.24 04:37
Be felejtsd el FOxy, hogy nem dekral..., hanem deklar... a szótő! Ezt elsősorban a Sprite-oknál láttam! Az angol szótő: declar
HomeGnome          2006.12.23 14:05
A forráskódok ki vannak emelve csak töröld a cache-t..
Aztán a cikksorozat többi része is jön majd szépen sorban.
Joga          2006.12.23 05:57
Én megeléxem az MCGA-val
Matzi          2006.12.22 11:09
Lehet, hogy csak én gondolom rosszul, de nem lenne szerencsésebb, ha már úgyis megvan írva, akkor egy nagyobb blokkban feltenni a cikket? Nem csak itt, de sok másiknál is egy-másfél gépelt oldalnyi részekből álló cikksorozatokat tesznek közzé, amikor egyben kicsit jobb lenne.
beast          2006.12.22 03:13
Akartam már a prog.hu-n is irni a topicba, hogy esetleg ide bekéne emeleni a cikkeket. De szerencsére megtörtént.
Sztem kérjük meg szépen kicsyt, hogy a forráskódokat emelje ki, hogy még szebb legyen.
Amúgy fasza kis cikk. A többi is jön majd, ugye?