mandag den 31. maj 2010
en spildt dag
fredag den 28. maj 2010
Powerups
3. iteration påbegyndt
Efter vi har implementeret grafik på Player, er vi stødt på det problem at vores collision-detection ikke fungerer optimalt. Dette er fordi at playeren nu ikke mere blot er en cirkel, og derfor skal vi have fundet en matematisk måde at udregne punkterne på Playeren i hans nuværende form.
onsdag den 26. maj 2010
Tredje iteration
Anden iteration:
Vi har afsluttet denne, dog med et tilbagevendende kasseproblem, hvor de stadig lægger sig oveni hinanden. Vi vil forsøge at komme dette til livs ved at kigge tjekpunkterne igennem igen, da det højst sandsynligt er her fejlen ligger. Vi vil endvidere forsøge at kondensere tjeksne på kugler vs. kasser.
Tredje iteration:
I denne vil vi forsøge at implementere de sidste af opgavens krav:
- Powerups: Ekstra liv, et supervåben over en lille periode eller et bestemt antal skud og speedboost.
- Vi laver det så at spilleren bliver flyttet ned i hjørnet når han dør, samtidigt med at zombierne bliver flyttet lidt op på banen for at de ikke står og dræber spilleren oveni spawn-zonen.
- Score-, liv- og levelcounter oppe i hjørnet.
- Tekstur og grafik: Stengulv og trækasser/containere samt billeder i fugleperspektiv af os som zombier såvel som helten med en stor skyder.
søndag den 9. maj 2010
For at bestemme zombiens retning imod Player, fandt vi den indbyggede funktion Math.atan2(y,x):Number, som beregner vinklen fra (0,0) til (y,x). Funktionen returnerer en radian, som kan omregnes til grader med radian*180/Math.PI. Punktet som vi ønskede at finde vinklen til, var (zombieX-playerX , zombieY-PlayerY), og zombiens retning kunne altså findes ved:
Math.atan2(this.y-_player.y, this.x-_player.x)*180/Math.PI;
Zombierne ville således altid søge at bevæge sig imod players position, hvilket giver et problem idét de ofte vil "sætte sig fast" på den modsatte side af en kasse i forhold til playeren. Det virker heller ikke super "troværdigt" at zombierne altid ved nøjagtig hvor player er - uanset om de kan se ham eller ej (Overnaturlig lugtesans?). Behovet for en kunstig intelligens implementeret på zombierne er derfor nødvendig.
Dette har vi løst ved at implementere et check hver frame, som afgør hvorvidt zombierne kan se player, eller om han er skjult bag en eller flere kasser. Figuren nedenfor viser hvordan dette check forløber:
Der checkes hver frame på hver femte pixel i en lige linje mellem zombien og player, om koordinatsættet befinder sig indenfor en af kasserne i banen. Hvis der er klart udsyn, vil zombien sætte efter Player, og hvis udsynet er blokeret, vil zombien gå tilfældigt rundt.
Vi har yderligere implementeret en "glemme-timer", som gør at zombierne vil "glemme" at de følger efter Player hvis de mister den visuelle kontakt i seks sekunder, hvorefter de igen stener rundt og kigger efter player.
Klassediagram
Som en ny ting har vi implementeret MovingObject og Zombie i vores klassediagram. Vi har jf. tidligere blog indlæg samlet alt funktionalitet for bevægelse i MovingObject, og det ses fra nedarvningen at MovingObject er superclass for Zombie og Player. Vi har endvidere tillføjet en association mellem Zombie og Level, da et level indeholder et bestemt antal zombier, afhængig af variablen currentLevel.
Ahab
Vi har nu ligeledes fået implementeret en skydefunktion til spilleren. Vi er blevet inspireret meget af vores tidligere Astroids projekt, og er arbejdet ud fra samme principper med, at skyde den vej spilleren vender. Player bliver sendt med som parameter i Bullet klassen. ’Check impact’ funktionen er næsten den samme, som den der findes i Player klassen. Den tjekker på x og y koordinator på kuglen, og tjekker på om den er indenfor scenen eller inden i en kasse. Hvis dette er tilfældet, så dør kuglen! Kuglen har yderligere en levetid på 1½ sekund, hvilket tjekkes op på af en timer, som kører funktionen ’timeisup’.
I controlleren tilføjes mellemrumstasten som skydefunktion til spilleren.
Kasserne på scenen
Kasseproblemet:
Vi har løst kasseproblemet ved at sætte flere tjekpunkter ind. Som det var før blev der kun tjekket for overlapninger af andre kasser i øverste venstre hjørne. Dette har vi udvidet sådan at der bliver tjekket i alle hjørner, midten og midten af alle sider på kasserne. På denne måde tjekker den alle mulige scenarier for overlapning. De mulige scenarier på nær et ses på billedet nedenfor. Tjekpunktet i midten er i tilfælde af at en mindre kasse genereres oven i en større.
Dette fungerer kodemæssigt således, at hver ny kasses position tjekkes af Level-klassen. Hvis den nye kasse overlapper en anden, tjekkes et nyt tilfældigt sted der ingen overlapninger er. Efter et succesfuldt tjek oprettes kassen på scenen.
I teorien kan dette tjek gentage sig i en uendelighed, men sandsynligheden for dette problem er så lav at, det tæt på ingen risiko udgør.
mandag den 3. maj 2010
Afslutning af første iteration og planlægning for næste
Vi har i dag afsluttet første iteration uden dog helt at nå målet. Vi har ikke fundet en løsning på problemet med kasserne, der overlapper hinanden. Vi har imidlertid fået implementeret en spiller med fungerende styresystem via piltasterne. Vi har ligeledes lavet collision detection således at spilleren ikke kan gå igennem kasserne eller uden for banens sider.
Plan for næste iteration
Planen for næste iteration er at implementere en skydefunktion til vores player. Vi vil endvidere forsøge at få forskellige typer zombier ind på scenen, som ligeledes har collision detection i forhold til kasserne samt banens sider. Zombierne skal efterfølgende gerne kunne skydes til døde af spilleren.
Vi forestiller os at lave tre typer zombier, med varierende hastighed, hit points og farve.
Vi vil sideløbende med denne iteration forsøge at løse problemet med kasserne.