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 .