Hem E-böcker Specialeffekter och spelutveckling i Java Den rörliga marken

Specialeffekter och spelutveckling i Java(TM) - Den rörliga marken

av Anibal Wainstein

5.1.2 Den rörliga marken

Spelet ser mer realistiskt om man lägger till marken. I det här fallet är det mörkgrönt-svarta moln som skall representera den svenska skogsterrängen. Bilden har behandlats med s.k. seamless effekt, så att vänstra och högra kanten passar om man skulle vilja lägga två kopior av bilden brevid varandra.

Bakgrundsbilden som används för marken. Den är seamless behandlad så att den vänstra och högra kanten passar ihop.

Meningen är att bilden sakta skall flyttas åt höger och därmed ge intrycket att polisskeppet åker framåt. När bilden tar slut så lägger man en kopia i kanten. Eftersom bilden upprepar sig själv så kommer spelaren inte att märka någonting. Det här är en fuskig teknik och förr eller senare kommer spelaren att börja känna igen terrängen. Men det räcker för det här typen av spel. Om du dock skall göra ett shoot'em up spel med hinder och annat som man måste flyga igenom, då blir det mer komplicerat. Tyvärr leder tekniken vi använder nu till att vi måste ladda in en enorm bild på c.a. 30 kilobyte. Detta gör att det tar en stund att ladda ner appleten, och kan leda till att man förlorar otåliga spelare. Vi börjar först med att lägga in följande rader i init() metoden precis före "try" raden:

//Innan vi anropar waitForAll() så lägger vi in "ground"
//i spåraren.
ground=getImage(getDocumentBase(),"woods.gif");
tracker.addImage(ground,5);


Bilden "ground" deklareras globalt i appleten med raderna nedan. Lägg in dem under deklarationen för de andra variablerna.

//Variabeln "ground" har bilden på
//marken.
Image ground;

//"groundposition" indikerar markens
//horizontella position.
int groundposition=0;

Variabeln "groundposition" kommer att användas för att flytta bilden horizontellt. Genom att dekrementera variabeln flyttas bilden åt vänster. Observera att dimensionerna på bilden är 600x300 punkter. Det betyder att den täcker hela appleten och lite till (200 pixels). Du undrar kanske varför bilden är större än appleten? Jo, för att minska "upprepningseffekten" som spelaren kommer att uppleva så använder vi en lite större bild. Utritningen av bilden sker i run() metoden:


//Marken åker med en hastighet på 2
//pixlar per bild.
//Vi måste också se till att markens
//position nollställs när den hamnar
//under -600 pixels. Bredden på bilden är
//nämligen 600 pixels.
groundposition-=2;
if (groundposition<-600) groundposition=0;

//Rita ut marken på den horizontella
//positionen "groundposition".
bufferg.drawImage(ground,groundposition,0,this);

//Om bilden inte räcker till för att fylla
//ut skärmen, dvs om groundposition<-200
//så rita ut en kopia i positionen
//(groundposition+600).
if (groundposition<-200)
    bufferg.drawImage(ground,(groundposition+600),0,this);

Lägg in raderna ovan istället för setColor() och fillRect() raderna. Dessa rader behövs inte längre nu när bakgroundsbilden rensar skärmen. Genom att "groundposition" dekrementeras med 2 hela tiden så rör sig bilden sakta åt vänster. Eftersom bilden är bara 600 pixlar bred, måste man nollställa "groundposition" så att bilden börjar om från början igen. Dessutom finns problemet att när bilden har flyttats mer än 200 pixlar åt vänster kan den inte täcka hela appletskärmen längre (skärmens bredd är ju bara 400 pixlar).

För att bakgrounden skall täcka hela appleten när groundposition är mindre än -200 pixlar så måste man rita ut en kopia i positionen (groundposition+600). Appletskärmen är markerad med rosa.

För att lösa problemet ritar man ut bilden igen, 600 pixlar längre bort. Man förlänger bilden helt enkelt. Resultatet kan du se här.

 

 

Nästa sida >>