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 >>
|