univerzitet u niŠuunarske... · se sve mora „pešaka“ odraditi. s druge strane, xna okruženje...
TRANSCRIPT
UNIVERZITET U NIŠU
PRIRODNO-MATEMATIČKI FAKULTET
DEPARTMAN ZA RAČUNARSKE NAUKE
2D video igra u XNA okruženju
MASTER RAD
Mentor: Student:
dr Marko D. Petković Luka Lovre
Niš, 2017.
1
Sadržaj
Sadržaj ................................................................................................................................................. 1
Uvod .................................................................................................................................................... 2
1. XNA okruženje ................................................................................................................................. 3
1.1 O XNA okruženju ..................................................................................................................... 3
1.2 Osnove pokretanja okruženja ................................................................................................. 6
1.3 Tok rada .................................................................................................................................. 7
1.4 Učitavanje sadržaja ................................................................................................................. 8
1.5 Ažuriranje .............................................................................................................................. 11
1.6 Iscrtavanje ............................................................................................................................. 12
1.7 Kombinovanje tri metode ..................................................................................................... 15
1.8 Input ...................................................................................................................................... 16
1.9 Muzika ................................................................................................................................... 18
1.10 Animacija ............................................................................................................................... 19
2. 2D Motion Capture ....................................................................................................................... 22
2.1 Osnove praćenja pokreta ...................................................................................................... 22
2.2 Zašto Motion Capture? ......................................................................................................... 27
2.3 Implementacija ..................................................................................................................... 28
2.4 Upotreba u igri ...................................................................................................................... 34
3. Rukovođenje resursima ................................................................................................................ 35
3.1 Učitavanje tekstura ............................................................................................................... 35
3.2 Učitavanje mape ................................................................................................................... 36
4. Struktura igre ................................................................................................................................ 38
4.1 Glavni ciklus igre ................................................................................................................... 38
4.2 Objekti unutar video igre ...................................................................................................... 39
5. Funkcionalnosti video igre ............................................................................................................ 45
5.2 Interakcija sa objektima ........................................................................................................ 45
5.3 Stanje inspekcije ................................................................................................................... 46
5.4 Ponašanje likova unutar igre ................................................................................................. 48
6. Pomoćni alati za rad ...................................................................................................................... 49
6.1 2D Motion Capture aplikacija ............................................................................................... 49
6.2 Editor mape ........................................................................................................................... 51
6.3 Učitavanje slika ..................................................................................................................... 52
7. Zaključak........................................................................................................................................ 54
8. Literatura....................................................................................................................................... 55
2
Uvod
Ovim radom je obuhvaćen proces pravljenja 2D video igre unutar XNA okruženja. Osim
specifičnosti konkretnog XNA okruženja i šta pruža izradi 2D igara, ovaj rad će se pozabaviti i
svim dodatnim alatima koji su napravljeni u svrhu poboljšanja igre. Alati kao sto su 2D Motion
Capture, za praćenje pokreta sa kamere i animiranje figura unutar igre. MapEditor alat za
manipulaciju objektima unutar igre i olakšavanje samog procesa dizajniranja mape unutar
video igre, kao i alati za izradu 2D tekstura i njihovu obradu kako bi se prilagodili video igri.
Kroz ovaj rad biće pokriven svaki aspekat pravljenja 2D video igre, ne samo konkretne izrade,
već i planiranja, ideja, promene planova, menjanje koda, refaktorisanje, kao i sam proces
produkcije. Zato što za izradu nije korišćen već gotovi video game engine, kao što bi bio slučaj
da je korišćen Unity ili GameMaker, morao se napraviti 2D engine, pošto XNA okruženje
podržava samo osnovne operacije.
3
1. XNA okruženje
1.1 O XNA okruženju
Mikrosoftovo XNA okruženje (rekurzivni akronim od XNA’s not acronymed) je napravljeno
eksplicitno za izradu video igara (Slika 1.1). Mikrosoft je već imao DirectX okruženje za izradu
igara ali XNA je predstavljao korak bliže ka izradi manjih kao i indie video igara. U prilog tome
je išlo što je XNA rađen u .NET okruženju, čime je znatno olakšan početak izrade video igra
kod programera koji ne žele da zalaze u dubine C++-a kao što je to slučaj sa DirectX
platformom. Sam rad u XNA okruženju se izvršava preko Visual Studio-a, u C# programskom
jeziku.
Slika 1.1
XNA je dizajniran tako da može da bude podržan na više Mikrosoftovih platforma, kao što su
Windows, Xbox 360 kao i Windows Phone. XNA je osnovna platforma za Xbox Live Indie
Games, koja je bila popularna platforma na Xbox-u za izbacivanje indie igara raznog tipa.
XNA je prvi put izbacio alate za izradu igara još 2006 godine i od tada je dosta poznatih, manjih,
igara izašlo pomoću njega. Iako je zvanično podržavanje XNA-a završeno 2013 godine i dalje
se proizvode video igre pomoću njega.
Neke od popularnijih video igara napravljene uz pomoć XNA okruženja:
Chime (2010), Bastion (2011), Terraria (2011), Fez (2012), Owlboy (2016), Stardew Valley
(2016)
4
Terraria (2011)
Fez (2012)
Stardew Valley (2016)
5
Kao što vidimo, XNA je i dalje od prevaziđenog, tome je još i pripomoglo zato što se godinama
sakupilo dosta pitanja i odgovora na internetu o raznim rešenjima problema, a i sama
dokumentacija je detaljno odrađena.
XNA okruženje nema u sebi sadržan kompleksni game engine, koji omogućava obradu
osvetljenja, kolizije objekata, pronalaženje putanja između dve tačke i ostale pogodnosti, pa
se sve mora „pešaka“ odraditi. S druge strane, XNA okruženje nije kompleksno za početnike i
samim tim što ne daje previše funkcionalnosti „iz kutije“, daje samom dizajneru igre i
programeru dodatnu slobodu za eksperimentisanje.
Posle zatvaranja zvanične podrške XNA okruženja, par nezavisnih projekata je nastavilo rad
na XNA okruženju i napravilo poboljšanja za novije sisteme, kao sto su Android telefoni i iOS.
Mono Game (Slika 1.2) okruženje je fokusirano na adaptiranju XNA okruženja za ostale, novije
sisteme, dok je FNA re-implementacija svih osnovnih XNA funkcija u cilju očuvanja originalnog
XNA koda. ANX okruženje je ugradnja podrške za Linux kao i za PlayStation unutar XNA
okruženja.
Slika 1.2
Za ovaj rad je izabrano XNA okruženje zato što je intuitivno za rad a i daje mogućnost izazova
da se engine video igre napravi gotovo ispočetka, i time dobije bolji uvid u sve procese kroz
koje video igra prolazi.
6
1.2 Osnove pokretanja okruženja
Kako bi se XNA okruženje koristilo unutar projekta potrebno je prethodno da se instalira
Microsoft XNA Framework Redistributable. Posle instalacije, sve neophodne biblioteke su
dostupne za rad unutar Visual Studio-a.
U Visual Studio-u zatim treba da se izabere novi XNA game projekat kako bi se napravio šablon
za izradu video igara (Slika 1.3). Svaki projekat za video igre unutar XNA sadrži dva pod-
projekta. Jedan služi za celu logiku igre, a drugi za smeštanje sadržaja igre, kao sto su teksture
i zvukovi. Unutar prvog projekta se pozivaju metode za rad sa sadržajem iz drugog projekta za
sadržaj. Ovim pristupom je odvojen sadržaj od logike igre.
Slika 1.3
XNA okruženje je rađeno u osnovi sa .NET okruženjem, verzijom 4.0. Rad sa kasnijim verzijama
.NET okruženja nisu podržani u osnovnoj verziji XNA okruženja. Poslednji Visual Studio koji
podržava XNA okruženje je Visual Studio 2015, iako postoje i manuelne prepravke kako bi XNA
radio i na Visual Studio 2017 verziji.
7
1.3 Tok rada
Kada se napravi novi Game projekat sa XNA okruženjem, napravljene su tri osnovne metode
svakog XNA projekta: Load, Update i Draw (Slika 1.4).
Dok se Load metoda poziva samo na početku inicijalizacije, Update kao i Draw metode se
pozivaju konstantno u toku izvršavanja video igre. Broj puta koliko se Update i Draw metode
izvršavaju je zavistan od performansi računara, odnosno koliko brzo može da prođe kroz te
metode i napravi ponovni krug. Standardna brzina izvršavanja tih metoda unutar video igara
je šezdeset puta u sekundi. Idealno je da se brzina izvršavanja logike igre kao i njenog
prikazivanja dešava istom brzinom kao i brzina osvežavanja monitora, kako bi video igra tekla
u „ritmu“ monitora. Ovim se izbegava efekat kašnjenja slike, unutar Draw metode, i dobijaju
se preciznije rezultati interakcije, unutar Update metode.
Slika 1.4
8
1.4 Učitavanje sadržaja
Većinu memorije jedne video igre sačinjava njen sadržaj. Sadržaj mogu sačinjavati razni
elementi ali su uglavnom slike i zvuci.
Unutar XNA projekta sav sadržaj je smešten unutar odvojenog projekta. GameContent
projekta. Za ovaj projekat su od sadržaja korišćene teksture, zvukovi kao i obični tekst fajlovi.
GameContent projekat nije obavezan da se koristi. Mogu se koristiti i nezavisni eksterni folderi
i u kojima će biti smešteni svi potrebni podaci za igru, i onda posebnim metodama da se ti
podaci učitavaju unutar video igre.
Iako je ovakav pristup validan, nije preporučen. XNA GameContent projekat osim skladištenja
svog sadržaja radi konvertovanje kao i učitavanje u igru njegovim ugrađenim i optimizovanim
algoritmima.
Sve slike koje su ubačene u GameContent projekat se čuvaju unutar projekta u njihovom
formatu (jpeg, png, bmp). Kada se projekat izvršava GameContent konvertuje sve slike u xnb
format i onda njega učitava u samu igru.
Xnb format nije dostupan za čitanje standardnim alatima za pregled slika zato što je
kompresovan i optimizovan da se učitava unutar XNA video igre. Ovaj format je do par puta
manji od originalne slike i učitava se isto toliko puta brže unutar same video igre.
Kada se slika učitava unutar igre ona se dodeljuje odgovarajućoj teksturi, koja se iscrtava na
ekranu. Teksture u XNA okruženju su klase Texture2D. Kada se slika učita preko
GameContent projekta ona se, posle konverzije u xnb format, brzo dodeli Texture2D klasi.
Da bi se isti efekat postigao bez da se prolazi kroz GameContent projekat slika mora da se, u
kom god da je formatu, pretvori u Texture2D objekat, tj. da zadovoljava karakteristike
Texture2D objekta.
Texture2D objekat čuva sliku kao jednodimenzionalni niz njenih boja. Osobine koje
karakterišu sliku, osim samih boja su i visina i širina. Sa informacijama o širini i visini
Texture2D od jednodimenzionalnog niza pravi dvodimenzionalnu sliku.
Sa druge strane je slika koju treba da učitamo u igru i da je „manuelno“ konvertujemo u
Texture2D. Učitavanje slike se izvršava metodom Image.FromFile("putanja do
slike"). Bitmap je standardna klasa .NET okruženja i ona sadrži informacije slike unutar
dvodimenzionalne matrice. Boja svakog piksela unutar slike je sačuvana u matrici sa
informacijom o poziciji u odnosu na x i y osu.
9
Jednostavnim algoritmom za konverziju podataka iz Bitmap klase u podatke Texture2D
klasu možemo učitavati sliku u igru (isečak iz koda dole). Jedini problem kod ovakve metode
je da je proces mnogo sporiji od standardnog učitavanja XNA optimizovana slike xnb formata.
private Texture2D LoadFromPNG(string name, string types, int frameNumber){ Texture2D tex;
using(Bitmap image = new Bitmap(Path.Combine("MapEditor output", name, types,
frameNumber + IO.PictureFormat))){
var sourceRectangle = new Rectangle(0, 0, image.Width, image.Height); tex = new Texture2D(Game1.Instance.GraphicsDevice, sourceRectangle.Width,
sourceRectangle.Height);
var data = new Color[sourceRectangle.Width * sourceRectangle.Height]; for(var y = 0; y < image.Height; y++){ for(var x = 0; x < image.Width; x++){ data[sourceRectangle.Width * y + x] = new Color(image.GetPixel(x, y).R,
image.GetPixel(x, y).G, image.GetPixel(x, y).B, image.GetPixel(x, y).A);
} } tex.SetData(data); } return tex; }
Zašto bi smo onda učitavali slike na tako spor i nestandardan način unutar video igre? Projekat
ovog rada kombinuje oba načina. Zato što standardan, efikasniji i brzi način pretvara slike u
xnb format, one ne mogu da se menjaju van XNA projekta. To nije problem programeru koji
ima pristup kodu ali je problem za običnog korisnika video igre. Kako bi svaki korisnik mogao
da ima pristup svim resursima koji se prave za video igru, moraju resursi da budu u dostupnim
formatima, kao što su png i ostali formati za sliku koji se mogu otvoriti u MS Paint-u ili u
složenijim programima kao što je Adobe PhotoShop ili drugim (Slika 1.5 – Paint.NET).
10
Slika 1.5
Dati svakom korisniku moć da menja i ubacuje teksture unutar igre je veoma bitna stvar zato
što se time podstiče personalizacija video igre kao i deljenje kreacija sa ostalim igračima.
Mogu se praviti celi kompleti drugačijih slika kako bi se celokupna atmosfera igre promenila,
ili se može promeniti samo izgled jednog šešira unutar igre. Bitno da se takve promene mogu
izvršiti lako i brzo, i vredno je čekanja dodatnog vremena za učitavanje teksture.
Ostali fajlovi koji su korišćeni za video igru unutar GameContent projekta su muzički fajlovi.
MP3 format za muziku kao i WAV format za zvukove i specijalne efekte kao što su zvuk pucnja,
koračanja i ostali.
Od ostalog sadržaja za video igru projekat koristi i tekstualne fajlove, obične .txt ekstenzije. U
njima se čuvaju podaci o objektima kao i njihove lokacije. Umesto da su lokacije upisane
direktno u kod, učitavane su iz ovih txt fajlova. Njihovom promenom se menjaju osobine kao
i pozicije predmeta unutar igre. Takođe su dostupni za manipulaciju od strane korisnika.
11
1.5 Ažuriranje
Unutar Update metode se izvršava celokupna logika video igre. Ona se izvršava, u proseku,
šezdeset puta u sekundi. Kod nekih igara umesto jedne Update metode postoje dve, jedan
Update za logiku igre a drugi update da odrađuje fiziku unutar igre. Ovakav način se koristi
samo kod igara kod kojih je deo za obradu fizike znatno veći nego u ovom projektu.
Fizika igre podrazumeva sve događaje koji su „nezavisni“ od tipa igre. Takvi događaji u
projektu su događaji sudara dva objekta, tj. provera da li se u bilo kom trenutku dva objekta
sudaraju.
Logika igre podrazumeva događaje koji su specifični za igru. Šta se dešava kada se dva objekta
sudare, ako je to slučaj sa metkom i buretom benzina onda logika igre odlučuje da se tada
aktivira animacija eksplozije (Slika 1.6). Logika igre rukovodi svim slučajevima i interakcijama
među objektima u igri.
Slika 1.6
Update metoda, osim što obavlja fiziku i razrešava razne slučajeve pokrivene u igri, pomera i
figure. Kada se u Update metodi stavimo da se pozicija figure promenila za 1 piksel u x osi
onda će se, prilikom iscrtavanja te figure, ona nacrtati na promenjenoj poziciji.
12
1.6 Iscrtavanje
Da bi se bilo šta iscrtavalo na korisničkom ekranu unutar XNA okruženja, koristi se Draw
metoda. Ona se, poput Update metode, ponavlja u proseku šezdeset puta u sekundi. Svaki
put kada se izvrši Draw metoda, ekran se osveži i prikaže se nova slika. Ako se slike osvežava
manje od šezdeset puta ili čak manje od 30 puta, dolazi do efekta kočenja, gde se iz jednog
stanja slike preskače u drugi, bez jasne linije kako. Postoji i opasnost kada se slika osvežava u
nejednakim intervalima, šezdeset puta u jednom trenutku a 45 puta u drugom. Ovako se
postižu čudni pokreti koji daju igraču osećaj nejednakosti pokreta. Idealno je da je broj
osvežavanja što veći ali ne po cenu da ne može da bude konstantan u toku trajanja cele igre.
Pre bilo kakvog iscrtavanja na ekran mora se prvo osigurati da je prethodno iscrtan ekran
očišćen. Pre početka svakog iscrtavanja scene „kanvas“ se prazni
Graphics.GraphicsDevice.Clear(Color.White) metodom. Ova metoda postavlja
boju celog ekrana na belu, u ovom slučaju. Svaki region ekrana na kome nije iscrtan predmet
obojiće se u belu boju.
Zatim se poziva metoda SpriteBatch.Begin kojim se označava početak iscrtavanja
tekstura na ekranu. Završetak iscrtavanja se označava pozivanjem metode
SpriteBatch.End. Pozivi za samo iscrtavanje tekstura se izvršavaju između ove dve
metode. Redosled iscrtavanja tekstura je bitan zato što on određuje kod preklopljenih
tekstura koja će biti ispre a koja iza.
Iscrtavanje teksture se izvršava metodom SpriteBatch.Draw. Ova metoda kao prvi
parametar uzima Texture2D objekat koji predstavlja teksturu objekta. Drugi parametar je
Rectangle klase. U njemu se zadaje pozicija početka iscrtavanja teksture, u
dvodimenzionalnom prostoru, kao i kolika će širina i visina iscrtane teksture biti. Osim ovih
primarnih parametara za osnovno iscrtavanje postoje još parametri za rotaciju, za centar
rotacije, za transparentnost teksture kao i za dodatne vizualne efekte.
13
U svakom trenutku video igre potrebno je iscrtati velike količine zasebnih tekstura, od kojih
se neke pokreću i menjaju svoju poziciju, preklapajući se sa drugim teksturama. Treba se
zadati određeni parametar koji će da odlučuje koje teksture se iscrtavaju pre drugih, i kojim
redosledom, u suprotnom će da se iscrtavaju redosledom kojim su pozivane, a to je prilično
nasumično (Slika 1.7).
Slika 1.7
Kamera video igre gleda na scenu iz ptičje perspektive. To znaci da su objekti koji se nalaze pri
vrhu ekrana dalji a objekti koji su niže na ekranu, bliži. Da bi se postigao ovakav redosled
iscrtavanja objekata svakom objektu je dodat parametar koji daje njegovu poziciju u odnosu
na y osu. Svi objekti, pre iscrtavanja, se smeštaju u posebnu listu za iscrtavanje objekata. Pre
iscrtavanja nad listom se izvrši sortiranje svih objekata po y osi i zatim se jedan po jedan
iscrtavaju. Ovima se postiže željeni efekat (Slika 1.8).
14
Slika 1.8
Scena je iscrtana i objekti se pokreću na ekranu, ali je kamera i dalje fiksirana. Kada korisnik
želi da izađe van domena trenutne scene potrebno je pomeriti sve teksture u stranu, kako bi
glavni lik bio u centru. Umesto da se svakoj teksturi zasebno izračunava pomeraj, iskorišćen
je parametar za kameru unutar SpriteBatch.Begin metode. Potrebno je da se prosledi
matrica transformacije koja će da bude primenjena nad svakim pikselom pri iscrtavanju slike.
Ova matrica je sačinjena od elemenata trenutne pozicije glavnog igrača unutar video igre
(njegove x i y koordinate), kako bi igrač uvek bio u centru kamere. Osim pozicije dodati su i
zoom kao i rotacija, u slučaju da treba kamera da se rotira ili da se približi objektima.
public static Matrix GetTransformation(){ return Matrix.CreateTranslation(new Vector3(-Position.X, -Position.Y, 0)) * Matrix.CreateRotationZ(Rotation) * Matrix.CreateScale(new Vector3(Zoom, Zoom, 1)); }
15
1.7 Kombinovanje tri metode
Kombinovanjem Load, Update kao i Draw metode se kompletira glavni ciklus igre. Sve ostale
funkcije, kako bi bile sadržane u igri moraju biti primenjene u jednoj od ove tri metode.
Kao osnovni primer ovakvog toka rada je primer pomeranja kvadrata.
Load metodom se učitava tekstura kvadrata unutar igre.
U Update metodi se svakom iteracijom pozicija kvadrata povećava za jednu vrednost po x
osi.
Posle svake promene pozicije se kvadrat iscrta na ekranu na novoj poziciji, Draw metodom.
Ovaj primer demonstrira osnovnu funkcionalnost XNA okruženja i po kojoj logici rade video
igre. Sve ostale funkcionalnosti su nadovezivanja na ovaj princip (Slika 1.9).
Slika 1.9
16
1.8 Input
Kako bi korisnik mogao da igra video igru i da pomera i kontroliše glavnog lika mora se
implementirati metoda za prepoznavanje korisničkog unosa podataka.
Zato što je video igra rađena za računare, umesto za konzole, vrsta korisničkog unosa može
da bude raznovrsna. Na konzolama je unos samo preko džojstika koji dolazi uz konzolu, i
eventualno par dodatnih periferija. Računari podržavaju gotovo sve vidove korisničkog unosa,
preko standardnih, kao što su miš i tastatura, džojstik, pa do raznih periferija kao volani,
pedale, TrackBall kao i displeji na dodir.
Video igra projekta prima korisničke unose preko tastature i miša kao i džojstika. XNA
okruženje, pošto je napravljeno od strane Mikrosofta, ima ugrađenu podršku za Xbox
džojstike i sve njihove funkcionalnosti kao što su palice i vibracija.
Unos podatka sa Xbox džojstikom:
private static bool PickUp=>GamePad.GetState(PlayerIndex.One).IsButtonDown(Buttons.A) private static bool Drop=>GamePad.GetState(PlayerIndex.One).IsButtonDown(Buttons.B) private static bool Use=>GamePad.GetState(PlayerIndex.One).IsButtonDown(Buttons.X) private static bool Enter=>GamePad.GetState(PlayerIndex.One).IsButtonDown(Buttons.Y) private static bool Shoot=>GamePad.GetState(PlayerIndex.One).Triggers.Right > 0f private static bool Pin=>GamePad.GetState(PlayerIndex.One).Triggers.Right >= 0.8f
Unos podataka tastaturom i mišem:
private static bool IsKeyDown(Keys keys) { return Keyboard.GetState().IsKeyDown(keys); }
Oba pristupa su implementirana unutar video igre, kako bi korisnik mogao da izabere njemu
najudobniji pristup. Kontrole za tastaturu se učitavaju iz tekstualnog fajla koji korisnik može
da modifikuje ako mu se standardni raspored kontrola ne svidi.
17
Najudobniji način za doživljaj igre je preko džojstika, ne samo zato što je napravljen da se
pogodno drži u rukama nego i zbog preciznosti kontrola. Pri pokretu glavnog lika preko strelica
na tastaturi postoji samo dva stanja dugmeta, kliknuto ili ne. Tako da igrač može da se kreće
samo jednom brzinom u određenom pravcu ili da se ne pokreće. Palice kod džojstika
omogućavaju mnogo udobniju i precizniju kontrolu pokreta igraća. Kada se palica pomeri
ulevo on ne vraća bool vrednost nego vraća float vrednost između 0 i 1. Nula znači da se
lik ne pomera u tom pravcu, a jedan da se pomera maksimalnom brzinom. Sve vrednosti
između, tj. svi položaji palice koji su između puštenog i uperenog skroz u jednu stranu daju
niz među brzina. Blagim pomeranjem palice igrač može da se pokreće polovinom svoje brzine
i time simulira spori hod. Sam prelazak u stanje pokreta nije spontan, kao sto je u slučaju sa
strelicama na tastaturi, već ima par delića sekundi koji su u „zaletu“. Ovo doprinosi mnogo
boljem i prirodnijem osećaju pokretanja igrača.
Slika 1.10
Kako bi ovaj efekat glatkog pokreta preneli i na korisnike koji nemaju džojstik moramo da
upotrebimo miša. Umesto da korisnik ima četiri strelice koje diktiraju smer u kome se kreće
igrač, ima samo jedan taster, taster za pokret. Kada je taster za pokret kliknut onda se igrač
kreće, u suprotnom stoji. Pravac kretanja igrača, kada je taster kretanja kliknut, je pravac koji
se dobija povlačenjem linije od centra igrača do trenutne pozicije miša. Brzina kretanja igrača
je jednaka razdaljini tačke trenutne pozicije miša od centra igrača (Slika 1.10).
Vector2 leftThumbStick = GamePad.GetState(PlayerIndex.One).ThumbSticks.Left; if(IsKeyDown(Keys.W)) {
float radius = 200; float x = Camera.Camera2D.Center.X - Mouse.GetState().X; float y = Camera.Camera2D.Center.Y - Mouse.GetState().Y; var mouseToThumbStick = new Vector2(-x / radius, y / radius); leftThumbStick = mouseToThumbStick; }
m_player1.Move(leftThumbStick);
18
1.9 Muzika
Audio fajlovi se učitavaju u igru kao i ostali sadržaj, preko GameContent projekta. Postoje dva
tipa audio fajla koja mogu da se učitaju, mp3 i wav.
Mp3 fajlovi su kompresovani audio fajlovi koji zauzimaju do deset puta manje memorije od
wav fajlova. Mp3 fajlovi se učitavaju u Song klasu. Wav fajlovi su znatno veći i oni nisu
kompresovani. Wav fajlovi se učitavaju unutar SoundEffect klase. Song i SoundEffect su
dve osnovne klase u kojima se muzika čuva i reprodukuje unutar video igre. Audio fajlovi se
puštaju Play metodom koja ima parametre za jačinu zvuka kao i pitch i pan parametre, za
dodatno štelovanje zvuka.
Zato što je mp3 audio fajl kompresovana pesma, unutar Song klase može samo da se pušta i
pauzira, metodama Play i Pause. Ne može da se bira trenutak od koje sekunde će se puštati
reprodukcija pesme. Može samo jedna pesma da se pušta u bilo kom zadatom trenutku, XNA
okruženje ne podržava puštanje paralelnih pesama.
Wav fajlovi, pomoću SoundEffect klase, mogu da se puštaju iz bilo kog trenutka audio
snimka. Može da se pušta paralelnih wav fajlova koliko sama konfiguracija mašine dozvoljava,
nije ograničeno unutar XNA okruženja. Zbog velikog memorijskog prostora koju wav fajlovi
zauzimaju, koriste se pretežno za specijalne efekte koji su u dužini znatno kraći od cele pesme
od par minuta.
dieSound = Game1.Instance.Content.Load<SoundEffect>(@"SoundEffects\die"); gunSound = Game1.Instance.Content.Load<SoundEffect>(@"SoundEffects\gun"); explosionSound = Game1.Instance.Content.Load<SoundEffect>(@"SoundEffects\explosion");
public void Play(SoundType soundType){ switch(soundType){ case SoundType.Die: dieSound.Play(MasterVolume * GameEffectsVolume, 0.0f, 0.0f); break; case SoundType.Gun: gunSound.Play(MasterVolume * GameEffectsVolume, 0.0f, 0.0f); break; case SoundType.Explosion: explosionSound.Play(MasterVolume * GameEffectsVolume, 0.0f, 0.0f); break; case SoundType.Hover: hoverSoundEffect.Play(MasterVolume * GuiVolume, 0.0f, 0.0f); break; } }
19
1.10 Animacija
Kako teksture koje su učitane unutar igre ne bi bile statične, mora se implementirati sistem
animacije. Animiranjem objekata unutar igre se stvara efekat da igra nije „mrtva“, tj. da uvek
ima dešavanja i pokreta na ekranu. Animacije mogu da se upotrebe u razne svrhe, od
eksplozija pa do pomeranja travki na vetru. Što više detalja se uloži u animiranje objekata to
je scena življa i realističnija u pogledu pokreta.
XNA okruženje ima već ugrađenu metodu za animaciju, ali unutar projekta nije korišćena već
je napravljena iznova novi mehanizam animacije, kako bi se imao veći uvid i kontrola nad svim
detaljima animiranja.
Efekat da se neki objekat animira se postiže tako što se smenjuju slike pomeraja njegove
pozicije, jedna za drugom, u redosledu. Ovi osnovni koncepti animacije su doveli do stvaranja
prvih filmova (Slika 1.11).
Slika 1.11
20
Standard za filmove je 24 kadra u jednoj sekundi. Time se čovekovo oko „prevari“ i ostvaruje
se efekat animacije objekta unutar tih kadrova. Za animaciju animiranih filmova na televiziji
je standard šest kadrova u sekundi. Od broja kadrova u sekundi zavisi i kvalitet animacije, što
je broj veći to je animacija elegantnija i ima više detalja. Problem kod animiranja većeg broja
kadrova u sekundi je samo iscrtavanje tih kadrova, koje oduzima dosta vremena kao i napora
od animatora. Zbog ovog razloga samo visokobudžetni animirani filmovi mogu da priušte više
od šest do dvanaest kadrova po sekundi (Slika 1.12).
Slika 1.12
U projektu je odrađena implementacija animacije tako što se prvo sve teksture jednog
animirajućeg objekta učitaju. Unutar foldera gde je smeštena glavna tekstura objekta
smeštene su i sve druge slike koje, kada se prikazuju jedna za drugom, stvaraju animaciju.
21
Redosled kojim se slike smenjuju je obeležen njihovim imenima. Unutar foldera su imena slika
poređana od nula pa naviše. Kada se teksture učitavaju one su već sortirane po svom imenu
originalnog fajla (Slika 1.13).
Slika 1.13
Sve potrebne teksture su učitane unutar sortiranog niza tekstura koje pripadaju određenom
objektu. Unutar igre postoji merač vremena koji obaveštava objekat kada treba da zameni
sledeću teksturu. Kada dođe vreme za zamenu onda se uzima sledeća tekstura u nizu i zameni
trenutna tekstura za prikaz. Kada se dođe na kraj niza sa teksturama onda se opet kreće sa
početka niza, stvarajući konstantni krug animacije.
Animacije su poređane po vrstama. Osnovna vrsta animacije je Idle vrsta, odnosno animacija
koja se izvršava kada objekat ne radi ništa. To može biti neonski znak na zidu koji trepće, ili
trava koja se njiše. Ostali tipovi animacije se izvršavaju zavisno od slučajeva i stanja u kojima
se objekat nađe. Ako je bure upucano ono pokreće animaciju eksplozije koja se izvršava. Kada
pištolj ispuca metak pokreće se animacija dima iz cevi.
22
2. 2D Motion Capture
2.1 Osnove praćenja pokreta
Postoji više različitih tehnika koje su se razvijale za praćenje pokreta:
Metoda pasivnih obeleživača
Osoba koja ja snimana je obučena u crnu odeću. Na svim zglobovima se nalaze bele kuglice
(Slika 2.1). Ove kuglice će obeležavati koji delovi figure će da budu animirani. Kamere su
postavljene oko osobe i svaka kamera ima upereno svetlo ka osobi. Svetlom kamere
obasjavaju se bele loptice i time lakše mogu da se prepoznaju tačne pozicije svake loptice na
video snimku. Istim metodom se mogu pratiti i pokreti mišića na licu (Slika 2.2). Time se
dobijaju verodostojni izrazi lica karaktera.
Slika 2.1
23
Slika 2.2
Metoda aktivnih obeleživača
Aktivni obeleživači su napravljeni tako da mogu da emituju svetlost. Svaki od obeleživača, koji
su u obliku trakica, treperi određenim ritmom. U svakom trenutku samo jedna traka treperi.
Ova treperenja su veoma brza i nisu primetna ljudskom oku. Ovom metodom kamere u
svakom trenutku vide samo jedan obeleživač, dok su ostali ugašeni. Time je olakšano
prepoznavanje željene tačke i dobijaju se precizniji rezultati (Slika 2.3).
Slika 2.3
24
Metoda bez obeleživača
Ova metoda od osobe čiji su pokreti snimani ne zahteva nikakve dodatne obeleživače. Može
da bude bilo kako obučena. Za ovu metodu je potrebno podesiti 7 kamera oko osobe, kao bi
se uhvatili pokreti iz svih uglova. Zatim se proučavaju promene piksela na svakoj slici od tih
sedam kamera i pravi se foto-realističan model osobe u virtualnom svetu (Slika 2.4).
Slika 2.4
Sistemi inercije
Ovakva metoda ne zahteva nikakve kamere. Osoba nosi odelo sa kuglicama na zglobovima.
Svaka kuglica prati podatke o pokretu pomoću internih senzora za merenje ubrzanja i rotacije.
Ovi podaci se zatim bežično prenose do računara. Ova metoda je postala sve popularnija kod
manjih studija zato što, nasuprot metodama koje koriste kamere, ne zahteva da se montira
studio za svrhe praćenja pokreta (Slika 2.5).
Slika 2.5
25
Mehaničko praćenje pokreta
Kod ove metode isto nisu potrebne kamere za praćenje pozicija zglobova. Osoba koja izvršava
pokrete treba da obuče odelo na koje je prikačene skeletna struktura. Kako pomera zglobove
tako se pomera i skelet zakačen na odelu. Skelet zatim bežičnim putem prenosi informacije o
uglovima pomeraja svih zglobova i podaci se izračunavaju i prikazuju na računaru. Ova metoda
je iz istih razloga praktična kao i metoda sistemom inercije (Slika 2.6).
Slika 2.6
26
Kako nema svako visoko-budžetnu opremu i studijo za praćenje pokreta, aplikacija je
pravljena sa običnim korisnicima u vidu. Od početka izrade aplikacije nije se računalo na visok
kvalitet video opreme niti na dobru opremljenost korisnika u pogledu odela za snimanje kao
i kuglica za zglobove. Preduslov za snimanje pokreta čoveka je taj da kamera video rekordera
bude uperena ka čoveku pod uglom od devedeset stepeni. Razlog za to je da bi se dobijene
tačke pozicija figure mogle odmah primenjivati, bez dodatnih transformacija koje bi otežale
rad.
Slabiji kvalitet kamere za snimanje pokreta može da dovede do slabijih rezultata i težeg
pronalaženja traženih zglobova. Da bi izbegli ili pak umanjili neželjeni efekti mora se za nijansu
povećati kontrast i zasićenost (saturation) u post-produkciji snimanja korišćenjem određenih
alata za video montiranje i korekciju boje. Time se boje bolje međusobno razlikuju i olakšavaju
aplikaciji posao pronalaženja specifičnih regiona (Slika 2.7). Još jedna preporuka tokom
snimanja je da se svi pokreti po mogućnosti snime usporeno kako bi se izbegle zamućenja na
snimku prilikom veće brzine (blur).
Slika 2.7
27
2.2 Zašto Motion Capture?
Izrada animacija je veoma važan korak prilikom razvoja 2D video igre. Pritom je i važno da
pokreti karaktera unutar igre budu što prirodniji i da što vernije preslikavaju odgovarajuće
pokrete ljudi. Samim tim, programi za snimanje pokreta često se koriste pri izradi ovakvih
animacija
Ono što se dalo odmah primetiti kod klasične animacije u video igri je da je, za razliku od
animiranih TV programa, potrebno animirati i sve dodatne akcije figure sa svim
kombinacijama pokreta. Držanje pištolja, držanje pištolja u hodu, u trku, u skoku. Zatim za sve
kombinacije objekata i pozicija se mora zasebno animacija odraditi.
Zbog jednostavnosti dobijanja verodostojnih animacija kao i brzinom kojom se one mogu
dobijati, industrija filma kao i video igara su odabrala Motion Capture kao primarno sredstvo
za animiranje kompleksnih pokreta kako tela tako i lica čoveka.
Algoritam koji je korišćen za implementaciju 2D Motion Capture-a unutar projekta nije najbrži
niti najoptimalniji algoritam, ali za potrebe video igre je poslužio i odradio posao koji je trebao.
Dalja poboljšanja algoritma bi ubrzala procese analize snimka kao i povećale preciznost
izlaznih podataka animacije ali je prezentovano rešenje najbrže došlo do željenih rezultata.
28
2.3 Implementacija
Osnovna ideja za algoritam proizilazi iz toga da sliku posmatramo kao matricu gde je svako
polje unutar nje jedna boja predstavljena RGB vrednostima (Red, Green, Blue) (Slika 2.8) i
zatim prolaskom kroz tu matricu nalazimo tražene tačke na snimku čoveka u pokretu koje će
da budu odgovarajuće tačke na figuri unutar 2D video igre. Svaki zglob čoveka koji radi
pokrete na snimku mora da se preslikava 1 na 1 unutar 2D prostora sa figurom kako bi se
zadržale proporcije.
Slika 2.8
Dobijanje slike iz video snimka
Slika je posmatrana kao matrica boja što je i generalno slučaj sa slikama standardnih formata.
Iz videa se dobija slika tako što se pozove preko XNA okruženja kao video (Slika 2.9).
XNA okruženje puštanje videa posmatra kao izvlačenje slike po slike iz videa i zasebno
prikazivanje svake, jedna za drugom. Pre no što se slika prikaže mora se obraditi i zatim
korisniku poslati prerađena slika sa izdvojenim zglobovima.
Slika 2.9
29
Pronalaženje traženih boja zglobova
Prvi korak je da se iz slike, gledane kao matrice boja, prođe redom i pronađe tražena boja
(boja nalepnica na zglobovima osobe). Unutar programa se nalaze već određene,
predefinisane boje koje odgovaraju traženoj boji roze nalepnice (Error! Reference source not
found. levo). To je lista boja u kojima se sve nalepnica može pojaviti (Slika 2.10 desno).
Algoritam kada traži sličnu boju traženoj prepoznaje je samo ako je u opsegu od par procenata
slična po RGB vrednostima boje. Za svaku vrednost R, G i B-a je provereno ponaosob.
Slika 2.10
Pseudo kod:
1. Za svaki piksel unutar slike
2. Ako je za dati piksel vrednost crvene boje slična za 15% sa pikselima iz liste
željenih piksela,
3. I ako je vrednost plave boje slična za 15%
4. I ako je vrednost zelene boje slična za 15%
5. Onda ubaci ga u listu rezultata.
Svaka slika sadrži jedanaest zglobova oko kojih je region određene veličine. Algoritam
nalaženja željene tačke se izvršava nad svakim zglobom (jedanaest puta). Kako su svih
jedanaest zglobova nezavisni jedni od drugih posao nalaženja željene tačke ja podeljen u
odvojene niti. Za svaki nezavisni zglob se posmatra region piksela. Slike rezultata algoritma,
pre (Slika 2.11levo) i posle (Slika 2.11 desno).
30
Slika 2.11
Čišćenje šuma sa slike
Sa slike se vidi da ima dosta šuma tj. piksela koji nisu u regionu veće gustine crnih piksela.
Dosta piksela koji su prošli test sličnosti boje zato što ih je sobno svetlo osvetlilo pod
pravim uglom ili ih je senka zamračila. Takvi šumovi mogu potencijalno da prave problem u
kodu kada bude trebalo da se nađe koji od tih piksela su zglobovi a koji ne. Još jedan prolaz
kroz matricu je neophodan kako bi se slika očistila od šumova.
To se postiglo tako što za svaki crni piksel (gde je tražena boja pronađena) uzme na proveru
ponovo. Gleda se da li se oko njega nalaze još crnih piksela, njegovih suseda.
Ako je broj crnih piksela oko njega dovoljno velik onda to znači da se nalazi u regionu veće
gustine i ostaje crn. Njegove susede pretvaramo u crne piksele. Tako se dobio efekat
da ako je piksel u gustom okruženju to okruženje postane gušće naseljeno. Ako je pak premali
broj crnih piksela koji ga okružuje pretpostavlja se da je taj piksel šum i uklanja
se (pretvara se u beli piksel).
Ovim se postigao efekat “rich get richer, poor get poorer” čime se slika očistila od šumova kao
i popunila rupe unutar gustih regiona.
31
Pseudo kod:
1. Za svaki piksel iz liste piksela u kojima je izdvojena tražena boja
2. Proveri svih osam polja koja se nalaze oko piksela
3. Ako su manje od tri polja crne boje (tražene boje) onda izbaci taj piksel iz
liste traženih
Slike rezultata algoritma, pre (Slika 2.12 levo) i posle (Slika 2.12 desno).
Slika 2.12
Početne pozicije regiona zglobova
U profesionalnim okolnostima svaki snimak Motion Capture-a počinje tako što čovek napravi
„T-pose” tj. da stane kao slovo t, ispravljenih ruku (Slika 2.7). Na taj način kompjuter lako može
da odredi gde se koji deo zgloba nalazi. U programu iz projekta korisnik mora da klikne mišem
na delove videa gde se zglobovi nalaze. Kada se pokrene program prikazuje se prvi kadar
snimka gde su ruke čoveka raširene. Korisnik selektuje sve zglobove redom i program ih
sačuva kao početne pozicije (Slika 2.13).
32
Slika 2.13
Pronalaženje centra regiona
Nakon što se region očisti od „neželjenih“ piksela (Slika 2.14 levo) ostaje da se nađe centar
dobijenog oblika. Centar se nalazi tako sto se pronalaze najduže horizontalne i vertikalne linije
unutar oblika. Pošto oblik može da varira iz kadra u kadar, umesto preseka ovih linija (Slika
2.14 crvene linije na slici), napravljen je pravougaonik od njih (Slika 2.14 crveni pravougaonik).
Centar tog pravougaonika se uzima kao finalna tačka pozicije zgloba (Slika 2.14 centar plavih
linija). Ovim su se umanjile nagle promene tražene tačke usled nepravilnosti oblika iz kadra u
kadar, i dobio se centar koji je stabilniji.
Slika 2.14
33
Pseudo kod:
1. Za svaki red unutar regiona traženih boja
2. Proveravaj piksele od levo ka desno, dužinom reda
3. Pamti koji je najduži neprekidni niz piksela (sadrži samo tražene piksele)
4. Vratiti kao rezultat najduži neprekidni niz piksela od svih redova
5. Isto obaviti i po kolonama regiona.
6. Napraviti kvadrat
7. Širine maksimalnog niza piksela po redovima
8. Visine maksimalnog niza piksela po kolonama
9. Pozicije x ose od početnog piksela maksimalnog niza piksela po redovima
10. Pozicije y ose od početnog piksela maksimalnog niza piksela po kolonama
11. Naći centar tog kvadrata i vratiti ga kao pozicija traženog zgloba
Praćenje regiona
Da bi se algoritam znatno ubrzao za svaki zglob se nije prolazilo kroz celu sliku nego samo kroz
pod-matricu znatno manje veličine koja obuhvata traženi region. Svakog kadra slike se traženi
region pomera u određenom smeru. Pod-matrica koja se proverava za traženi region mora
isto da se pomera u pravcu regiona kako bi mogla da ga skenira i izvuče tačku iz njega.
Početne lokacije kvadrata regiona provere su zadati prema početnim pozicijama zglobova
koje je korisnik odredio na početku. Kada se kadar pomeri region provere se pomeri tako što
mu se centar pozicionira na mesto centra prethodnog traženog polja (Slika 2.15). Time se
obezbeđuje da region provere ne zaostaje za traženim regionom tj. uvek ga prati i tako
“štedi” vreme izvršavanja algoritma.
Slika 2.15
34
2.4 Upotreba u igri
Dobijeni niz pozicija se čuva kao tekstualni fajl koji sadrži niz x i y koordinata. Unutar video
igre se taj niz čita i čuva u identičan niz pozicija zglobova. Figura unutar igre, umesto da ima
animaciju, gde se menjaju teksture iz niza, ima niz zglobova koji se po istom principu smenjuju.
Brzina animacije može da se naštimuje kako bi izgledala što prirodnije stvarnoj brzini figure
unutar video igre. Kao i animacije teksturama, svaka figura može imati više tipova animacije
zglobova koja zavisi od trenutnog stanja figure (Slika 2.16). Zavisno od brzine kretanja igrač
može da ima animaciju šetanja ili trčanja (Slika 2.17), ili, ako je u klubu, može da se aktivira
animacija igranja.
Slika 2.16
Slika 2.17
35
3. Rukovođenje resursima
3.1 Učitavanje tekstura
Na početku pokretanja video igre sve teksture koje se koriste su učitane u radnu memoriju.
Teksture se, kao i ostali resursi, učitavaju iz GameContent projekta. Teksture su, unutar
projekta, grupisane po folderima. Unutar glavnog foldera se nalaze folderi koji predstavljaju
kategorije kojoj svaka tekstura pripada. Oružje je smešteno u Weapons folder, kao što su i sve
građevine unutar Buildings foldera. Na početku izrade igre nije bila potreba za ovakvo
kategorisanje tekstura kao i resursa generalno, ali se porastom projekta broj povećao i bilo je
otežano pregledanje svih tekstura. Unutar svakog foldera kategorije se nalaze folderi sa
imenom teksture. Tekstura pištolja se nalazi unutar Gun foldera. Unutar igre se teksture
pozivaju upravo po ovim imenima foldera (Slika 3.1).
Unutar foldera teksture se nalaze folderi stanja teksture. Standardno stanje bilo koje teksture
jen Idle. Ukoliko ima neko posebno stanje, recimo, stanje eksplozije, onda postoji folder sa
imenom tog stanja. Zavisno od stanja objekta će se koristiti tekstura iz određenog foldera
stanja.
Unutar svakog foldera stanja su teksture, u png formatu. Teksture su imenovane numerički,
počevši od nule. Ovakvim sistemom imenovanja se omogućava prepoznavanje redosleda
animiranja teksture.
Slika 3.1
36
3.2 Učitavanje mape
Posle učitavanja svih potrebnih tekstura, treba da se naprave objekti u igri koji će da poprime
te teksture. Svaki objekat u igri ima niz osobina koje treba da ima kako bi postojao u igri, bilo
da je tepih, drvo ili čovek. Pored osobina za svaki objekat u igri, potrebno je odrediti mu i
početnu poziciju unutar mape igre.
Sve osobine koje su potrebne za pravljenje objekata na mapi se nalaze unutar Properties
klase.
public string type; public string Name { get; set; } public int position_x; public int position_y; public string texture_type; public int Energy { get; set; } public float Speed { get; set; } public int width; public int height; public string AmmoType; public float Force { get; set; } public int ClipSize { get; set; } public float timerShoot; public float Weight { get; set; } public int holding_spot_x; public int holding_spot_y; public float gravity_factor; public bool flat; public bool see_tru; public bool rapid_fire; public string bulletMarkTexture; public int bulletMarkWidth; public int bulletMarkHeigth;
Properties klasa se serijalizuje i deserijalizuje pomoću JSONA. Json je izabran zato što je
mnogo čitljiviji i manje memorije zauzima od standardnog XML formata serijalizacije.
public static Properties initialize(string path){ string all = File.ReadAllText(path);
return JsonConvert.DeserializeObject<Properties>(all); }
37
Jednu mapu sačinjavaju svi objekti, sa svojim json tekstualnim fajlovima. Kako bi folder mape
bio preglednije, json fajlovi su grupisani po folderima kategorije.
Posle učitavanja tekstura i ostalih resursa se učitavaju svi tekstualni json fajlovi. Zavisno od
osobine tipa objekta, pravi se specifičan objekta. Konstruktoru svakog objekta je potrebno
proslediti Properties objekat koji će inicijalizovati potrebne komponente tog objekta.
public Person(Properties properties): base(properties) { Health = properties.Energy; StartWeight = properties.Weight; Weight = properties.Weight; Speed = properties.Speed * 2; MapMain.PersonList.Add(this); Height = 178; Width = 70; }
Može postojati veći broj mapa za igru, gde su u svakoj mapi drugačije grupisani objekti, ili
imaju drugačije osobine kao i proporcije. Ovo opet daje slobodu igračima da menjaju sve
komponente, zato što su im dostupne u lako čitljivom obliku. Ako igrač misli da treba mitraljez
da bude jači unutar igre, slobodno može da otvori njegovu konfiguraciju u Notepad programu
i izmeni je (Slika 3.2).
Slika 3.2
38
4. Struktura igre
4.1 Glavni ciklus igre
Objašnjeno je kakav je ciklus igre unutar XNA okruženja, ispod je prikazano kako je ovaj ciklus
iskorišćen za video igru konkretno ovog projekta:
Load metoda:
protected override void LoadContent() { SpriteBatch = new SpriteBatch(GraphicsDevice); AudioCenter.Instance.Load(); TextureCenter.Instance.Load(); AnimationCenter.Instance.load(); GUI.GUI.Instance.load(); MapMain.Instance.Load(); PlayerControls.Instance.Load(); Paint.Paint.Instance.Load(); Inspect.Main.Instance.load(); HUD.Main.Load(); }
Update metoda:
protected override void Update(GameTime gameTime) { Testing.FrameRate.Update(); Controls.Instance.GameControlls(); VibrationCenter.Instance.update(); MapMain.Instance.Update(); PlayerControls.Instance.Update(); Paint.Paint.Instance.Update(); ExplosionCenter.Instance.Update(); Inspect.Main.Instance.update(); base.Update(gameTime); }
Draw metoda:
protected override void Draw(GameTime gameTime) { Graphics.GraphicsDevice.Clear(Color.White);
Instance.SpriteBatch.Begin( SpriteSortMode.Immediate,BlendState.NonPremultiplied,null,null,null,null, Camera.Camera2D.GetTransformation());
MapMain.Instance.Draw(); Instance.SpriteBatch.End(); base.Draw(gameTime); }
39
4.2 Objekti unutar video igre
U osnovi svakog objekta koji je prikazan unutar video igre je klasa Bitak. Bitak je sve ono
što jeste tj. što postoji u igri. Svaki objekat u video igri ima ime. Ime ne mora da bude unikatno,
više objekata može da imaju isto ime, kao recimo drveće, nije bitno koje je svako pojedinačno
drvo, bitno je samo da je drvo, dok je bitnije koji lik je Žorž a koji Nemanja unutar igre.
Svaki objekat ima svoj unikatni identifikator, ID, koji se dodeljuje prilikom kreacije objekta.
Ovim identifikatorom se, unutar koda, prepoznaju konkretni objekti.
Type je polje u kome se čuva vrednost koji je tip objekta unutar igre. Ovim se na jednostavan
način može odrediti da li je objekat oružje ili građevina.
U svakom objektu se čuva njegova originalna lokacija fajla iz koga je učitan. Ova vrednost se
koristi u svrhe ponovnog učitavanja objekata, po potrebi (prilikom restartovanja igre).
Properties objekat nosi sve ostale podatke specifične za objekat, ona se pravi iz učitanog
tekst fajla objekta i iz nje se izvlače svi ostali podaci i osobine jednog objekta. On se prosleđuje
kroz konstruktore objekata i čuva konačno unutar osnove objekta, kako bi ti podaci bili
dostupni za laku upotrebu.
Svaki Bitak objekat ima roditeljsku klasu Animatable, što znaci da se svaki objekat unutar
igre može animirati, pod uslovom da ima animaciju. Ukoliko nema animacije prisutne, objekat
samo koristi početnu statičnu teksturu i nalazi se u prvobitnom stanju čekanja (Idle).
Klasa animacije sadrži trenutno stanje animacije kao i merač koraka animacije. Ona pristupa
traženim teksturama iz liste već učitanih tekstura po tipu animacije i vremenu.
Za Animatable klasu je roditeljska klasa Drawable. Ova klasa sadrži podatke o teksturi kao
i o ostalim podacima vezanim za samo iscrtavanje figure na ekran: transparentnost objekta,
centar teksture, odnos visine i dužine, kao i u kom redosledu da se iscrta tekstura. Informaciju
o redosledu iscrtavanja tekstura dobija u odnosu na njenu najnižu tačku na ekranu po y osi.
Svi objekti koji su unutar sveta video igre su klase Bitak. Stvari kao UI elementi ili neke
pomoćne klase za vizuelni prikaz ne spadaju pod Bitak kategoriju nego se inicijalizuju i
rukovode u posebnim klasama.
40
Objekti koji se mogu kreirati unutar video igre:
AmmoPack
Objekat pakovanja municije (Slika 4.1). Svako pakovanje municije sadrži određenu količinu
metaka unutar sebe. Svako pakovanje municije ima određen tip municije koja se nalazi u
pakovanju. Pri kreiranju pakovanja municije kreira se i potreban broj municije kako bi se
pakovanje napunilo.
Ako igrač ima oružje u ruci i pređe preko pakovanja municije, ako je municija odgovarajuća sa
tipom municije oružja, onda se automatski pokupiti i napuni.
Slika 4.1
Barrel
Bure se razlikuje od običnog objekta Bitka po tome što kada izgubi svu energiju, eksplodira
(Slika 4.2). Eksplozija se poziva iz klase koja rukovodi svim eksplozijama u video igri,
ExplosionCeneter. Zada se pozicija na kojoj treba da se desi eksplozija i otpočne animacija.
Posle eksplozije bure nestaje.
Slika 4.2
41
Box
Igrač može da uđe u kutiju (Slika 4.3). Kada je u kutiji onda ga ostali likovi u igri ne primećuju.
Zavisno od teksture, objekat kutije može biti bilo koji objekat ispod kog igrač može da se uvuče
i da se pokreće, kao npr. korpa ili žbun.
Slika 4.3
Building
Građevine su jedini objekti unutar igre koji imaju vise od jednog sloja teksture. Prvi sloj
građevine je njen temelj. Drugi sloj je fasada (Slika 4.4).
Slika 4.4
42
Kako je logika za iscrtavanje napravljena tako da se samo jedna tekstura iscrtava unutar Draw
metode, dodata je još jedna Draw metoda koja iscrtava i fasadu kuće. Fasade se smeštaju u
posebnu listu koja se iscrtava tek posle iscrtavanja temelja kuce. Igrač treba uvek da prvo vidi
fasadu kuće.
Kada igrač uđe unutar građevine, fasada postane transparentna. Ovako igrač može da
istražuje unutrašnjost građevine. Po istom principu funkcionišu i prostorije koje su unutar
građevine, nakon ulaska prednja strana zida postane providna (Slika 4.5).
Slika 4.5
Bullet
Svako pakovanje sa municijom je ispunjeno metkovima (Slika 4.6). Kada se sa oružjem metkovi
određenog tipa pokupe, oni se nalaze unutar tog oružja. Prilikom ispaljivanja metka iz oružja,
metak leti u smeru iz koga je ispaljen, dok se ne sudaru sa bilo kojim objektom. Kada dođe do
sudara, ako je objekat oštetljiv, objekat se ošteti. Ako metak leti određeno vreme bez da je
pogodio bilo šta onda prestaje da leti i pada na zemlju, ostavljajući trag gde je pao.
Slika 4.6
43
Gun
Oružje sadrži informaciju o tipu metkova koje može da prihvati, kao i koju količinu metkova
može da nosi u sebi. Kada oružje puca stvara se plamen oko otvora, pri izlasku metka, pokrene
se zvuk efekta pucnja i džojstik zavibrira.
Oružje prati smer u kome je igrač okrenut, tako da kada ispali metak daje metku tu informaciju
kako bi se uskladili pravci pucanja metkova.
Slika 4.7
Item
Svaki objekat sa kojim može igrač da interaguje nasleđuje Item klasu. Kada je neki objekat
Item onda igrač može da ga pokupi i drži u ruci (Slika 4.8). Igrač može da koristi Item objekat
u zavisnosti od toga koji je Item. Svaki Item objekat se isto može i ispustiti ponovno na
zemlju, kako bi se oslobodila ruka igraču za druge objekte.
Kako bi igrač podigao objekat, mora da se nalazi u neposrednoj blizini objekta. Ako postoje
više objekata koji su u blizini igrača, on pokupi najbliži njemu.
Slika 4.8
44
Stuff
Objekti napravljeni u ovoj kategoriji su raznovrsnog karaktera. Među njima spadaju svi objekti
sa kojima igrač nema mogućnost interakcije. Ovo su objekti kao tepih, kanta, knjiga, sto,
stolice, slika na zidu i svi ostali „ukrasni“ predmeti (Slika 4.9). Ovi predmeti sluze da doprinesu
atmosferi, kako bi lokacije koje igrač istražuje imale osećaj da neko u njima živi.
Slika 4.9
Terrain
Ova klasa je napravljena kako bi se u njoj grupisali objekti koji sačinjavaju teren mape. Teren
sačinjavaju sve površine po kojima igrač šeta, putevi, trava, zemlja itd. (Slika 4.10) . Jedina
specifičnost ovih objekata je ta da im je iscrtavanja prebačeno na sam početak liste
iscrtavanja, kako bi uvek bili iza svih ostalih objekata.
Slika 4.10
45
5. Funkcionalnosti video igre
5.2 Interakcija sa objektima
Unutar igre, igrač može, osim da se pokreće, da interaguje sa objektima oko sebe. Objekti koji
nisu previše veliki igrač može da uzme u ruku i da ih pomera i premešta im položaj. Ako je u
pitanju oružje, igrač može da puca iz njega. Ako pogodi drugog igrača, ovaj umire. Ako pogodi
bure, ono eksplodira (Slika 5.1).
Slika 5.1
Igrač može da uhvati drugog igrača. Kada ga uhvati onda može da ga dovuče gde želi. Igrač
koji drži drugog lika mora da konstanto drži taster držanja kako ne bi pustio drugog lika.
Igrač ima mogućnost da uveliča mapu u kojoj igra, da zumira kamerom, kako bi mogao da vidi
više detalja unutar prostora (Slika 5.2). Još jedan način da igrač bolje prouči objekat je da ga
uhvati u ruku i aktivira stanje inspekcije.
Slika 5.2
46
5.3 Stanje inspekcije
Kada igrač, sa objektom u ruci, klikne dugme za inspekciju, ulazi u stanje inspekcije. U ovom
stanju igrač ne može da se pokreće zato što proučava objekat. Objekat koji je držao u ruci je
sada uveličan i zauzima sredinu ekrana (Slika 5.3).
Slika 5.3
Igrač sada može da proučava objekat sa više detalja. Pomeranjem palica na džojstiku se
pokazuje igračev inventar stvari koje može da koristi nad objektom (Slika 5.4).
Slika 5.4
47
Ako izabere beležnik u jednoj ruci i olovku u drugoj, može da zabeleži određene informacije
koje je uočio na objektu. Zapisan sadržaj ostaje sačuvan u beležnici, tako da može kasnije da
prelista beležnicu i nađe svoje beleške (Slika 5.5).
Slika 5.5
Igrač ima i lupu na raspolaganju za pregledanje objekta. Sa lupom može da vidi dodatno
uveličane delove objekta. Sa lupom igrač može da vidi otiske prstiju na objektu (Slika 5.6). Kada
bilo koji drugi lik unutar igre pokupi objekat on ostavlja otisak prsta na tom objektu. Pomoću
inspekcije objekata igrač može da dobije informacije o otiscima prstiju, koje može da zapiše u
beležnicu.
Slika 5.6
48
5.4 Ponašanje likova unutar igre
Ponašanje ostalih likova u igri, koji nisu glavni igrač, je upravljano posebnim metodama.
Standardno ponašanje likova je da samo stoje na mestu i ništa ne rade. Liku ponašanje zavisi
od tipa podklase osnovnog ponašanja. Za sada postoji samo ponašanje napadača.
Napadač ima jedan glavni cilj, a to je da napadne glavnog igraća. Dok ne vidi igrača napadač
stoji. Čim vidi igraća on kreće da ide za njim i da ga napada. Ukoliko napadač nema oružje sa
kojim bi napao, on prvo traži oružje. Kada se istroši municija oružju, napadač traži municiju
kako bi mogao da nastavi da prati igrača. Ako uspe da ubije igrača onda mu prestaje ciklus
napadanja, u suprotnom se nastavlja, dok ima oružja i municije.
Ovakvo ponašanje je prilično jednostavnog karaktera ali dovodi do velikog broja različitih
ishoda, zavisno od lokacija napadača i igrača, kao i od ostalih predmeta sa kojima mogu da
interaguju.
Ovakva ponašanja su samo niz provera stanja likova i biranje koja radnja sledeće da se obavi.
Ako je broj municije jednak nuli unutar oružja onda je ispunjen uslov da se liku pošalje naredba
da ide i traži municiju. Kada je pokupi, lik se oslobađa te naredbe i opet se gleda koja sledeća
naredba da se izvrši.
public override void Update(){ if(!IsDead()) { var visibleEnemy = new SortedList<int, Bitak>(); foreach(var bitak in Map.MapMain.BitakList){ var tt = false; if(bitak.name != null){ tt = bitak.name.CompareTo(m_enemyToFind) == 0; }
if(Vector2.Distance(Center, bitak.Center) <= sight_radius && VisibleSearchItems != null && tt){
visibleEnemy.Add((int)Vector2.Distance(Center, bitak.Center), bitak);
} } if(visibleEnemy.Count > 0){ GetWeapon(); GetAmmo(); if(Gun != null && Gun.Ammo.Count > 0 && PickedUpItem is Gun){ KillEnemy(); } } } }
Kako ne bi došlo do čudnih rezultata i ukrštanja naredbi, svaka naredba ima početka i kraj.
Početak je ispunjenje uslova da se pokrene naredba dok je kraj definisan kada se uslov ispuni.
Za svaku naredbu postoje pod naredbe koje se moraju izvršiti, kao što je pomeranje lika do
određene pozicije ili zahtevanje od lika da izvrši naredbu uzimanja objekta.
49
6. Pomoćni alati za rad
6.1 2D Motion Capture aplikacija
Aplikacija za prepoznavanje pokreta sa video snimka kao i njegovu obradu je odrađena kao
odvojena aplikacija od ostatka igre. Kada se završi izvlačenje pozicija zglobova iz aplikacije ti
fajlovi se prekopiraju unutar projekta video igre i može se koristiti za animaciju figura.
Kontrole koje su korišćene za rad sa rezultujućim pozicijama figure (Slika 6.1) :
Slika 6.1
50
1. Prikazivanje figure izvan slike video snimka, kako bi korisnik imao uvid kako bi izgledala
animacija u video igri.
2. Slajder animacije. Pomeranjem ovog slajdera korisnik upravlja animacijom figure.
Dostupne su animacije koje su u tom trenutku konvertovane. Ovom kontrolom
korisnik može da pregleda određene delove animacije u varirajućim brzinama
(brzinom kojom pomera slajder mišem).
3. Slajder za označavanje početka animacije. Ukoliko je deo video klipa dovoljno dugačak,
korisnik može da izdvoji željenu celinu tako što će odrediti početak kao i kraj puštanja
animacije.
4. Slajder za obeležavanje završetka segmenta animacije. Ovim slajderima se može i
izdvojiti deo pokreta animacije koji zatvara “loop”, kako bi se, prilikom ponavljana
animacije, stekao utisak kontinualnog pokreta.
5. „Auto-play“ aktivira izvršavanje animacije. Animacija u WinForms-u je postignuta
pozivanjem tajmera i, kada tajmer obavi ciklus, promenu pozicija zglobova na sledeću
poziciju.
Kada se animacija završi, počinje opet ispočetka. Na „reverse“ kontrolu se animacija
pokreće unazad a na loop animacija ide unapred pa , kad stigne kraj, unazad. „Loop“
efektom korisnik ne mora da pogodi tačne trenutke kada se na video klipu napravi
krug, nego može da ga “veštački” izazove.
6. Pomeranjem vertikalnog slajdera korisnik može da ubrza ili uspori animaciju figure.
7. Korisnik može da uključi ili isključi prikaz glave figure, kako bi stekao bolju predstavu
pokreta glave unutar video igre.
51
6.2 Editor mape
Kako se celokupni sadržaj mape video igre učitava iz tekstualnih json fajlova, za promenu
nekog objekta je dovoljno da se promeniti njegov json fajl. Problem nastaje zato što je
menjanje json fajlova veoma ne intuitivan posao. Ako korisnik želi da se tepih u kuci nalazi
malo udesno od kauča, on mora da otvara tekstualni fajl i da proceni koliko bi to bilo piksela
za pomeriti.
Da bi se zaobišao ovakav proces i napravilo okruženje koje je udobnije za rad, ubačena je
kontrola editovanja mape u projekat. Kada je igra već pokrenuta, korisnik može da klikne
taster za otvaranje editora mape. Dok je editor mape otvoren igra i dalje traje, nesmetano.
Igra se može po potrebi i pauzirati kada se krene u promenu mape.
Kontrola za editovanje mape ima razna dugmad za manipulaciju igre. Pri otvaranju editora
mape se pojavljuje kursor miša unutar video igre. Kada korisnik klikne sa kursorom na bilo koji
predmet, predmet se prikazuje u editoru i učitavaju se sve osobine selektovanog objekta.
Korisnik može da, koristeći drag and drop komande, pomera sve objekte unutar mape. Kada
završi sa izmenama pozicije objekta kao i ostalim specifikacijama, treba da se pritisne na
„Save“ dugme kako bi se promena sačuvala unutar mape (Slika 6.2 – MapEditor sa podacima
kutije kao i selektovana kutija na mapi). Kada sledeći put mapa bude učitana, promene će biti
prisutne.
Ovim načinom se vreme izmena unutar mape znatno skratilo, a intuitivni korisnički interfejs
olakšava posao korisnicima koji žele da naprave sopstvene mape za igranje.
Slika 6.2
52
6.3 Učitavanje slika
Pomoću editora mape korisnik može da menja već postojeći sadržaj unutar video igre. Ako
želi da napravi novi sadržaj koji će da ubaci u igru mora da importuje sliku koja sadrži teksturu
novog objekta (Slika 6.3).
Slika 6.3
Slika treba da se preuredi tako da joj pozadina bude transparentna i da joj veličina bude
minimalna, tj. da nema praznog prostora koji izlazi izvan granica samog predmeta slike (Slika
6.4).
Slika 6.4
53
Ako slika sadrži vise odvojenih predmeta koji treba da budu pojedinačno izdvojeni onda dolazi
do vremenskog problema. Unutar bilo kog editora za slike je potrebno da se izvrše par koraka
kako bi se uklonila pozadina slike, kao i odradila auto-crop funkcionalnost i time izbacili prazni
delovi. Ovaj proces se odužava kada se dobije slika od pet-šest odvojenih elemenata.
Da bi se skratilo vreme odvajanja i formatiranja slika, unutar editora mape se može učitati
slika, i automatski će biti sređena po zahtevanim uslovima. Ovako odvojene i prerađene slike
se čuvaju unutar MapEditor content foldera unutar projekta video igre. Odvojene slike se
mogu odmah ubaciti u igru i sačuvati unutar mape (Slika 6.5).
Slika 6.5
Ovakvim alatima se ne samo olakšava proces modifikacije i stvaranja novog sadržaja za igru
nego se i podstiče česta promena i isprobavanje raznih kombinacije preuređenja objekata,
kako kreatoru igre tako i korisnicima koji žele da naprave sopstvenu viziju igre.
54
7. Zaključak
Ovim radom je dobijen bolji utisak o svim različitim aspektima izrade jedne video igre. Iako je
igra dvodimenzionalna i nije visoke produkcije i dalje zahteva dosta planiranja kao i
odlučivanja o svim detaljima koji nemaju direktnu vezu sa samom igrom, kao što su strukture
foldera, komunikacije delova aplikacije i ostale tehnikalije koje su neophodne za rad bilo koje
aplikacije.
Iako je glavna celina projekta izrada video igre videli smo da su pod-projekti zauzeli veliki deo
ukupnog rada. Njima se postiglo ubrzanje samog ciklusa produkcije video igre. 2D Motion
Capture alat je doprineo znatno bržoj produkciji animacija kao i mogućnosti mnogo više vrsta
animacija i poza za karaktere unutar video igre.
Za dodatnu organizaciju su korišćeni alati za verzionisanje projekta kao što su Git i Team
Foundation Services. Sve nađene greške u igri su organizovane kao „bug items“ i sve
funkcionalnosti koje su u planu su svrstane pod „work items“. Ovim je svaki aspekat rada
praćen i organizovan, kako bi se postigla što veća produktivnost.
Za dalji rad na igri je predviđeno dalje razvijanje mogućnosti interakcija među likovima i među
objektima u svetu video igre. Testiranja trenutnih kontrola i poboljšanja kvaliteta i jasnoće
rukovanja video igrom. Glavna funkcionalnost za doradu na video igri jeste pravljenje
složenijih skripti za veštačku inteligenciju drugih likova unutar video igre, kako bi se postigao
osećaj da je svet verodostojniji.
Na kraju celokupne produkcije ostaje samo još najbitnija stavka svake igre, da se podeli s
ljudima, da mogu da se igraju.
55
8. Literatura
[1] Ricardo Tobon, The Mocap Book: A Practical Guide to the Art of Motion Capture, Foris Force, 2010
[2] Alberto Menache, Understanding Motion Capture for Computer Animation, Second Edition
(Morgan Kaufmann Series in Computer Graphics), Morgan Kaufmann, 2010
[3] Midori Kitagawa, MoCap for Artists: Workflow and Techniques for Motion Capture, Focal Press,
2008
[4] Matt Liverman, The Animator's Motion Capture Guide: Organizing, Managing, Editing (Charles
River Media Game Development), Charles River Media, 2004
[5] Thomas Moeslund, Human Motion Capture using Computer Vision: A Pruning-based Approach,
LAP LAMBERT Academic Publishing, 2010
[6] Alan Cooper, The Inmates Are Running the Asylum: Why High-Tech Products Drive Us Crazy and
How to Restore the Sanity, Sams - Pearson Education; 1 edition (March 5, 2004)
[7] Luka Lovre, 2D Motion Capture, Prirodno-matematički fakultet Niš (2016)
[8] Kurt Jaegers, XNA 4.0 Game Development by Example: Beginners Guide, Packt Publishing
(September 24, 2010)
[9] Aaron Reed, Learning XNA 4.0: Game Development for the PC, Xbox 360, and Windows
Phone 7, O'Reilly Media; 1 edition (December 30, 2010)
[10] John Sedlak, Building XNA 2.0 Games: A Practical Guide for Independent Game
Development (Books for Professionals by Professionals), Apress; 1st ed. edition (September
24, 2008)
[11] Chad Carter, Microsoft XNA Game Studio 3.0 Unleashed, Sams Publishing; 1 edition
(March 7, 2009)
Прилог 5/1
ПРИРОДНO - MАТЕМАТИЧКИ ФАКУЛТЕТ
НИШ
КЉУЧНА ДОКУМЕНТАЦИЈСКА ИНФОРМАЦИЈА
Редни број, РБР:
Идентификациони број, ИБР:
Тип документације, ТД: монографска
Тип записа, ТЗ: текстуални / графички
Врста рада, ВР: мастер рад
Аутор, АУ: Лука Ловре
Ментор, МН
:
Марко Петковић
Наслов рада, НР: 2D видео игра у XNA окружењу
Језик публикације, ЈП: српски
Језик извода, ЈИ: енглески
Земља публиковања, ЗП: Р. Србија
Уже географско подручје, УГП: Р. Србија
Година, ГО: 2017.
Издавач, ИЗ: ауторски репринт
Место и адреса, МА: Ниш, Вишеградска 33.
Физички опис рада, ФО: (поглавља/страна/ цитата/табела/слика/графика/прилога)
55 стр. ; граф. прикази
Научна област, НО: рачунарске науке
Научна дисциплина, НД: развој видео игара
Предметна одредница/Кључне речи, ПО: XNA, развој 2D видео игара
УДК 005.311.7 519.83 004.4’275
Чува се, ЧУ: библиотека
Важна напомена, ВН:
Извод, ИЗ: Рад обухвата употребу XNA окружења за израду 2D видео игара. Поред основних метода прављена видео игара обухваћено је планирање као и додатне технике за оптимизовање продукције видео игре. Додатни алати за израду видео игре: Алат за праћење покрета са видео снимка (2D Motion Capture); MapEditor алат за манипулацију објектима унутар видео игре; Алат за прераду слика и конвертовање у текстуре за употребу у видео игри;
Датум прихватања теме, ДП:
Датум одбране, ДО:
Чланови комисије, КО: Председник:
Члан:
Члан, ментор:
Образац Q4.09.13 - Издање 1
Прилог 5/2
ПРИРОДНО - МАТЕМАТИЧКИ ФАКУЛТЕТ
НИШ
KEY WORDS DOCUMENTATION
Accession number, ANO:
Identification number, INO:
Document type, DT: monograph
Type of record, TR: textual / graphic
Contents code, CC: university degree thesis (master thesis)
Author, AU: Luka Lovre
Mentor, MN: Marko Petković
Title, TI: 2D video game with XNA framework
Language of text, LT: Serbian
Language of abstract, LA: English
Country of publication, CP: Republic of Serbia
Locality of publication, LP: Serbia
Publication year, PY: 2017
Publisher, PB: author’s reprint
Publication place, PP: Niš, Višegradska 33.
Physical description, PD: (chapters/pages/ref./tables/pictures/graphs/appendixes)
55 p. ; graphic representations
Scientific field, SF: Computer science
Scientific discipline, SD: Game development
Subject/Key words, S/KW: XNA, 2D game development
UC 005.311.7
519.83
004.4’275
Holding data, HD: library
Note, N:
Abstract, AB: This thesis contains the use of the XNA framework for 2D game development. Beside the basic methods for making video games the work contains methods of planning as well as techniques for optimizing the video game production. Additional tools for making of the game: 2D Motion capture tools; Map editors for manipulation of objects in-game; Video converter tool for making textures;
Accepted by the Scientific Board on, ASB:
Defended on, DE:
Defended Board, DB: President:
Member:
Member, Mentor:
Образац Q4.09.13 - Издање 1