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