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

Specialeffekter och spelutveckling i Java(TM) - Appleten SpacePirates

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

public class spacepirates 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;
Image pirateship[];
int piratev[],piratepy[],piratepx[],piratedy[];
int maxpirates=3;

//Arrayen "explosion" får hålla animationen
//på explosionen.
Image explosion[];

//Nya variabler måste läggas in för skeppen
//som indikerar om dom har exploderat och om
//dom skjuter eller inte.
//Följande är specifika för polisskeppet.
int exploding=0;
int shooting=0;

//Dessa är specifika för piratskeppen.
int pirateexploding[];
int pirateshooting[];

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);
    pirateship=new Image[5];
    for (int i=0; i < 5; i++)
    {
        pirateship[i]=getImage(getDocumentBase(),"pirateship"+i+".gif");
        tracker.addImage(pirateship[i],i+6);
    }

    //Explosionsbilderna laddas in och läggs
    //på position 11 i spåraren.
    explosion=new Image[6];
    for (int i=0; i < 6; i++)
    {
        explosion[i]=getImage(getDocumentBase(),"explosion"+i+".gif");
        tracker.addImage(explosion[i],i+11);
    }

    try {tracker.waitForAll();}
    catch(InterruptedException e)
    {
        System.out.println("Någonting stoppade inladdningen...");
    }

    py=150;
    piratev=new int[maxpirates];
    piratepy=new int[maxpirates];
    piratepx=new int[maxpirates];
    piratedy=new int[maxpirates];
    pirateexploding=new int[maxpirates];
    pirateshooting=new int[maxpirates];

    for (int i=0; i < maxpirates; i++)
        initPirateShip(i);
}

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

public boolean mouseDown(Event e, int x, int y)
{
    //Om spelaren klickar på musknappen
    //så ska skeppet skjuta under 5 bildrutor.
    shooting=5;
    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 startar alltid
    //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++)
    {
        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];

        if (piratepx[i] < -100) initPirateShip(i);
        piratepx[i]-=4;
        if (Math.random() < 0.05) piratedy[i]=(int) (Math.random()*300.0);

        //Piratskeppen kommer att skjuta med
        //1% chans för varje bildruta.
        if (Math.random() < 0.01) pirateshooting[i]=3;
    }
}

public void drawPoliceLaser()
{
    //Använd blå färg för
    //lasern.
    bufferg.setColor(Color.blue);

    //Beroende på hur skeppet svänger så
    //måste vi rita laserstrålarna med
    //olika avstånd från centrum.
    //Dom ritas tvärs över skärmen.
    if (v==0)
    {
        bufferg.drawLine(50,py-26,400,py-26);
        bufferg.drawLine(50,py+26,400,py+26);
    }
    if (v/2==1 || v/2==-1)
    {
        bufferg.drawLine(50,py-24,400,py-24);
        bufferg.drawLine(50,py+24,400,py+24);
    }
    if (v/2==2 || v/2==-2)
    {
        bufferg.drawLine(50,py-15,400,py-15);
        bufferg.drawLine(50,py+15,400,py+15);
    }
    shooting--;
}

public void drawPirateLaser(int n)
{
    //Använd röd färg för
    //lasern.
    bufferg.setColor(Color.red);

    //Beroende på hur skeppet svänger så
    //måste vi rita laserstrålarna med
    //olika avstånd från centrum.
    //Strålarna ritas från piratskeppets
    //mynning piratepx[n] mot vänstra
    //kanten på appletskärmen.
    if (v==0 || v/2==1 || v/2==-1)
    {
        bufferg.drawLine(0,piratepy[n]-8,piratepx[n],piratepy[n]-8);
        bufferg.drawLine(0,piratepy[n]+8,piratepx[n],piratepy[n]+8);
    }
    if (v/2==2 || v/2==-2)
    {
        bufferg.drawLine(0,piratepy[n]-3,piratepx[n],piratepy[n]-3);
        bufferg.drawLine(0,piratepy[n]+3,piratepx[n],piratepy[n]+3);
    }
    pirateshooting[n]--;
}

public void drawPirates()
{
    for (int i=0; i < maxpirates; i++)
    {
        //Rita ut lasern om piraten skjuter och om
        //han syns på skärmen.
        if (pirateshooting[i] > 0 && piratepx[i] < 360)
        {
            drawPirateLaser(i);

            //Kolla om piraten träffade, dvs om han
            //är på ungefär samma höjd som polisskeppet
            //när han skjuter. Träffade han så spräng
            //polisskeppet. Kontrollera också att skeppet
            //inte redan har exploderat (exploding==0).
            if (exploding==0 && piratepy[i]-py>-20 && piratepy[i]-py < 20)
                exploding=6;
        }

        //Om skeppet exploderar så rita ut
        //explosionsanimationen. Centrera explosionen
        //kring skeppet.
        if (pirateexploding[i] > 0)
        {
            //Rita ut bilden på skeppet om
            //explosionen inte har kommit
            //längre än bildruta 3.
            if (pirateexploding[i] > 3) bufferg.drawImage(pirateship[2+piratev[i]/2]
                ,piratepx[i],-25+piratepy[i],this);

            //Rita explosionen.
            bufferg.drawImage(explosion[6-pirateexploding[i]]
                ,piratepx[i]-18,piratepy[i]-50,this);

            //Byt till nästa explosionsbildruta.
            pirateexploding[i]--;

            //Om explosionen är slut så
            //"skapa ett nytt skepp".
            if (pirateexploding[i]==0) initPirateShip(i);
        }

        //Piratskeppet skall inte ritas HÄR om
        //den håller på att explodera.
        if (pirateexploding[i]==0) bufferg.drawImage(pirateship[2+piratev[i]/2]
            ,piratepx[i],-25+piratepy[i],this);
    }
}

public void drawPolice()
{
    //Om polisskeppet skjuter så rita ut laserstrålarna.
    if (shooting > 0)
    {
        drawPoliceLaser();

        //Kolla om lasern träffade några pirater
        //och kontrollera också att piratskeppet
        //inte redan har exploderat
        //(pirateexploding[i]==0).
        for (int i=0; i < maxpirates;  i++)
        {
            if (pirateexploding[i]==0 && piratepy[i]-py > -20 && piratepy[i]-py < 20)
                pirateexploding[i]=6;
        }
    }
    //Om skeppet exploderar så rita ut
    //explosionsanimationen. Centrera explosionen kring
    //skeppet.
    if (exploding > 0)
    {
        //Rita ut polisskeppet om man ligger under
        //tredje explosionsrutan.
        if (exploding > 3) bufferg.drawImage(policeship[2+v/2],0,-55+py,this);

        //Rita explosionen ovanför skeppet.
        bufferg.drawImage(explosion[6-exploding],-18,py-50,this);

        //Byt till nästa explosionsbildruta.
        exploding--;

        //Om explosionen är slut så rensa
        //hela skärmen på piratskepp och starta om.
        if (exploding==0)
        {
            for (int i=0; i < maxpirates; i++)
                initPirateShip(i);
        }
    }
    //Polisskeppet får bara ritas ut här om
    //den inte håller på att explodera.
    if (exploding==0) bufferg.drawImage(policeship[2+v/2],0,-55+py,this);
}

public void run()
{
    while (true)
    {
        movePoliceShip();
        movePirateShips();

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

        //När marken är utritat så är det dags
        //att rita ut skeppen och laserstrålarna.
        drawPolice();
        drawPirates();

        update(getGraphics());
        try {Thread.sleep(sleeptime);}
        catch(InterruptedException e) {}
    }
}

}