torsdag 30 december 2010

Spara och återskapa levels

Levels kommer i grupper. Gruppen kallar vi för en galax och en level är ett solsystem i galaxen. Spelaren väljer vilken level som ska spelas i aktiviteten LevelPicker:



Varje galax har sin "palett", dvs tillhörande rådata som bakgrundsbilder, monster, planeter, ljud mm. Dessa defineras (kommer att defineras) i en xml-fil och förallokeras för att korta ner tiden det tar att starta en level. Varför definera detta i xml-filer? Jo, det är det bästa sättet att peka ut resurser i Android.



Varje level beskrivs i binärfiler. Filen är en serie instruktioner för att skapa en komplett level. Levels och deras tillhörande data kopplas samman i leveltree.xml.

Levelfiler skapas i LevelSerializer (ren java), och packas upp i LevelBuilder (del av Android-koden).

Binärfilens protokoll
Det första som står i filen är dess versionsnummer (en int), som måste vara samma över hela Level-systemet för att fungera. Sedan följer instruktioner i form command-data-command-data osv. Commands är alltid representerade med en Java short, datat på olika form beroende på vad som står där. Instruktionsuppsättningen är självdokumenterande i LevelSerializer.java.

Efter versionsnumret defineras varje GameObject, i den ordning som de ska uppträda under GameObjectManager.

För varje GameObject läses först dess fields in (såsom id, position, hastighet) i valfri ordning. Sedan läses varje GameComponent in i den ordning de ska uppträdai sitt GameObject.

GameObjectManager

GameObjectManager representerar i princip en hel level. Barnen i GOM är GameObjects, som representerar de olika elementen i spelet, typ en planet, en skurk, spelaren, en bakgrundsbild.

GOM är en nod i GameTree naturligtvis. Strukturen ser sedan ut så här:



Mer än så är det inte. GameComponents är det som ger liv till ett GameObject: RenderComponent håller en bild, MovementComponent beräknar rörelse, ja du fattar.

Detta är anledningen till att deserialization av en level-fil inte är rekursiv: trädet har ett fördefinerat djup.

Level system: överblick

Det är så mycket mer än jag trodde!! Detta är en (komplett?) översikt:





GameObjectManager är den nod i Game-trädet som håller alla spelobjekt (GameObjects, som i sin tur har en massa GameComponents som ger den sina egenskaper, typ bild, animation, AI, rörelser, fysik...).

LevelSerializer och LevelBuilder är de som tillverkar respektive packar upp levels från binärfiler.