Specialeffekter och spelutveckling
i Java(TM) - Appleten SlideShow
import java.applet.*;
import java.awt.*;
public class slideshow extends Applet implements Runnable {
public Thread programtrad = null;
int maxitems=0;
int sleeptime=0;
Image images[];
int currentimage=0;
//next-variablerna bestämmer vilken bild som
//skall visas och dess position
int nextimage = 0;
int nextimagexposition = 0;
int nextimageyposition = 0;
public void init()
{
maxitems=getIntegerParameter("maxitems",10);
sleeptime=getIntegerParameter("sleeptime",10);
images=new Image[maxitems];
MediaTracker tracker=new MediaTracker(this);
for (int i=0; i < maxitems; i++)
{
images[i]=getImage(getDocumentBase()
,getParameter("image"+i));
tracker.addImage(images[i],i);
}
try {tracker.waitForAll();}
catch(InterruptedException e)
{
System.out.println("Någonting stoppade inladdningen...");
}
}
public int getIntegerParameter(String name, int base)
{
String value=getParameter(name);
int intvalue;
try {intvalue=Integer.parseInt(value,base);}
catch (NumberFormatException e) {return 0;}
return intvalue;
}
public void start()
{
if (programtrad == null)
{
programtrad = new Thread(this,"programtrad");
programtrad.start();
}
}
public void stop()
{
if ((programtrad != null) && programtrad.isAlive())
programtrad.stop();
programtrad = null;
}
public synchronized void paint(Graphics g)
{
g.drawImage(images[currentimage],0,0,this);
//följande bild ritas ovanpå den gamla bilden
g.drawImage(images[nextimage]
,nextimagexposition,nextimageyposition,this);}
public void update(Graphics g)
{
paint(g);
}
public void run()
{
//vi tar reda på appletens dimension och
//sparar det i variabeln d. Vi kan nu komma
//åt appletens bredd och höjd genom att skriva
//d.width resp. d.height
Dimension d=size();
//displacement variablerna specifierar
//startkoordinaterna för bilden
int displacementx=0;
int displacementy=0;
//pathsize kommer att användas för att veta
//vilket avstånd som den nya bilden kommer
//att flyttas
int pathsize=0;
//currentimage initieras så att den börjar med
//den första bilden, följt av nästa bild som blir
//bild nummer två osv
currentimage=0;
nextimage=1;
while (true)
{
//Vi räknar ut vilket håll som den nya
//bilden skall flyttas från
int directionx=(int) (Math.random()*3.0)-1;
int directiony=(int) (Math.random()*3.0)-1;
//directionx och directiony kan komma
//att få tre värden: -1, 0 och 1.
//det är inte kul om båda får värdet 0
//samtidigt så därför så ändrar vi på
//directiony så att effekten blir lite
//roligare
if (directionx==0 && directiony==0) directiony=1;
//variabeln pathsize sätts till bredden eller
//höjden beroende på vilken som är lägst
if (d.widthd.height) pathsize=d.width;
else pathsize=d.height;
displacementx=directionx*d.width;
displacementy=directiony*d.height;
//följande rad är skydd mot problemet
//om användaren specifierar bara en enda
//bild
if (nextimage>maxitems-1) nextimage=0;
//följande slinga tar hand om att uppdatera
//skärmen under animeringen. Den kommer att
//flytta bilden antal ggr som specifieras
//av pathsize, dvs kortsidan av appleten.
for (int i=0; i < =pathsize; i++)
{
//bildpositionerna flyttas med
//bråkdelen (i/pathsize).
nextimagexposition=displacementx
-directionx*(i*d.width)/pathsize;
nextimageyposition=displacementy
-directiony*(i*d.height)/pathsize;
update(getGraphics());
try {Thread.sleep(sleeptime);}
catch(InterruptedException e) {}
}
//när flyttningen är klar så sätts currentimage
//till den nya bilden
currentimage=nextimage;
//Vi ökar nextimage så att den
//pekar på nästa bild, samtidigt så ser vi till
//att nextimage inte överstiger arrayens index
//utan att den tvingas börja om från början
nextimage++;
if (nextimage > maxitems-1) nextimage=0;
}
}
} |
 |  |
|