Kungliga Tekniska Högskolan Vårterminen 2002 Systembeskrivning Projekt Alpha Panic Uppdragsgivare: IABA, Institutet för Tillämpad Beteendeanalys Alex Olwal Oskar Rönnberg Dokumentationen finns tillgänglig på Internet: http://www.nada.kth.se/projects/proj02/alpha Projektmedlemmar: Sara Erhlund, projektledare Albin Finne Martin Greber Per Karefelt Mark Peldius Susan Ström Peter Söderlund
Innehållsförteckning INNEHÅLLSFÖRTECKNING...2 FIGURFÖRTECKNING...2 INTRODUKTION...3 INTRODUKTION...3 BAKGRUND...3 DOKUMENTATION...3 AVGRÄNSNINGAR...3 MODULER...4 ANVÄNDARPROFIL...4 Statistik...4 ORDMODULEN...5 SPELMOTORN...5 3DMOTORN...8 3DMODEL...9 PARTIKELSYSTEM...9 PANELMODULEN...0 BANAN...0 SYSTEMSKISS... SYSTEMSKISS... DATAFLÖDESDIAGRAM...2 REFERENSER...3 Figurförteckning FIGUR : ANVÄNDARPROFIL OCH STATISTIK...4 FIGUR 2: SPELMOTORN...5 FIGUR 3: BONUSAR OCH SPEEDBOOSTS...6 FIGUR 4: SPELETS HUVUDLOOP...7 FIGUR 5: 3DMOTORN...8 FIGUR 6: 3DMODELLEN...9 FIGUR 7: STATUSPANELEN...0 FIGUR 8: BANAN...0 FIGUR 9: SYSTEMSKISS... FIGUR 0: SYSTEMSKISS...2 2
Introduktion Bakgrund Alpha Panic är ett 3D racingspel. Först genom tunneln vinner. För att vara framgångsrik i spelet måste man ta upp speed boosts (för att öka färdhastigheten) och bonusar (för att försvåra spelet för opponenterna) genom att skriva korrekt och snabbt. Uppdraget var att skapa ett kul spel som tränar upp tangentbordsfärdigheter. Dokumentation Systemdokumentationen beskriver hur systemet bakom Alpha Panic är uppbyggt rent tekniskt. Efter en genomgång av samtliga moduler i systemet ges en beskrivning av hur modulerna förhåller sig till varandra. För mer information om spelet Alpha Panic hänvisas läsaren till projektpresentationen [] och spelmanualen [2]. Avgränsningar Systemdokumentationen håller sig på modulnivå av två anledningar: systemet är modellerat efter moduler (och kan därför förstås och förklaras bäst på den nivån), och det består av ett stort antal klasser som den intresserade bäst kan förstå genom att titta direkt på koden i sitt sammanhang, med hjälp av kommentarerna i koden. 3
Moduler Målet med systemmodelleringen var att uppnå en så generell och modulär lösning som möjligt. Då tid var den begränsande faktorn redan från början av projektet, var det av största vikt att prototypen skulle bestå av utbytbara delar som kunde vidareutvecklas var och en för sig, utan att kräva att de övriga delarna skulle påverkas. Resultatet av systemmoduleringen blev ett system som uppnått målet, och som projektgruppen och uppdragsgivarna var nöjda med. Genom att utveckla systemet i moduler underlättades framtagandet av en prototyp, som därmed demonstrerar samtliga moduler i varierande grad. Användarprofil Varje användare har en egen användarprofil (ett användarkonto) och loggar in via ett användarnamn och lösenord. Här lagras alla resultat och statistik från tidigare spelomgångar. Detta konto kan sedan lagras i en databas, eller lokalt hos användaren. Under inloggningsproceduren kan användaren ange vilka bokstäver han/hon vill träna på. Detta utför ett keyset som skickas till textmodulen för att välja vilka ord från en textfil som ska läsas in. Player -Name : String -Pos : float Profile -stats : Stats -Name : String Game -time Stats -KeyMatrix : int[][] -keys : KeySet -fingers : FingerSet +isempty() +getstatperfinger() : Boolean: int[] +getnext() +getstatperchar() : char : int[] +addkey(in +report() c : char) : void FIGUR : ANVÄNDARPROFIL OCH STATISTIK Statistik Grunden till statistikframtagning är en matris[i][j], där varje element i matrisen är en räknare som ökar med ett varje gång tangent j trycktes ner då spelet förväntade sig tangent i. Varje spelare har varsin matris under spelets gång. Efter spelet är avslutat, tas all tangentbordsträningsrelaterade statistik fram och sparas ned i ett antal mer kompakta datastrukturer. Underliggande struktur finns för att ta fram statistik per tangent, per finger, per hand, per spelomgång (jämfört med de andra spelarna), samt över de senaste omgångarna. 4
Genom detaljerad statistik kan användarna följa sin egen utveckling och få en bättre förståelse för det de behöver jobba på. Prototypen implementerar endast statistik per finger och statistik per tangent, till exempel, lyckade nerslag för tangent a är 75%. Ordmodulen Spelet läser in orden från en textfil. Denna modul läser olika sorters ord från en textfil, med någon kombination av följande egenskaper: ord som består av visa bokstavskombinationer (för att träna på särskilda bokstäver, eller särskilda fingrar), ord med en viss längd (för att variera svårighetsgraden) ord av varierande längd, och som innehåller alla bokstäver ord som innehåller svåra bokstavskombinationer. ord som användaren har misslyckats med förut. ord kring olika tema, eller ord från andra språk Prototypen implementerar en text fil med svenska ord av varierande längd, dock högst 8 bokstäver långt, med ord bestående endast av utvalda bokstäver. Spelmotorn KBD Input -KeyQueue : char +isempty() : Boolean +getnext() : char +addkey(in c : char) : void Track Player -Name : String -Pos : float Game -time -Current Word Triggers -pos : float -type : Boolean = =Speed, 0 = Bonus WordBank -keys : KeySet -words : Vector +getnextword() : String +loadwords() : string(idl) Expected Word -word : String -currentpos : int +update(in letter : char) : Boolean +isdone() : Boolean FIGUR 2: SPELMOTORN Denna modul är spelets hjärna och implementerar spelreglerna. Den håller reda på all information kring spelet: samtliga spelarna, deras position, vilken bokstav som 5
förväntas skrivas, vilken hastighet spelarna har, och vilka bonusar de har tagit. 3Dmotorn hämtar informationen från Game. Triggers är fasta positioner i banan. När en spelare åker förbi en trigger får han/hon ett ord att skriva. När ordet har skrivits färdigt skapas en bonus eller en speedboost, beroende på vad som bestämdes då spelet initierades. Om spelaren inte hinner skriva färdigt ordet innan nästa trigger passeras får spelaren ett nytt ord och det är den aktuella triggern som gäller. Dyn Object Speed Boost Item Track Bonus -time Game Triggers -pos : float -type : Boolean = =Speed, 0 = Bonus Weapon Shield Missile Mine MultiBomb FIGUR 3: BONUSAR OCH SPEEDBOOSTS För detaljer kring vad de olika items är, och hur man använder dem, se ref [2]. 6
Huvudloopen i spelmotorn (i klassen Game) kan beskrivas som följande: Nej Åk framåt Passerat trigger? = lagra even i statistik JA Skriv nytt ord på informationspanel. Förväntade bokstav = :a bokstav i nya ordetl Char in = förväntade bokstav? JA & nästa bokstav = null (sista bokstav i ordet) JA & nästa bokstav!= null Förväntade bokstav = nästa bokstav Skapa event Event = (speed boost eller bonusar, beroende på vad triggern var) Nej Inform event Sendinfo Other Clients Beräkna konsekvenser Konsekvenser = (ny position på spelare, har passerat en mina?) Uppdater spelstatus och statistik redraw FIGUR 4: SPELETS HUVUDLOOP Huvudloopen i klassen Game känner av om spelaren har passerat en trigger. Om inte, får spelaren åka fram med den hastighet/acceleration som är aktuell. Om spelaren har passerat en trigger får spelaren ett nytt ord och får börja skriva en bokstav i taget. Beroende på om spelaren skriver ordet korrekt, och om han/hon har avslutat ordet, händer olika saker enligt figuren. När man har skrivet klart ordet skapas ett event, som kan vara en speedboost eller en bonus. Information skickas till samtliga spelare över nätverk (de två rutor med kursiv text, till höger). Konsekvenser av eventen räknas ut och uppdaterar en lista innehållande samtliga spelare, deras position, hastighet och bonusar/speedboost. Statistik matrisen uppdateras och bilden ritas ut. 7
3DMotorn Denna modul frågar Game efter aktuell information om spelarnas positioner. Med denna information kan den rita ut banan och uppdatera panelens karta över banan och spelarnas positioner. Track -curve : Curve -totallaps : int -currentlap : int -environmentmatrix : int[][] -environmentmap : Map<int, 3DModel> Game -time : float -playerlist : Player -actionseqlist : Action Sequence 3DEngine -texturelist : Texture -3DModelList : 3DModel FIGUR 5: 3DMOTORN Action Sequence -visualeffect -state -soundeffect +updatestate(in time : float) : void Panel -arealist : Area För att rita ut nästa bild behöver 3D motorn sina 3D modeller (hur alla dynamiska delar ser ut i 3D), samt statuspanelen, som visar upp information i 2D. 8
3DModel 3DObject läsas in från 3D Studio Max-filer. 3DModel -statelist : State +update(in frame : int) : void 3DObject +verticeslist : Vertex -facelist : Face -filename : String ParticleSystem -particlelist : Particle -numparticles : int +init() : void Particle -pos : Vector3 -velocity : Vector3 -accel. : Vector3 -gravity : Vector3 -age : float +init() : void +respawn() : void Snow Smoke Rain Explosion Sparks FIre FIGUR 6: 3DMODELLEN Partikelsystem De 3D effekter som beror av många små rörliga delar (s.k. partiklar) som t.ex. explosioner och rök, styrs av partikelsystemet, d.v.s. utritning, positionering av partiklar etc. Varje partikelsystem har hand om ett visst antal partiklar som rör sig enligt olika mönster beroende på typen av partikelsystem. 9
Panelmodulen Statuspanelen visar upp information till spelaren om hans/hennes position relativt de andra spelarna (deras placering), var på banan de befinner sig (med en minikarta av banan), vilken hastighet spelaren har, samt vilken bonus spelaren har. WordArea Panel -arealist : Area RankArea Area -x : float -x2 : float -y : float -y2 : float DynImageArea -texturelist : Texture StatImageArea minimap SpeedArea FIGUR 7: STATUSPANELEN Banan Banan består av splinekurvor. Punkternas positioner läses från path.dat. Curve -segmentlist : Segment +posat(in t : float) : Vector3 Track -curve : Curve -totallaps : int -currentlap : int -environmentmatrix : int[][] -environmentmap : Map<int, 3DModel> FIGUR 8: BANAN 0
Systemskiss 3Dmodulen, bestående av Panelmodulen, 3Dmodulen (inkl. Partikelsystem), och banan, har följande struktur. Curve -segmentlist : Segment +posat(in t : float) : Vector3 Segment +posat(in t : float) : Vector3 Track -curve : Curve -totallaps : int -currentlap : int -environmentmatrix : int[][] -environmentmap : Map<int, 3DModel> 3DModel -statelist : State +update(in frame : int) : void 3DObject +verticeslist : Vertex -facelist : Face -filename : String -time : float -playerlist : Player -actionseqlist : Action Sequence Game 3DEngine -texturelist : Texture -3DModelList : 3DModel ParticleSystem -particlelist : Particle -numparticles : int +init() : void Particle -pos : Vector3 -velocity : Vector3 -accel. : Vector3 -gravity : Vector3 -age : float +init() : void +respawn() : void Action Sequence -visualeffect -state -soundeffect +updatestate(in time : float) : void Snow Smoke Rain Explosion Sparks FIre Panel -arealist : Area WordArea RankArea Area -x : float -x2 : float -y : float -y2 : float DynImageArea -texturelist : Texture StatImageArea minimap SpeedArea FIGUR 9: SYSTEMSKISS
Användarprofilen, spelmotorn, bonusar och ordmodulen har följande struktur: Player -Name : String -Pos : float Item Profile -stats : Stats -Name : String KBD Input -KeyQueue : char +isempty() : Boolean +getnext() : char +addkey(in c : char) : void Dyn Object Track Speed Boost Bonus Stats -KeyMatrix : int[][] -keys : KeySet -fingers : FingerSet +getstatperfinger() : int[] +getstatperchar() : int[] +report() -time Game -Current Word Triggers -pos : float -type : Boolean = =Speed, 0 = Bonus Weapon Shield FIGUR 0: SYSTEMSKISS WordBank -keys : KeySet -words : Vector +getnextword() : String +loadwords() : string(idl) Expected Word -word : String -currentpos : int +update(in letter : char) : Boolean +isdone() : Boolean Missile Mine MultiBomb Dataflödesdiagram Modulerna kommunicerar med varandra på följande sätt. AnvändarProfilen... Stat Stat n 3DModell Ord modulen GAME SpelMotorn/ 3DMotor 2D Statuspanel Items Bonusar Speedboosts Figur : Dataflödesdiagram 2
Referenser [] Sara Erhlund, Albin Finne, Martin Greber, Per Karefelt, Mark Peldius, Susan Ström, och Peter Söderlund. Projektpresentation. NADA, Kungliga Tekniska Högskolan, Stockholm, maj 2002. [2] Sara Erhlund, Albin Finne, Martin Greber, Per Karefelt, Mark Peldius, Susan Ström, och Peter Söderlund. Spelmanual. NADA, Kungliga Tekniska Högskolan, Stockholm, maj 2002. 3