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