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) {}
}
}
} |
 |  |
|