LECKÉK: Directdraw_3 |
Üdvözöllek! Most,hogy van direcx felületünk,de még nem látszik, nekifoghatunk az osztály fejlesztéséhez. mindenek előtt azonban kell egy struktúrát létrehozni, aminek 3 tagja lesz: LPDIRECTDRAWSURFACE7 tipusú mutató a betöltött kép memória címének, egy int sor és egy int oszlop változónak, hogy eltárolja a betöltött kép szélességét és magasságát. Tehát a rajz.hpp-ben valahol a dekralációk felett írd be: typedef struct Azért előnyös a typedef, mert létrejön egy új típus a KEP és egy ilyen típusú pointer is. Ezt a struktúrát később fogjuk használni. Most létrehozunk a védett tagváltozók között egy ilyen KÉP tipusú tömböt:
KEP kepek[10]; //várhatóan ennyi képfelület elég lesz. Azért kell ezzel kezdeni, mert a destruktorban törülni szeretnénk minden általunk létrehozott objektumot.(Szerintem amikor bezáródik az ablakunk,akkor a Win automatice felszabadítja a memóriákat de ha nem??? elfogynak az erőforrások) Megírjuk a képek és a ddraw objektum törlését, pedig még nem is tudjuk mennyi kép lessz! dekraláció: void torles(); megvalósítás: // (Fontos! Ha egy mutató "mögötti" adatállományt törlünk,akkor az értékét is NULLázzuk ki,mert legközelebb egy egyszerű vizsgálattal eldönthető, hogy van e mögötte érvényes objektum. statikus mutatóknál a fordító "garantálja" a 0-val való feltöltést,de utána nekünk illik kézben tartani.) Ezt a függvényt be kell írni a destruktorba: torles();Ha nem volt ennyi kép akkor sincs baj. Nem beszéltem még a képernyő váltásáról,pedig ez fontos dolog lesz. csak egy függvényt kell meghívni,mégpedig a flip() nevűt, dekraláljuk: void flip(); Megvalósítása: //KÉPERNYŐVÁLTÁS Használni pedig a Main .cpp-ben a végtelen ciklusban kell: while (fut) Fordít futtat... Az eredmény egy villódzó képrenyő,pedig mi nem ezt akarjuk... Valójában pont ez kell nekünk,mert a megadott ütemben(képernyő frekvencia) váltogatva van a képernyő.Csakhogy az első szép szürke a hátsó pedig fekete.Gyorsan írunk is egy háttérszinező függvényt. Vissza a Rajz.hpp hez. dekraláció: void hatter (DWORD szin=0);//ha így dekralálod,akkor "üres meghívás esetén 0 lesz a bemenő adat megvalósítás: // HÁTTÉRSZIN Tulajdonképpen a háttérfelülethez tartozó Blt(...) függvényét hívja meg, előtte kitölt egy struktúrát. Használni az init függvény végén célszerű, de bárhol,bármikor meghívható. szúrjad be az init() függvény végére: UpdateWindow(hwnd); //ablakfrissítés A színfelállás a következő: 00 rr gg bb azaz piros zöld kék tehát a 0x00000080 közepes kéket jelent. Ha csak a 16 bites színt sikerült volna inicializáni, akkor 5 bit piros 6bit zöld és 5 bit kék a szín. Fordít futtat. Most már igazán egyszínű középkék képernyőnek kell lennie. vibrálás nélkül.A program fejlesztése közben jó lenne ha kitudnánk írni számokat és szövegeket a képernyő felületére. Legyen a két függvény neve kiirszam és kiirbetu. Dekraláció: void kiirbetu(LPCTSTR betu,int x,int y);//sztringre
mutató pointer és pozíció Megvalósítás: void RAJZ::kiirbetu(LPCTSTR betu,int x,int y) Azonban hogy a strlen() és az itoa() függvényeket használjuk, csatolni kell a stdio.h állományt.Fennt: #include <stdio.h> A két függvény használata legegyszerűbben a flip függvényben lehet: void RAJZ::flip() ...... fordít futtat. Ha minden oké, akkor megjelenik a felirat és a szöveg. Jó tudni! a flip() függvény meghívása addig várakoztatja a programot,amíg a monitor nem végez a rajzolással,tehát 75Hz-nél 1/75 másodpercenként ez egy jól használható időzítő is lehet.Azonban később más időzítőket is használunk.
|