Hem E-böcker Specialeffekter och spelutveckling i Java Appleten SpacePiratesStep 1

Specialeffekter och spelutveckling i Java(TM) - Appleten SpacePirates Step 1

import java.applet.*;
import java.awt.*;

public class spacepiratesstep1 extends Applet implements Runnable {

//Vi slipper inte ifrån trådhantering den här
//gången.
public Thread programthread = null;

//Tidsfördröjningen på bilderna i spelet
//får vara 60 millisekunder.
int sleeptime=60;

//Arrayen "policeship" innehåller animationen
//för polisskeppet.
Image policeship[];

//Vi måste förstås använda dubbelbuffring.
Image bufferimage;
Graphics bufferg;

//Variablerna "y0" indikerar muspekarens
//vertikala position. Vi har ingen nytta
//av den horizontella positionen.
int y0;

//Variabeln "v" indikerar polisskeppets
//vertikala hastighet och "py" indikerar
//skeppets vertikala position.
int v=0, py=0;

public void init()
{
    Dimension d=size();
    bufferimage=createImage(d.width,d.height);
    bufferg=bufferimage.getGraphics();

    //Vi använder oss som vanligt av en
    //for-slinga för att ladda in
    //animationen. Polisskeppets animation
    //är på 5 bilder.
    policeship=new Image[5];
    MediaTracker tracker=new MediaTracker(this);
    for (int i=0; i<5; i++)
    {
        policeship[i]=getImage(getDocumentBase(),"policeship"+i+".gif");
        tracker.addImage(policeship[i],i);
    }
    try {tracker.waitForAll();}
    catch(InterruptedException e)
    {
        System.out.println("Någonting stoppade inladdningen...");
    }

    //Polisskeppets positionsvariabel initieras
    //så att skeppet startar i mitten av skärmen.
    py=150;

}

public boolean mouseMove(Event e, int x, int y)
{
    y0=y;
    return true;
}

public synchronized void paint(Graphics g)
{
    //Det enda man gör i paint() är att
    //rita ut bufferbilden. Allt annat
    //ritande görs i run() metoden.
    if (bufferimage!=null) g.drawImage(bufferimage,0,0,this);
}

public void start()
{
    if (programthread == null)
    {
         programthread = new Thread(this,"programthread");
         programthread.start();
    }
}

public void stop()
{
    if ((programthread != null) && programthread.isAlive())
        programthread.stop();
    programthread = null;
}

public void update(Graphics g)
{
    paint(g);
}

public void run()
{
    while (true)
    {
        //Om muspekaren pekar ovanför skeppet
        //så accelerera nedåt.
        if (y0-py>0) v++;

        //Om muspekaren pekar nedanför skeppet
        //så accelerera uppåt.
        if (y0-py<0) v--;

        //Låt skeppet stå still när muspekaren
        //är i samma position som skeppet.
        if (y0-py==0) v=0;

        //Hastigheten får högst vara 4 pixlar
        //uppåt eller nedåt.
        if (v<-4) v=-4;
        if (v>4) v=4;

        //Lägg till hastigheten.
        py+=v;

        //rensa skärmen.
        bufferg.setColor(Color.black);
        bufferg.fillRect(0,0,400,300);

        //När polisskeppet skall ritas ut så kan vi
        //använda oss av hastigheten. policeship[2]
        //är ju bilden på skeppet när det står still.
        //Dela hastigheten med 2 och så får du värden mellan
        //-2 och 2. Lägg till 2 och du får värden mellan
        //0 och 4 vilket är animationen av skeppet när det
        //svänger.
        //Slutligen måste vi också se till att
        //bilden på skeppet justeras så att den vertikala
        //medelpunkten i skeppet pekar där muspekaren pekar.
        bufferg.drawImage(policeship[2+v/2],0,-55+py,this);
        update(getGraphics());
        try {Thread.sleep(sleeptime);}
        catch(InterruptedException e) {}
    }
}

}