Hem E-böcker Specialeffekter och spelutveckling i Java Hur din applet vet

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