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

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

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

public class spacepiratesstep4 extends Applet implements Runnable {

public Thread programthread = null;
int sleeptime=60;
Image policeship[];
Image bufferimage;
Graphics bufferg;
int y0;
int v=0, py=0;
Image ground;
int groundposition=0;

//I variabeln "pirateship" är animationen
//för piratskeppen lagrade.
Image pirateship[];

//Det behövs fyra int-arrayer för
//rymdpiraternas  rörelser.
//"piratev" indikerar den vertikala hastigheten.
//"piratepy" indikerar den vertikala positionen.
//"piratepx" indikerar den horizontella positionen.
//"piratey" indikerar den vertikala positionen
//som piraten skall komma upp till efter en stund,
//dvs destinationen.
int piratev[],piratepy[],piratepx[],piratedy[];

//"maxpirates" indikerar hur många pirater som
// visas på skärmen samtidigt.
int maxpirates=3;

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

    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);
    }
    ground=getImage(getDocumentBase(),"woods.gif");
    tracker.addImage(ground,5);

    //Piratskeppen laddas in. De läggs i position 6
    //och framåt i spåraren.
    pirateship=new Image[5];
    for (int i=0; i < 5; i++)
    {
        pirateship[i]=getImage(getDocumentBase(),"pirateship"+i+".gif");
        tracker.addImage(pirateship[i],i+6);
    }
    try {tracker.waitForAll();}
    catch(InterruptedException e)
    {
        System.out.println("Någonting stoppade inladdningen...");
    }

    py=150;

    //Max fyra pirater skall finnas på skärmen
    //samtidigt.
    piratev=new int[maxpirates];
    piratepy=new int[maxpirates];
    piratepx=new int[maxpirates];
    piratedy=new int[maxpirates];

    //Piratskeppen initieras.
    for (int i=0; i < maxpirates; i++)
        initPirateShip(i);
}

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

public synchronized void paint(Graphics g)
{
    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 movePoliceShip()
{
    //movePoliceShip() metoden hanterar
    //polisskeppets rörelser.
    if (y0-py>0)
    {
        v++;
        if (y0-py<10) v=3;
        if (y0-py<5) v=1;
    }
    if (y0-py<0)
    {
        v--;
        if (y0-py>-10) v=-3;
        if (y0-py>-5) v=-1;
    }
    if (y0-py==0) v=0;
    if (v<-4) v=-4;
    if (v>4) v=4;
    py+=v;
}

public void initPirateShip(int n)
{
    piratev[n]=0;

    //De vertikala start- och  destinationspunkterna
    //får vara slumpmässiga.
    piratepy[n]=(int) (Math.random()*300.0);
    piratedy[n]=(int) (Math.random()*300.0);

    //Också skeppets horizontella position är
    //slumpmässig, fast vi lägger till ett värde
    //så att skeppet alltid startar
    //utanför appletskärmen.
    piratepx[n]=(int) (Math.random()*300.0+400.0);
}

public void movePirateShips()
{
    //movePirateShips() metoden hanterar
    //piratskeppens rörelser.
    for (int i=0; i < maxpirates; i++)
    {
        //Först tar man hand om de vertikala
        //rörelserna. Dessa rutiner är
        //identiska med polisskeppets men
        //man använder arrayer istället.
        if (piratedy[i]-piratepy[i]>0)
        {
            piratev[i]++;
            if (piratedy[i]-piratepy[i]<10) piratev[i]=3;
            if (piratedy[i]-piratepy[i]<5) piratev[i]=1;
        }
        if (piratedy[i]-piratepy[i]<0)
        {
            piratev[i]--;
            if (piratedy[i]-piratepy[i]>-10) piratev[i]=-3;
            if (piratedy[i]-piratepy[i]>-5) piratev[i]=-1;
        }
        if (piratedy[i]-piratepy[i]==0) piratev[i]=0;
        if (piratev[i]<-4) piratev[i]=-4;
        if (piratev[i]>4) piratev[i]=4;
        piratepy[i]+=piratev[i];

        //Nu räknar man ut det horizontella rörelserna.
        //Om piratskeppet har åkt förbi polisskeppet så
        //"skapa" ett nytt skepp.
        if (piratepx[i]<-100) initPirateShip(i);

        //Piratskeppen rör sig med hastigheten 4.
        piratepx[i]-=4;

        //Om slumpvärdet är mindre än 0.05 så räkna ut en
        //ny vertikal destination.
        if (Math.random()<0.05) piratedy[i]=(int) (Math.random()*300.0);
    }
}


public void run()
{
    while (true)
    {
        //Alla rader som hanterar polisskeppets
        //metoder har flyttats ut till metoden
        //movePoliceShip().
        movePoliceShip();

        //Metoden movePirateShips() hanterar
        //piratskeppens rörelser.
        movePirateShips();

        groundposition-=2;
        if (groundposition < -600) groundposition=0;
        bufferg.drawImage(ground,groundposition,0,this);
        if (groundposition < -200)
            bufferg.drawImage(ground,(groundposition+600),0,this);

        //For-slingan ritar ut alla piratskepp.
        //Nu använder vi piratepx för att placera
        //piratskeppen horizontellt.
        for (int i=0; i < maxpirates; i++)
            bufferg.drawImage(pirateship[2+piratev[i]/2]
                ,piratepx[i],-25+piratepy[i],this);

        bufferg.drawImage(policeship[2+v/2],0,-55+py,this);
        update(getGraphics());
        try {Thread.sleep(sleeptime);}
        catch(InterruptedException e) {}
    }
}

}