2. fejezet Mi az a Framework? Az ábrán látszik, hogy miért jó ez az egész. Az Framework (keretrendszer) egy olyan halmazt jelent, aminek az elmei egy adott környezetben leggyakrabban használt hasznos eszközök összessége. Ilyen még pl a.net, illetve a Java EE is.
Az XNA Framework Kicsit vissza kell mennünk az időben ahhoz, hogy egyszerűbben átláthassuk a játékfejlesztés fejlődését. A DOS idejében, vagy még az előtt a programozók kénytelenek voltak alacsony szintű kódot írni, és olyan problémákat megoldani, mint a videokártya,hangkártya,input eszközök kezelése. Egy amatőr fejlesztő számára ez sokkal bonyolultabb feladatot jelent, mintha csak simán a játéklogika felépítésével kéne töltene az időt. A másik problémája ennek a dolognak, hogy különböző hardware esetén újra kell írnunk a kódot, vagy nagymértékben módosítanunk ahhoz, hogy fusson, amit irtunk. Cserébe, ha jól dolgoztunk, egy valamivel gyorsabban futó program volt a munka eredménye.(de ez nem minden esetben igaz) A probléma egyik lehetséges megoldását az OpenGL, a másikat pedig a DirectX nyújtotta. Mikor a Windows 95 megjelent, akkor merült fel először egy ilyen megoldás igénye. Ekkor az OpenGL már régóta piacon volt,de csak a fentebb említett problémákra nyújtott egyszerű megoldást. Az csomag első megjelent verziót Windows Game SDK névre keresztelték, és később változtatták csak a nevét DirectX re. Persze túl tökéletes lenne a világ, ha minden elsőre működne, és az új rendszerek is az elvárások szerint teljesítenének. A legtöbb programozó az első verziókat nagyon nem kedvelte, de folyamatosan javult az API, és egyre többen kezdték használni, felfedezve az előnyeit. Először nézzük meg, milyen részei vannak a DirectX-nek. A DX több ezer API függvényt definiál, amiket az alkotók kisebb modulokra bontottak aszerint, hogy mi a feladatuk. A rendszer a Microsoft COM technológiáját alkalmazza. Ez a három betűs rövidítés a Component Object Model (COM), mely ActiveX-ként is ismert, a Microsoft által kifejlesztett technológia a komponens alapú fejlesztés támogatására. A feladata a szoftverek közti kommunikációt teszi lehetővé. Bár több platformon is megvalósították, elsősorban a Microsoft Windows operációs rendszerében használják. Az
elődje az object linking and embedding (OLE) technológia volt, ma a COM szerepét a Microsoft.NET rendszer veszi át. Fontosnak tartom itt megjegyezni, hogy a COM továbbra is használható marad, tehát nem törlik, egyszerűen csak nem fejlesztik a továbbiakban. Nézzük meg a DirectX részeit. DirectGraphics: A DX 9 verziójában egyesítették a rendszer két elemét: { DirectDraw: A kétdimenziós grafikáért felelős Direct3D: A háromdimenziós megjelenítésért felelős } DirectInput: A bemeneti eszközöket kezeli: a billenyűzetet, egeret, gamepad-ot, és minden más elképzelhető perifériát is DirectMusic: Zenelejátszás a dolga. Egy játékban például a háttérze nét a DirectMusic szolgáltatja DirectSound: Hanglejátszás és felvétel a feladata DirectPlay: A hálózati kommunikációt egyszerűsíti le. A nyolcas verzióban jelent meg DirectShow: Multimédiás anyagok megjelenítését végzi, a legtöbb lejátszó program ezt használja DirectSetup: A DirectX API összetevőinek telepítéséhez szükséges
XNA osztályok Vector2 Public Fields: X - vektor X komponense Y - vektor Y komponense Public Properties: One - egységvektor (1,1) UnitX - (1,0) UnitY - (0,1) Zero - (0,0) Public Methods: Add - Két vektor összeadás Distance - Két vektor távolsága Divide - Vektor osztása skalárral vagy vektorral Dot - Skalár szorzat Length - Vektor hossza Multiply Vektor szorzása skalárral vagy vektorral Negate Vektor negálás Normalize egységvektor Transform mátrix vagy kvaternió általi transzformálás
Vector3 Public Fields: X Y Z Public Methods: Clamp (value, min, max) Cross product jobb kezes rendszer LengthSquared hossz négyzete (ne használjunk gyökvonást, ha nem szükséges) Lerp Linear interpolation (2 vektor között) Reflect vektor tükrözése síkra Substract 2 vektor kivonása Transform vector3 transzformálás mátrixszal vagy kvaternióval GameTime Public Properties: ElapsedGameTime eltelt idő az utolsó képkocka kirajzolása óta ElapsedRealTime valójában eltelt idő IsRunningSlowly le tudjuk kérdezni, hogy lassan fut-e a játékunk TotalGameTime játékindítástól számított idő TotalRealTime játékindítástól valójában eltelt idő
2D alapok Már tudjuk, hogy mi az, amit rendelkezésünkre áll, a következő lépés az lesz, hogy elkezdjük használni. A legegyszerűbb az, ha csak két dimenzióban kell mozognunk. A legfontosabb fogalom, amit meg kell ismernünk, az a sprite. A sprite nem egy üdítő, hanem egy kép a számítógépes grafikában. Az xna-ban a sprite-ot reprezentáló objektum Texture2D néven jelenik meg. A másik fontos fogalom, az a képtér. Sokan elkövetik azt a hibát, hogy nem megfelelően gondolják át a program fejlesztésénél ezt a problémát. Ha Pc-re fejlesztek, akkor kétféle lehetőségem van. Az egyik, hogy teljes képernyős alkalmazást készítek. Ebben az esetben a képtér a képernyő felbontását jelenti. A másik eset, pedig ha egy ablakban jelenik meg a játékunk. Ekkor a képtér az ablak relatív felbontása lesz. Azért fontos, hogy relatív, mert itt megint több lehetőségünk van. Engedjük, hogy az ablak átméretezhető legyen, és vele együtt skálázzuk a játékot is, vagy beállítunk egy fix felbontást? Bármelyik lehetőséget választhatjuk. Xbox és Zune esetén viszont más a helyzet. Felbontást ugyan bármikor változtathatunk, de itt nincs lehetőség ablakban megjeleníteni a játékot, hanem a képtér a teljes kijelző lesz. Gondoljunk arra is, hogy a felhasználó lehet, hogy más felbontásban szeretné játszani a játékát, mint amiben mi fejlesztettük, tehát soha ne drótozzunk be olyan játékba fix felbontást, amit esetleg másnak is oda szeretnénk adni.
Térjünk vissza a képtérhez. Ahogy az ábrán is látható, a bal felső sarokban van az origó, és jobbra illetve lefelé nő az ( x, y ) tengely. A koordinátákat, Vector2 típusként tároljuk. Az első szám a vektor első komponense (X ), a második szám a vektor második komponense ( Y ). Mikor megadunk egy koordinátát, ahol elhelyezzük a spriteunkat ( nyilván a sprite-nak is van egy kiterjedése ), akkor az adott kép relativ koordináta rendszernek origóját jelenti. (tehát a bal felső sarkát)
Egy kis változás az eddig megszokottakhoz képest, hogy fejjel lefelé kell elképzelni a dolgokat. Feladat: Nyissunk egy új projectet.
Lehetőségünk van egy teljesen üres template-t választani, vagy pedig egy StarterKit template-t nyitunk meg, ami egy előre megírt játékot tartalmaz. Választhatunk még platformot is, de ez nekünk most annyira nem fontos, a platformok között bármikor ugrálhatunk fejlesztés közben is. Nyissunk meg egy új Windows Game Projectet. A 3.0 és 3.1 verziók között csak a video file-ok támogatása a különbség. Ha később váltani szeretnénk, nyugodtan upgradelhetjük a projectet pár kattintással. A Content Pipeline működéséről később lesz szó, most elégedjünk meg annyival, hogy nyugodtan használhatjuk különböző tartalmak betöltésére.
A Solution Explorerben tudjuk managelni a projectünket. Itt tudunk hozzáadni plusz file-okat, létrehozni egy új példányt, ha konzolra akarunk fejleszteni stb. Ezeket a lehetőségeket később fogjuk megnézni. Létrejött az új project. Kaptunk egy üres vázat a kezdéshez. A kódunk a Következőképp kezdődik. Feltételezik, hogy mindent használni szeretnénk, de persze ez nem így van. Nyugodtan szedjünk ki minden olyan using-ot, amit most nem használunk. Elég ha az marad amit használni akarunk. Ha nem akarunk ezzel foglalkozni, akkor benn is hagyhatjuk. A fordított project méretét kis mértékben fogja csak megnövelni. A következő lépés legyen a kép betöltése, és közben majd látni fogjuk, hogy ez a program váz pont úgy néz ki, mint ahogy az előadás slide-on a játékciklust láttuk. START -> Initialize -> Load Content -> (Update -> Draw )-> Unload -> Exit
Adjuk hozzá a képet, amit ki szeretnénk majd rajzolni. Lehetőleg ne jpg, hanem valami kulturált kép formátum legyen, ahol alfa csatornát is tudunk tárolni. Pl: a png tökéletes erre a célra. Alpha csatorna: az átlátszósághoz kell. (később lesz róla szó részletesen is) Ha mindent jól csináltunk, meg is jelent a hozzáadott sprite. Ha szeretnénk módosítani ennek a konkrét sprite-nak a tulajdonságait, akkor a property ablakban tudjuk módosítani.
Ha a property window alapból nem látszik,akkor kapcsoljuk be. Ezeket a billentyű kombinációkat érdemes fejben tartani, ha nem szeretnénk mindig kattintgatni. Megnézhetjük, hol is található a sprite, illetve átmásoljuk e, az Output Directoryba. Ez azért fontos, mert ha töröljük a Contentek közül a file-t, akkor a winchesterről is el fog tűnni, ha a Do not copy opció van érvényben. Ez egyébként az alap beállítás.
A következő lépés, hogy elkezdjünk kódolni. A Visual Studio szerencsére itt is a segítségünkre van. Használjuk bátran az IntelliSense-t. Nem csak kiegészíti az elkezdett szót, de egy kis leírást is kapunk róla, hogy mire jó, és hogy lehet paraméterezni ( ha lehet ). Tehát, ez egy breakpoint nevű kétdimenziós textura objektum lesz, amit az ablakunk bal felső sarkába helyezünk. Be is kell töltenünk a képet a memóriába, magától nem fog oda kerülni. Töltsük be, és hivatkozzunk rá a nevén.
Nincs más dolgunk mint kirajzolni. beállítjuk a háttér színét. kész is vagyunk. Jaigen..az eredmény: Eddig egyszerű,de hamarosan folytatjuk.