Specialeffekter och spelutveckling
i Java(TM) - Hur din applet vet hur muspekaren rör sig
av Anibal Wainstein
5.0.2 Hur din applet vet hur
muspekaren rör sig (mouseMove())
Metoderna
i förra avsnittet anropas bara när muspekaren går
in och ut ur appletskärmen. För att veta hur muspekaren
rör sig inom appletskärmen används mouseMove()
metoden. Den här metoden detekterar muspekarens rörelse
och ger dig positionen. Metoden ser nästan likadan ut
som mouseEnter() och mouseExit(). Vi börjar med att göra
ett litet test i form av en ritblock med en reservoarpenna
som rör sig tillsammans med muspekaren.
 
Bilden
på blocken "block.jpg" och pennan "pen.gif"
som används i testet.
Observera
att pennan är en transparent GIF 89 bild. Graphics-klassens
metod, drawImage(), klarar av att rita ut transparenta bilder
utan att behöva specifiera någon extra parameter.
Vi börjar som vanligt med att deklarera variablerna och
att initiera appleten i init() metoden:
//Variabeln "backgroundimage" pekar på
//bakgrundsbilden (bilden på skrivblocket).
Image backgroundimage;
//Variabeln "penimage" är pennan som rör
//sig i samband när du flyttar på muspekaren.
Image penimage;
//Nu måste vi använda dubbelbuffring för att
//slippa flimmer.
Image bufferimage;
Graphics bufferg;
//Muspekarens position lagras i variablerna
//"penx" och "peny" så att paint() metoden
//kan rita ut "penimage" på rätt position.
int penx;
int peny;
public void init()
{
//Initiera dubbelbuffringsverktygen.
Dimension d=size();
bufferimage=createImage(d.width,d.height);
bufferg=bufferimage.getGraphics();
MediaTracker tracker=new MediaTracker(this);
backgroundimage=getImage(getDocumentBase(),"block.jpg");
tracker.addImage(backgroundimage,0);
//Observera att "pen.gif" är transparent.
penimage=getImage(getDocumentBase(),"pen.gif");
tracker.addImage(penimage,1);
try {tracker.waitForAll();}
catch(InterruptedException e)
{
System.out.println("Någonting stoppade inladdningen...");
}
}
Den
här gången slipper vi inte undan dubbelbuffringen.
Den är nödvändig nu eftersom vi använder
mycket bilder när vi animerar. Vi måste också
skriva över update() metoden. Idén med appleten
är att man hela tider ritar ut en bakgrundsbild (I det
här fallet är det ritblocksbilden). Variablerna
"penx" och "peny" används för
att lagra positionen för muspekaren när mouseMove()
metoden anropas:
public boolean mouseMove(Event e, int x, int y)
{
//Genom att uppdatera pennans position hos
//variablerna "penx" och "peny" så kan vi
//senare rita ut pennan på den här positionen.
penx=x; peny=y;
//För att inte "överlasta" webb-läsaren så
//använder vi oss av repaint() metoden.
repaint(70);
return true;
}
Skärmen
måste uppdateras efter varje musrörelse så
att pennan ser ut att följa efter muspekaren. Problemet
här är att man inte kan uppdatera skärmen i
samma takt som mouseMove() anropas. Det är ganska krävande
att rita ut bilderna och det finns gränser för vad
datorn klarar. För att lösa detta använder
vi metoden repaint() som tar uppdateringstiden i millisekunder
som argument. Första gången repaint() anropas så
sätts en intern klocka som uppdaterar skärmen efter
70 millisekunder. Om mouseMove() och därmed också
repaint() anropas innan tiden har gått ut så ignoreras
detta. I princip betyder det att skämen uppdateras var
70 millisekund när muspekaren rör sig. Paint() metoden
ser ut på följande sätt:
public void paint(Graphics g)
{
if (bufferg!=null)
{
//Först ritar vi ut bakgrundsbilden.
bufferg.drawImage(backgroundimage,0,0,this);
//Sedan ritar vi ut bilden på pennan
//på positionerna som anges av
//"penx" och "peny". Vi måste också justera
//bildens position eftersom pennans spets
//pekar inte exakt på kanten av bilden.
bufferg.drawImage(penimage,penx-6,peny-6,this);
//Slutligen ritar vi ut bufferbilden på
//skärmen.
g.drawImage(bufferimage,0,0,this);
}
}
Observera
att vi måste justera pennbilden så att pennans
spets pekar exakt där muspilens spets pekar. Därför
så förskjuter vi pennbildens position med 6 pixlar
åt höger och uppåt. Nu är det dags att
titta på resultatet, klicka
här.
Nästa sida >>
|