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.
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(); } }
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.
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; }
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.
Pages:
Leave a Comment