Hogyan készítsünk egy kitörési - részletes lecke

Figyelem! Ez az oldal nem frissül. Új verzió: shatalov.su

Mi továbbra is vizsgálja Arkanoid. Olvasás előtt a második rész feltétlenül szükséges, hogy megismerjék az első.

A második változat volt írva valahol húsz órát - a teljes hétvégére. A játék már teljesen másolt az 0.1 verzió, amit tárgyalt az előző leckét.

A program a zene használni. Audio kimenet, szoktam XAudio2. Sajnos, ez túl nagy téma akár csak rövid időre érinteni ez a mai kérdés. Mintegy hang, fogunk beszélni többet később.

A kód nem adok neked. Be kell írni magad. Képek az interface a játék mappájába.

játék felület

Interface verzió 0.2 alapul az a tény, hogy ő volt a programban sejtek v0.3. Vannak azonban olyan kis javulás. Vessünk egy pillantást a felület elem rajz módszer:

Ha a kép egy fehér színű, általában nem másolható. Ez lehetővé teszi, hogy a felhasználói felület elemeit bármilyen alakú.

A program magában foglalja 41 interfész elem. A legtöbb írás a program fogja tölteni csak töltse ki a felületet:

A többség a szülő elem vagy SZERKESZTİ vagy a menüt. Egyes elemek látszanak - END_GAME. Amikor elkezdi építeni a felület, meg fogja érteni, hogy melyik elemet, hová tegye.

Az elemek tömb tárolja a pointerek (I számba vette 50):

A mátrix töltjük InitGraphics funkciót. Feature semmi, de a tételek száma nem különbözik az egyik, hogy volt a sejtekben.

Betöltés után történik grafikus interfész elemek betöltésére a labdát, és az egységek (a platform használt szilárd fekete). Itt látható a képek letöltése az egyik blokk:

std :: ifstream IS4 ( "images / játék / metal.bmp" std :: ios :: bináris); is4.seekg (54,0); A (int i = 19; i> = 0; J) is4.read (reinterpret_cast (mdTiles [2] [i * 50]), 50 * 4); is4.close ();

A fényképek olvasott sort (blokkméret - 20 * 50).

Az interfész is feldolgozni, mint a sejtekben - szempontjából funkciók és CheckInt IntProc. Ebben az esetben a IntProc nagyon hosszú funkciót.

Itt a felhasználó megnyom egy gombot, ami növeli a sorok száma (több - több). Mi azonnal, hogy egy aktív gomb, amely csökkenti a sorok száma. Második sor, míg mi nem nyúl - itt megváltoztatja a szint méretét. Ezután SAVE_LEVEL elem lehet, hogy aktív - szinten csak úgy lehet menteni, ha van legalább néhány változás történt. Végén a funkciót nevezik CheckInterface. Nézzük meg belőle egy darabot:

Figyeljük meg, hogy a jobb minősül a határ az utolsó blokk: C-> ökör + C-> oszlopok * (c-> blockWidth + C-> xgap) C-> xgap. Az ilyen számítások ezt a funkciót sokat. Az ilyen számítások kell növekvő behúzás mennyiségű blokk, a távolságok a blokkok között, semmit sem kapott ki a képernyőn. Élvezze programozása!

A legfontosabb dolog - a két vonal hívása előtt CheckInterface. Mielőtt megváltoztatja a jelenlegi szinten, akkor újratöltve (reload). Minden alkalommal, amikor a felhasználó megnyomja a „Save szinten”, a mért szintnél a fájlban. Amikor újraindítja összes módosítás, mivel az utolsó megtakarítás elvesznek. A ReloadLevel, szinten a betöltést a megfelelő fájl neki.

Kimeneti blokk a képernyőn

logikai játék

A játék során, egy olyan gép is lehet az egyik három állam: NEW_GAME_STATE, START_LEVEL_STATE, RUN_STATE. Összesen hat programot kimondja:

Amikor a felhasználó megnyomja a „New Game”, az állam gép megy NEW_GAME_STATE:

Itt lehet beállítani a jelenlegi szinten, pont, a szöveg jelenik meg a felső, vereség zászló. A játék megy START_LEVEL_STATE. Code START_LEVEL_STATE állam sokkal nehezebb, mint az előző verzió:

három részre lehet megkülönböztetni. Az első telepíti a platform és a labdát. A második és a harmadik rész sokkal érdekesebb.

A második rész a kód által feldolgozott változó CurrentLevel egyenlő 10. Ez az érték változó kap csak egy esetben - a végén a játék, amikor elkészült szintek nulláról 9 (ezeket a szinteket lehet üres). Ha nem egyenlő lvl 10 (játék szint üres), akkor a szöveg, amely akkor jelenik meg a felső, egyjegyű szám szerepel. Ha lvl 10 (mind a tíz szintet is játszott), a karakterlánc megadott kétszámjegyű - tíz.

Ezt követően kerül sor a végső látható menü.

Azt viszont, hogy a kód az ellenőrzést követően a végső szintre. Emlékeztetem Önöket, hogy mi vagyunk az elején egy új szintre (START_LEVEL_STATE). Itt kell, hogy ellenőrizze a doboz halál. Ha ebben az állapotban a játékos megüt egy aktív jelzőt, hogy folytatni kell a jelenlegi szinten (a játékos hiányzott a labda - mínusz egy élet). Ha a halál a zászló nem engedélyezett (ez azt jelenti, hogy a játékos teljesítette a korábbi szintre), majd indítsuk újra a szintet.

Az utolsó rész van jelölve notHollow zászló (üreges - üres). Ez ellenőrzi, hogy van legalább egy blokk. Ha a szint nem a blokkokat, akkor megy (CurrentLevel) a következő szintre (lvl nem változik).

És a végén megy az állam RUN_STATE. Volt egy doboz - levelLoaded. A játék során, akkor nullának kell lennie. Ez a jelző betöltésekor a játékot a lemezről. Hogyan működik az alábbiakban.

Az utolsó állapot - RUN_STATE. A kód nagyon hasonlít az egyik, hogy használták a 0.1 verzió. Felvázolom csak a különbségeket:

A játék során lehet menni a menüben. Amikor a felhasználó beírta egy kis pont a „Tovább” gomb aktívvá válik. „Új játék” bemegy GAME_INIT_STATE, és a „Tovább” - a RUN_STATE. Amikor a felhasználó megy a menü, akkor kattintson a „Download” gombra. Ebben az időben, a jelző levelLoaded. Amikor a felhasználó rákattint a „Tovább”, akkor ez a doboz azt mondja, hogy szükség van inicializálni CurrentLevel szintet. Ugyanakkor a platform és a labda mozog a kiinduló helyzetbe.

A következő érdekes darab kódot ellenőrizzük labda indulás a platform:

Itt állíthatja be a zászlót a halál. Tovább csökkentve az életek számát. Most arra van szükség, hogy ha az élet vége? Ha elfogy, akkor megjelenik a végső képernyőn. Ha nem fogy el, akkor megyünk START_LEVEL_STATE. Emlékszem, hogy a megállapított szinten deadFlag nem újraindul (ez nagyon fontos - a felhasználónak nem kell elölről kezdeni az egészet).

Most kell, hogy ellenőrizze a szintet a végén. Ha a mező csak üres, kemény (mely nem bontható) blokkokat, akkor a szint fölött van.

Végén a szint, amit tennie kell néhány dolgot:

Első növeli CurrentLevel. Ezután állapotának megváltoztatásával a véges állapotú gép elején szinten. Növeli lvl. Ott van még a második alkalommal ellenőrizte az egyediség / két számjegyű lvl -, hogy a felhasználó elérte a tizedik szintet.

Ezután a mondat okozza ProcessBall. A funkció gyakorlatilag nem változott. Az egyetlen dolog, ebben a verzióban megjelent tömbök, ezért ellenőrizni kell az ütközés velük.

A menü szeretnék néhány megjegyzést:

Végül elérkeztünk a része a programnak, amit szeretnék kiemelni, különösen.

A tíz szint a játék áll rendelkezésre. Minden szinten van a szint mappában. szintek fájl mappába - ez mentett szinten. Eleinte akartam tudni, hogy a fájlok nevét, de aztán van néhány kérdés, magyarázat, amely szükségessé tenné a kibocsátás két. Így használtam az adott neveket.

Nézzük meg az osztály szintjén:

Megváltoztatja a nevét (az utolsó karakter a neve - szám). És minden név hívják tervező. Ha a fájl letöltése meg kell vizsgálni két esetben: a fájlban lehet szinten, valamint a fájl üres is lehet. Az első esetben húzza ki az összes változó a fájlból. Az eljárás határozza meg a változók magukat. A lényeg: az utolsó menni tömb térképet. A második esetben, létrehozunk egy szinten a menet (I létrehozásához mező mérete 5 * 5 blokk üres blokk). Itt kivitelező kód:

A kivitelező, akkor láthatjuk, hogy miként kell meghatározni a létezését a fájlt.

A destruktor kell kiadja memória a térképről.

LoadLevel eljárás terhelési szint. A használata némileg eltér ReloadLevel. LoadLevel használt játékokat, hogy a felhasználó korábban elmentett. A módszer jut el a fájl nevét (ne szint).

ResizeLevel Eljárás mértékének megváltoztatásával méret (meghívásra, ha a térkép). Ebben az esetben az ideiglenes tömb jön létre, amelybe a térképet. térkép törölve. Ezután memóriát az új méretet térkép és térkép másolni az ideiglenes tartalmat.

Van egy fontos pont. térkép - dimenziós tömb. Felmerül a kérdés: hogyan lehet eltávolítani a jobb oldali oszlopban? Azt ajánlom ezt a módszert, hogy írhatunk. Rendkívül fontos, hogy megértsük, hogyan működik. Mindenesetre, a teljes kódot. Az átadott paraméterek az új számot a sorok és oszlopok:

Megfelelő hozzáadását és eltávolítását oszlop látható ellenőrzések c oszlopok.

A program két egyéb funkciók (nincs módszer): SaveLevel és LoadLevel. Ezeket a funkciókat az úgynevezett módszerek megfelelő a jelenlegi szinten. Ezen túlmenően, a save.sav fájl mentése (vagy rakodják meg) az aktuális játék információk: az életek számát, a jelenlegi szint (és lvl, és CurrentLevel), a pontok száma.

A program keretében az összes közül.

Ütközés a két téglalap

Itt az ideje, hogy felvegye őket a program egy új teszt - az ütközés két téglalap. Ez lehetővé teszi majd a programot egy kicsit reálisabb. Ütközés két téglalap sokkal bonyolultabb ügy, mint az ütközési pont és a téglalap. Módon végezni egy ilyen teszt elég sokat. Megmutatom a legegyszerűbb.

Először is, nézzük meg, hogyan az ütközés két téglalap azonos tengelyen néz - a kereszteződés két szegmens:

A koordináták Ezen szegmensek a következők: 1 (3,6) 2 (5,8). Az utolsó kérdés az eloszlása ​​azt mutatta, hogy néha, hogy egyszerűsítse az egyenletek kell használni nem ez a helyzet, és a minimum és maximum értékeket. Minimumok és maximumok Ezen szegmensek fog kinézni:

Teszt egy ütközés két szegmens nagyon egyszerű: a maximum az első szegmens nagyobbnak kell lennie, mint a második legkisebb és legnagyobb a második - több, mint a minimális az első:

Felhívjuk figyelmét, hogy ez a teszt sikeres, és itt ebben az esetben (annak a ténynek köszönhető, hogy használjuk a min és max):

Most akkor át a teszt kétdimenziós térben. Csak add ugyanazt a tesztet a második tengely:

Továbbra is csak a levelet egyszerű függvény meghatározása a minimum és maximum a két szám.

javított felület

Ma van hozzá egy jó lehetőség a felület, nem a költségek szinte erőfeszítés nélkül. Lássuk, mit lehet javítani felület drasztikusan változtatni.

Most az elem tekinthető, hogy kell nyomni, ha a vizsgálati hozták:

Ie ha a kurzor már tolta át a téglalap, amely kijelöli az elemet. Akkor nagyon könnyen hozzá a mi felület elemei bármilyen alakú. Ez elég ahhoz, hogy a vizsgálat után a fent megadott még egy - bármely pixel vége volt: ha egy átlátszó (fehér), az elem nincs lenyomva. Ez a következőképpen nézhet ki:

Ezután az összes vizsgálat fog kinézni:

Most is létrehozhat bármilyen alakú elemekkel. Elég, ha csak az inaktív zóna van jelölve fehér.

következtetés

A program meg van írva több mint két hónappal ezelőtt. Az egyetlen dolog, amit boldogtalan vagyok - class szinten lehetne egyszerűsíteni - Van egy csomó kettős kód. Remélem csinálni.

ünnepély

Arkanoid

Hogyan készítsünk egy kitörési - részletes lecke

fényképezőgép
Hogyan készítsünk egy kitörési - részletes lecke

sejteket
Hogyan készítsünk egy kitörési - részletes lecke

sprite
Hogyan készítsünk egy kitörési - részletes lecke

Kapcsolódó cikkek