Ako će ovo biti projekat za učenje, ne preporučujem ništa što ima skriptovane sekvence (dečak ugleda zamak itd.); ne preporučujem ništa što podrazumeva uništavanje neprijatelja (te stoga zahteva dinamičku kreaciju i uništavanje entiteta itd.); ne preporučujem ništa što zahteva puno rada. Na osnovu ličnog iskustva znam da ljudi najbolje reaguju na kod koji odmah daje vidljive rezultate na ekranu.
Osnovna poenta je da odradite (odradimo) neku igru koja ima "gušta", ali se lako programira, sa malim kodom. Baš zato, Arkanoid/space invaders igre su dobre, ali Pong je još bolji, iz prostog razloga što se radi o samo 10ak varijablica. Kostur Ponga može da bude gotov praktično odmah, a posle toga možemo da ga proširujemo i da tako učite osnove programiranja igara.
E pa sad ćete da čujete moju ideju za jedan "tutorial" projekat,
VectorBall, koji sam ja sam zakuvao a drage volje bih ga odradio sa vama.
(Pod pretpostavkom da svi znaju kako se kreira projekat i kako se podešavaju komponente, reference, properties različitih klasa. Ako neko ne zna, prvo bismo to prešli.)
1) Počećemo sa najosnovnijim Pongom, tako što ćemo napraviti jednostavne mehanizme kretanja lopte i reketa. Input ćemo regulisati preko keydown i keyup, a grafiku preko Line procedura, dakle preko linija. U ovoj verziji neće biti zvuka. Malo ćemo da poradimo na fizici kretanja i odbijanja lopte u 2d. Ali samo malo. Gameplay će biti procesovan putem Timer eventa.
2) Sledeći korak će biti da naučimo kako ubaciti API procedure u naš kod. Za početak, sndPlaySound za zvuk, BitBlt za grafiku, i GetAsyncKeyState za input. I tako ćemo dobiti elementarnu grafiku i zvuk. Ja ću da uradim grafiku za rekete i za loptu.
3) Malo "naprednog" programiranja. U ovom koraku ćemo da naučimo kako da isfragmentišemo kod u module da bi bio čitkiji, i kako da se otarasimo tajmera i procesujemo mehaniku igre u Loop petlji. Zatim ćemo prebaciti varijable reketa i lopte u odvojene UDTe (User Defined Types) kako bismo naučili strukturu podataka.
(Ovde bismo mogli da naučimo da crtamo transparentne sprajtove.)
4) Četvrti korak će biti dodavanje specijalnih poteza i powerupova, kao što je mogućnost da se lopta lepi za reket, da se reket širi i skuplja, itd. Takođe ćemo poraditi na fizici i matematici da bismo dodali malo šmeka - npr. reketi koji imaju inerciju, pojavljivanje "crne rupe" koja privlači lopticu u nasumičnom smeru, itd. Funkcija ovog dela je da odradimo pozicioniranje petlji i "if-else-end if"-ova u kodu.
5) Ovde bi već bio red da igri dodamo početni meni, za početak sa samo 2 dugmeta ("New Game" i "Exit"), ali u ovom delu ću detaljno pokriti problematiku interfejsa. I nemojte misliti da ćete koristiti ScreenButton kontrolu!
6) Sledeći korak će biti prebacivanje igre u treću dimenziju. Ovde ne mislim na Direct3D. Nešto malo matematike i par prostih grafičkih manipulacija će učiniti da igra ima 3D izgled. Sve što je potrebno je ubacivanje blage perspektive (crtanje terena kao trapezoida umesto kao pravougaonika) i dodavanje "senke" ispod reketa.
I, pre nego što se okrenete, imaćemo simpatičnu igricu za dva igrača.
7) Od ovog trenutka nadalje ubacićemo podršku za DirectInput kako bismo naučili osnove DirectXa.
8) Ako neko posle ovoga bude zainteresovan za dalji rad, možemo da radimo DirectSound i DirectDraw podršku. Ali to će već biti Advanced Class.
Kada budemo imali završeni ovaj mali projekat, mogli bismo da pređemo na fazu II moga plana a to je da vas naučim ponešto o OO programiranju i klasama, i o ubacivanju istih u "našu" igru, nakon čega bismo "rekete" zamenili "igračima", dodali AI, i na kraju dobili neku svemirsku sportsku igru.
Svaki korak ću detaljno dokumentovati, i to baš ovde, na forumu, tako da bi ovo mogao da bude sjajan tutorial za sve buduće VB Game Programmer Wannabes. Postavljaću i screenshotove ako treba.
Od svih prisutnih će se očekivati da daju rešenja na probleme koje ja postavljam, a nikako da samo rade copy-paste koda koji će ovde biti rađen. Takođe bismo mogli da vežbamo programiranje u grupi i da delimo zadatke. Ako naiđete na nešto što ne možete sami da uradite, naravno da ću to detaljno objasniti uz primere.
Pa.... šta mislite? Je li neko za to? Ako jeste, otvoriću nov topic koji će biti rezervisan za ovaj projekat.
In a game of chess you must never let your opponent see your pieces - Zap
Brannigan