INPUTKEZELÉS
INPUTKEZELÉS Egyszerű témának tűnhet, de sok buktatót rejt a megfelelő inputkezelés egy program fejlesztése során. Jelenleg 5 féle input eszközt különböztetünk meg, az xna első megjelenésekor pedig mindössze 2db-al kellett számolni. A következőkről van szó: billentyűzet egér gamepad touch multi touch Az leghagyományosabb inputkezeléshez, az XNA Keyboard osztályát fogjuk használni, ami a Microsoft.XNA.Framework.Input névtérben található meg. tipp: ha valami olyasmit írsz, ami nincs usingolva, de használni tudod, hogy benn van a frameworkben, a megfelelő szó után CTRL+. hatására magától beilleszti a Visual Studio a megfelelő usingot. A Keyboard osztály egy statikus methódusán (GetState) keresztül tudhatjuk meg a billentyűk állapotát. A GetState() ,ahogy a neve is mutatja az eszköz aktuális állapotának lekérésére szolgál. Mivel ez egy bináris dolog , a két lehetséges eset a lenyomott illetve a felengedett billentyű.
Pl. azt szeretnénk, hogy végrehajtódjon egy esemény egy billentyű lenyomására, a következőt tehetjük: if (Keyboard.GetState().IsKeyDown(Keys.A)) // és erre reagálunk valamit, pl kilépünk az alkalmazásunkból this.Exit();
Tehát, ha igaz állapotot kaptunk vissza, azaz le volt nyomva az A billentyű a megfigyelés idejében, akkor végrehajtjuk az Exit()-et.
Ehhez egy kis segítség: public void inputhandler() { KeyboardState keyboardState = Keyboard.GetState(); if (keyboardState.IsKeyDown(Keys.Left)) ringsPosition.X -= ringsSpeed; if (keyboardState.IsKeyDown(Keys.Right)) ringsPosition.X += ringsSpeed; if (keyboardState.IsKeyDown(Keys.Up)) ringsPosition.Y -= ringsSpeed; if (keyboardState.IsKeyDown(Keys.Down)) ringsPosition.Y += ringsSpeed; }
Ne felejtsük el meghívni amit írtunk. Anélkül nem fog menni
Egér:
Az egér kezelése, nem túl meglepő módon még sokkal egyszerűbb mint a billentyűzetkezelés. Mivel a képernyőn kell mozognunk, ezért csak két koordinátánk lesz, ami ami a kurzor aktuális helyzetét mutatja. void SetPosition(int x, int y) Persze a fenti állítás egészen addig igaz, amíg arra vagyunk kíváncsiak, hogy hol is található épp az egér kurzor. Ha azt szeretnénk elérni, hogy valamire rá tudjunk kattintani, az már egy picit bonyolultabb feladat. Ezen kívül természetesen tudunk kattintani, tehát az egér gombjait is kezelnünk kell valamilyen formában.
Feladat: módosítsuk az előző kódunkat úgy, hogy az egérrel is irányítani tudjuk a spriteunkat. Egy kis segítség: MouseState mouseState = Mouse.GetState( ); if(mouseState.X != prevMouseState.X || mouseState.Y != prevMouseState.Y) ringsPosition = new Vector2(mouseState.X, mouseState.Y); prevMouseState = mouseState;
Gamepad
A GamePad egy kicsit összvér jószág, hiszen egyszerre digitális és anolog kontroller. A gombjai nyilván digitálisak, a stickek pedig anológ módon működnek, azaz több átmeneti fokozat is lehetséges a két végállapot között. Hogy a dolog még bonyolultabb legyen, a stickeket le is lehet nyomni.Ekkor pont úgy működnek, mintha egy sima gombot nyomtunk volna le. Biztosan mindenki kitalálta, ha egér és billentyűzet kezelő osztály is volt már, akkor lesz egy a gamepadhoz is. Ha veszünk egy kontrollert a PC-hez, akkor nemcsak Xboxon, hanem rögtön a gépen is tesztelhetjük az irányítást. Persze enélkül is teljes az élet, de elég széles lehetőségeket nyit ki az ember előtt, ha még jobban tudja irányítani a játékokat.
Van még valami amit szem előtt kell tartania a kódolás során. Ez nem más mint a PlayerIndex. Egy játékkal egyszerre egy Xboxon 4ember játszhat, 4 kontrollerrel. Ezeket jelöljük sorba Player 1-4ig. Ha vezeték nélküli Xbox 360 kontrollerről van szó, akkor egy olyan Property-t is meg kell jegyeznünk, amivel alapból nem foglalkoznánk. Ez pedig az eszköz állapota, hogy csatlakoztatva van, vagy sem. Gondolunk kell arra is, mitörténik olyankor, ha lemerül az elem. Általában ez gyakran megtörténik játék közben,mert az emberek csak akkor cserélneke elemet, ha az már teljesen lemerült. Ilyenkor nem dobatjuk el az addig elért játékállást, hanem lehetőséget kell adni a játékos számára, hogy ismét vissza csatlakozzon a játszmába. Vegyünk egy egyszerű példát. A programunkban egy olyan sprite-ot akarunk mozgatni ami egy méhecskét szimulál. Szerencsére A gomb van az Xboxon is, ezért most is ezt fogjuk használni . Igaz, teljesen fapados megoldást választunk.
Megvizsgáljuk, hogy az A gombot lenyomták , vagy sem. Ha igen, akkor a méhecskénk hirtelen zümmögni kezd, a kontroller rezeg és 2szer olyan gyorsan halad tovább… ha elengedjük, akkor kikapcsolódik a vibráció, és újra normál sebességgel fog repülni. Ez a méhecske nitro. GamePadState gamepadState = GamePad.GetState(PlayerIndex.One); if (gamepadState.Buttons.A == ButtonState.Pressed) { beePosition.X += beeSpeed * 2 * gamepadState.ThumbSticks.Left.X; beePosition.Y -= ringsSpeed * 2 * gamepadState.ThumbSticks.Left.Y; GamePad.SetVibration(PlayerIndex.One, 1f, 1f); } else { beePosition.X += ringsSpeed * gamepadState.ThumbSticks.Left.X; beePosition.Y -= ringsSpeed * gamepadState.ThumbSticks.Left.Y; GamePad.SetVibration(PlayerIndex.One, 0, 0); }
TouchPad
A sima Zune , az egy keményebb tészta, ugyanis két lehetőségünk van. Egy nehezebb, és egy könnyebb.A könnyebb lehetőség, hogy a touchpadot hagyományos gombként használjuk, ekkor ugyan úgy viselkedik mintha a GamePadot használnánk. A másik lehetőség, ami játékélmény szempontjából sokkal előnyösebb, ha TouchPadként használjuk. Ebben az esetben persze sokkal több problémát kell megoldanunk, és rengeteg állapotot kell kezelnünk. Ez sem túl bonyolult,de azért ahoz képest, amilyen egyszerű volt mondjuk a billentyűzetet vagy az egeret használni, sokkal nagyobb probléma.. Érdemes lehetőséget hagyni a játékosok az
Zune HD Touch Screen Azért , hogy az életünk „még könnyebb legyen” kedvenc kézi konzolunkból már két féle verzió is kapható. Persze nem itthon, hanem amerikában.
Jogi megjegyzések: Jelen XNA írásra, és ennek a sorozatnak a többi részére a Creative Commons-licencek vonatkoznak. A lényeg, hogy szabadon másolhatod, terjesztheted, az szerző nevének feltűntetésével. A szerző engedélye nélkül, anyagi haszonszerzés céljára semmilyen formában nem használható. Azaz, pl. nem tarthatsz belőle fizetős tanfolyamot, nem adhatsz ki ez alapján könyvet(kivéve ha ingyenes könyv), illetve semmilyen más módon nem használhatod fel anyagi hasznon szerzés céljából. Fontos megjegyzés: a leírások és a tutorialok folyamatosan bővülnek, illetve a hibákat folyamatosan javítom ha találok egyet. A legfrissebb verziót a devportal.hu/xna oldalon találod.