Nakon dugo godina vladavine windows forms aplikacija sa pojavom Windows 8 i 8.1 sa novim korisničim interfejsom pod kodnim imenom metro design, zvanični naziv je Modern UI. U razgovoru sa Branimirom došli smo na ideju da napravimo jednu windows 8.1 aplikaciju i kroz jednostavan primer istražimo i upoznamo tehnologiju. Ideja je bila da napravimo jednostavnu igru koja bi radila na windows 8 operativnom sistemu. U pitanju je pojednostavljena verzija klasika Space Invaders. Cilj nam je bio upoznavanje sa novom tehnologijom i njenim mogućnostima, tako da nam nemojte zameriti što igra nije bolja.
Instalacija Visual Studio Express 2013
Primer je napravljen korišćenjem Visual Studio Express 2013 koji je besplatan i sasvim dovoljan za razvoj ovakve igre i demonstraciju nove tehnologije kroz njen razvoj. Napomenućemo da je sa Express 2013 verzijom moguće raditi kompletan razvoj u komercijalne svrhe, npr. može se napraviti aplikacija i postaviti za prodaju na Windows Store-u. Setup možete preuzeti ovde, sam proces instalacije je jednostavan.
Nakon uspešno završenih instalacija bilo je potrebno odabrati “pravac” u razvoju modernih aplikacaija za windows 8 (8.1): Javascript, HTML, CSS ili C#, XAML. Pod pretpostavkom da XAML nudi bolje performanse grafike odlučili smo se za C# i XAML.
U međuvremenu nas je Microsoft obradovao odlukom da Visual Studio Professional postane besplatan pod novim imenom Visual Studio Community.
Space Invaders
Sada bi bilo u redu da se posvetimo malo više samoj igri.
Igru čine jedan vanzemaljac (invader) koji se kreće odozgo na dole i brod (space ship) koji se kreće levo desno i ima mogućnost pucanja. Cilj je da ubijemo vanzemaljca, tj. pogodimo ga metkom pre nego što stigne do broda.
Igru je moguće igrati na dva načina:
1. korišćem tastature (tasteri za navigaciju – gore, dole, levo, desno)
2. dodirom (gestures), naravno ukoliko je podržano na uređaju
Struktura klasa (The game engine)
Entiteti koji čine igru su brod, metak, vanzemaljac, pravougaonik po kome se kreću brod i vanzemaljac. Osnovna klasa je klasa Game.cs koja upravlja igrom, kreira učesnike igre, vodi računa o tome da li je igra startovana/završena. U njoj se nalazi metoda Loop(), game loop je uobičajan patern u programiranju igara i može se naći u većini igara, više o ovom paternu možete pročitati ovde. Za dinamičnost igre potreban nam je timer, koji smo implementirali u klasi Timer.cs. Startovanjem igre pokreće se timer koji zove Loop() metodu u određenom vremenskom intervalu. Svaki od učesnika igre je odgovoran za svoje stanje. Stanje kontrolišu i menjaju njihove Update() metode, koje se pozivaju u game loop-u. U našem slučaju učesnike igre definišu tri klase Invader.cs, Bullet.cs, Ship.cs koje nasleđuju apstraktnu klasu Sprite.cs. U Loop() metodi proveravamo i da li je igra završena, metoda CheckStatus(). Kada metak pogodi vanzemaljca ili vanzemaljac stigne do broda pre nego metak do njega, zaustavlja se timer, označava se kraj igre i prikazuje se odgovarajuća poruka.
[csharp]
public void Loop()
{
_ship.Update();
_invader.Update();
_bullet.Update();
GameStatus gameStatus = CheckStatus();
if (gameStatus == GameStatus.EnemyCrashedIntoSprite)
{
timer.Stop();
Window.Current.CoreWindow.KeyDown -= KeyboardHandler;
Message = "Game over!";
gameOver();
}
if (gameStatus == GameStatus.BulletCrashedTheEnemy)
{
timer.Stop();
Window.Current.CoreWindow.KeyDown -= KeyboardHandler;
Message = "Your are the winner! :)";
gameOver();
}
}
[/csharp]
Gestures
Jedan od intresantnijih i izazovnih delova u igri bio je implementacija gestures (mogućnost igranja na touchescreen ekranu, dodirom). Ovo je bila novina za mene i nije bilo tako jednostavno implementirati jer je logika nešto drugačija od onoga na šta sam navikao.
[csharp]
rectangle.ManipulationMode = ManipulationModes.All;
rectangle.ManipulationDelta += rectangle_ManipulationDelta;
rectangle.Tapped += rectangle_Tapped;
void rectangle_Tapped(object sender, TappedRoutedEventArgs e)
{
SetDirectionX = 0;
Fire();
}
public void rectangle_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
{
StopSprite = false;
SetDirectionX = Math.Sign(e.Delta.Translation.X) * 2 * Utility.ATOM_SIZE;
}
[/csharp]
Kompletan source code možete naći našem github repo u folderu InvadersWin8.
Sledeći korak bio bi mogućnost igranja naše igre na mobilnom uređaju (windows phone 8, 8.1) kao i razvoj nešto kompleksnije igre za windows 8, 10.