Meeskond "Miinipilduja tuli"

From ICO wiki
Jump to navigationJump to search

Sissejuhatus

Mäng on tehtud, kasutades C# standard teegis olevat System.Drawing süsteemi. Mängus jookseb peategelane "Lena" ringi ja võitleb ellujäämise nimel(ning ka parema highscore-i tulemuse nimel). Lena võitleb müütiliste olenditega kaugetest galaktikatest ja küsimus ei ole siinkohal, kas ta jääb ellu, vaid kui kauaks ta jääb ellu?

Versioonihalduseks kasutasime privaatsed Subversion repot.

Kasutusjuhend

Paigaldamine

  • Alustamiseks, tuleb mäng allalaadida meie wiki lehelt. Selleks on aadress: Installer.
  • Seejärel otsige üles koht, kuhu mängu installer on tõmmatud ja vajutage see käima.
  • Järgnevalt küsitakse teilt, kas te olete kindel, et tahate seda käima lükata? Vajutage nupule run, mis suunab teid installeri juurde.
  • Avanenud installeril Vajutage nupule Next ja teilt küsitakse kohta, kuhu mäng paigaldada. Vaikimisi on selleks kohaks C:\Program Files\Miinipilduja\Long Donut\.
  • Vajutades nupule Disk Cost, saate teada palju teil on arvutis vaba ruumi, palju ruumi mäng võtab ja tulemust, palju teil jääb alles vaba ruumi, pärast mängu paigaldamist
  • Valige koht, kuhu mäng salvestada, ning allpool saate ka valida,kas soovite mängu paigaldada ainult endale, või ka kõigile teistele kasutajatele arvutis, ning vajutage nuppu Next.


  • Vajutades nuppu next, küsitakse teilt veel üle kinnitust. Kui olete oma toimingutes kindel, vajutage nuppu next ja alustatakse mängu paigaldamisega.
  • Kui mäng on paigaldatud,visatakse ette viimane aken, mis annab teile teada, et mäng on õnnestunult paigaldatud. Vajutage nupule close ja mängu käivitamiseks minge kausta, kuhu te mängu paigaldasite.

NB! Paigaldamise käigus võib UAC(User Account Control) küsida üle teilt kinnitust, et tahate mängu paigaldada. Sel juhul, vajutage nupule "yes", ja paigaldamine jätkub.

Mängimine

Mängimiseks lükake mäng käima failist "LongDonut.exe" ja teile avaneb mängu peamenüü, võimalustega alustada uut mängu, näha hetke Tulemusi, ning väljuda mängust. Valige Uus Mäng, et alustada mängu,nuppu tulemused, et näha hetkeseisu tulemustetabelis ning välju, et lahkuda mängust.

Eesmärk

Mängu Eesmärgiks on tappa nii palju vastaseid, kui vähegi võimalik, jäädes ise sealjuures ellu. Mängu ülemises vasakus nurgas paikneb teenitud punktid,mille alusel peetakse tulemustabelit, hetke level ja wave. Nendest räägime täpsemalt Punktid, Level ja Wave alampealkirjas.

Juhtimine ning Tulistamine

Mängu juhtimiseks kasutatakse noolklahve, ning tulistamiseks hiirt.

Paus menüü ning jätkamine

Igal ajal on võimalik mäng korra peatada ning tulla tagasi menüü-se. Selleks võite vajutada erinevaid klahve: p, esc, Pause. Paus menüüs näete nuppe Jätka, mis on mõeldud mängu jätkamiseks, Tulemused, et näha hetke tulemustabeli seisu, ning ka nuppu Välju, juhul kui soovita mängust väljuda.

NB! Mängu ei salvestata, mis tähendab seda, et kasutades nuppu välju, ei ole hiljem võimalik vana mängu taastada ja punktid lähevad kaduma.

Punktid, Level, Wave

Mänguvaate ülemises vasakus nurgas paikneb teenitud punktid, hetke level ja hetke wave-i. Punkte teenitakse tapetud kollide arvelt, ning olenevalt levelist,saate iga tapetud vastase pealt vastavalt kas 1,2,3,4..jne punkti. Levelid tõstavad nii saadud punktide arvu ühe vastase tapmise eest, kui ka vastaste tugevust. Level 2 vastase tapmiseks, tuleb talle juba pihta saada 2 korda, level 3 vastase tapmiseks 3 korda - seega levelist sõltub nii saadavate punktide arv, kui ka vastaste tugevus. Leveli tõstmiseks, peate läbi elama 5 erinevat vastaste lainet, igas laines 20 vaenlast. Wave näitabki teile, mitmenda lainega on hetkel tegemist, ning mitu vaenlast on hetke laines elus. Uue laine jaoks peate hävitama kõik hetkel elus olevad vaenlased.

Tulemus menüü

Tulemus menüü vaatamiseks on erinevaid võimalusi: Peamenüüs vajutada nupule Tulemused, sama nupp on olemas ka Paus menüüs, kui ka surma järgses menüüs ehk Death menüüs.

Tulemus menüüd kuvatakse automaatselt pärast surmasaamist, ning seal on ära näidatud eelnevate mängijate punktid. Kui teie hetketulemus ületab teiste mängijate tulemusi, siis kuvatakse see "highlighted" ehk teistest tulemustest erinevalt valgena. Kui teie tulemus ei ületa ühtegi teist tulemust tulemus tabelis,siis kuvatakse kollasena vaid teiste mängude tulemused. Tulemus menüüst lahkumiseks vajutage all olevat nuppu jätka, ning teid suunatakse tagasi eelmisele lehele, või siis Death Menüüsse, kui tegemist oli automaatse suunamisega Tulemus menüüsse.

Death Menüü

Death menüü sarnaneb Pea menüüga, ning erinevus seisneb vaid selles, et nupu asemel Uus Mäng, on teil nupp nimega Alusta Uuesti. Samuti on teil Death menüüs alati võimalus minna tagasi vaatama mängijate tulemusi või siis võimalus, lahkuda mängust, kasutades selleks nuppu Välju.

Tööjaotus

Taavi Ilves

- Collision detection

- Tegelase liikumise clippimine

- Tulistamise arvutamine

- Levelite, Skoori, Wave'ide jms arvutamine

- Elektri effekt

- ObjectList wrapper List'ile

- XML mapi parsimine

- Jms. jooksvad asjad

Tanel Liiv

- Sound

- Vastased, nende liikumise loogika

- Tegelase liikumine ja loogika

- XML tulemuste salvestamine, kuvamine

- Mapi dünaamiline joonistamine

- Muu joonistamine

- Jms. jooksvad asjad

- Installer

Jaan Vahtre

- Peamenüü,Pausmenüü,Tulemuste Menüü,Death Menüü vaatedete kujundamine, vaadete ühendamine mängu koodiga.

- Nuppude kujundamine, ja nende kuvamise ühendamine koodiga.

- Logod

- Dokumentatsioon

- Juhend

- Wiki

- Jms. jooksvad asjad

Esialgsed plaanid

Esialgu oli plaanis teha lihtne tulistamisemäng, peategelase ja hulga vaenlastega. Lihtne peamenüü 2-e nupuga: Uusmäng ja välju, ning oli ka teada, et luua tuleb eraldi collision detection, sest me ei teinud mängu XNA-s.

Esialgsed plaanid

  • Collision detection.
  • Tulistamise arvutamine.
  • Vastased, nende liikumise loogika.
  • Tegelase liikumine ja loogika
  • XML mapi tegemine
  • Mapi dünaamiline joonistamine
  • Menüü joonistamine ning ühendamine koodiga.
  • Nuppude kujundamine ja ühendamine koodiga.
  • Dokumentatsioon
  • Juhend

Log

2.September

Grupi moodustamine, Idee arutlus, Esialgsete ülesannete jagamine.

3.September

Graafiline displei ehk mängu tagatausta joonistamine. Mängija joonistamine,Jalgade liigutamine, ja Double buffer.K Esinesid esimesed probleemid: Graafika joonistamisel, mängu kiirus langes.

4.September

Mapi Piiride arvutamine ja kuvamine. Parandati liikumise ja graafika kuvamise arvutamine ära.Mängule lisati ka parem graafika, mis mõjus oluliselt mängu kiirusele. Esinenud probleemid: Collision Detection ei tööta, Lisatud Uus graafika, mõjus oluliselt mängu kiirusele. Pöörduti tagasi vana Graafika juurde (kahe suure commiti mahus).

5.September

MapObject List sorteeriti y koordinaadi poolt, enne tagastamist. Collision Detection töötab.

6.September

Loodi monsterite baas ning joonistati staatilised vaenlased. Lisati ka liikumine ning mängija tagaajamine.

13.September

Joonistati Mängu logo ja peamenüü.

14.September

Joonistati välja Uus Mäng nupp, ning lisati see peamenüüsse. Probleemid: Arvuti tegi update-i ja nupu kujundus läks kaduma.

16.September

Peamenüü lisamine mängu, koos Uus Mäng nupuga. Mängul oli nüüd 2 erinevat vaadet:peamenüü, kust sai alustada uut mängu ja mängu vaade.

22.September

Mängule lisati heli. Probleemid: Ainult üks heli sai korraga mängida ning seetõttu läksid mõned helid mängus kaduma.

23.September

Uus interface, lisatud omatehtud border ning koodi lisati ka pausmenüü võimalus.

10.Oktoober

Uus ja parandatud helisüsteem.

12.Oktoober

Mängijale lisati elud ja nüüdsest sai mängija ka surma.Lisati ka punktide arvestus ning tulistamisele lisati "lightning" effekt.

13.Oktoober

Lisati ThreadLocking võimalus. Mäng oli nüüd Threadsafe!

14.Oktoober

ObjectList clone, Threadlock width Monitor. Veel lisati uued helid, pandi map liikuma tüdruku jalge all, lisati Monster.cs klass.

16.Oktoober

Lisati menüüd: DeathMenüü, Tulemus Menüü, ning lisati neile nupud Alusta uut mängu, Tulemused, Välju. Probleemid: uut mängu ei olnud võimalik alustada.

17.Oktoober

Lisatud peamenüüse Tulemused ja Välju nupud, Tulemus menüüsse tagasi nupp. Uus Death Menüü.

18. Oktoober

Alusta uut mängu võimalus töötab.

19.Oktoober

Uus Tulemus menüü tagataust ja tagasi nupule lisatud Glow.

21.Oktoober

Kogu tekst kommenteeritud, Tulemus menüü töötab, Uus font Tulemuste salvestamiseks.

22.Oktoober

Surma saades ei lähe enam DeathMenüüsse, vaid Tulemus menüüsse.Lisati veel kommentaare ja parandati Timer-i vigu. Timer ründas liiga paljudes erinevates menüüdes.

23.Oktoober

Parandati mängija liikumine.Loodi installikas ning lisati installikas, dokumentatsioon wikisse. Wiki loomine.

Huvitavat

1. Tegelase juhtimine

Kuna C# standardses libras ja üldse windowsi applicationite puhul on üks tore asi see, et klavatuuril nuppu all hoides, saadetakse alguses 1 signaal, siis tekib umbes poole sekundiline delay ja siis hakatakse juba järjest signaale saatma. See tekitab tegelase liikumisse delay sisse.

Lahendus oli siis selline. Kui mingit nuppu vajutati, registreeriti liikumise flag ja suund. Siis iga taimeri "ticki" ajal vaadati kas liikumise flag oli püsi, kui jah, liiguti, kui ei, siis ei juhtunud midagi. Siis kui nupp lahti lasti, võeti flag maha ja järgmise taimeri "ticki" ajal enam liikumist ei toimunud. Nii liigubki tegelane nüüd sujuvalt. :)

2. Map objektid threadsafe

Meie mängus jookseb korraga 2 threadi. Üks on main thread, kus toimub joonistamine ja siis luuakse pidevalt taimeri poolt "tick" threade, kus toimub tegelase ja kollide liikumine, kollide eemaldamine, skoori arvutamine, leveli arvutamine jne. Juhul kui eelpoolt nimetatud thread kasutab Map objektide listi ja näiteks eemaldab sealt mõne objekti ja samal ajal kasutab ka main thread seda, tekib exception, kuna listi muudeti tema kasutamise ajal.

Lahenduseks, tegin List objekti ümber "wrapperi", kuhu kirjutasin vajalikud meetodid (Clone, Remove, Add, Clear jne.) ja tegin kõik tegevused thread safe'iks. Kasutades Monitor.Enter ja Monitor.Exit meetoteid. See tagab selle, et threadid ei kasutakas samal ajal objekte vaid ootaks üksteise järele.

3. Collision detection

Collision detection on puhtalt ise kirjutatud ja suudab takistada suvaliste suurustega ristkülikute kokkupõrget. Meetod on piisavalt optimaalne mitmesaja eluka(+puud, tegelane ja muruplatsi piirid) ringiliigutamiseks/kollisioonide kontrollimiseks ilma märgatava aeglustumiseta.

4. Heli

Kuna C# standard teegis ei ole mõistliku helimängijat(Soundplayer suudab mängida vaid ühte heli korraga, st. puudub software mixing) siis kasutasime heli jaoks välist teeki irrKlang. irrKlang võimaldab tänu oma lihtsale API'le ja software mixingule mängida korraga mitmeid helisid :)