Specialeffekter och spelutveckling
i Java(TM) -Appleten ButtonMenu
import java.applet.*;
import java.awt.*;
import java.net.*;
public class buttonmenu extends Applet {
//"maxitems" får hålla reda på hur
//många menyknappar användaren har
//specifierat.
public int maxitems;
//Nu när vi har flera knappar så
//måste vi göra om alla bildvariabler
//till arrayer.
public Image currentimage[],normalimage[],mouseoverimage[];
//Nu lägger vi till ännu en bild för att
//visa att besökaren har klickat på en knapp.
public Image mousedownimage[];
//Arrayen "urls" får hålla reda på
//adressen för varje knapp.
//"target" är målramen.
public String urls[],target;
//Vi slipper inte ifrån dubbelbuffringen
//den här gången, nu när vi ritar ut
//flera bilder. Dimension behövs också.
//Vi bör också låta användaren
//specifiera en bakgrundsfärg och
//bakgrundsbild.
public Image bufferimage;
public Graphics bufferg;
public Color backgroundcolor;
public Image backgroundimage=null;
public Dimension d;
//"currentitem" kommer att användas
//för att hålla reda på vilken
//knapp som precis har valts.
public int currentitem=0;
public void init()
{
MediaTracker tracker=new MediaTracker(this);
//Vi har tidigare använt oss
//av en "maxitems" parameter för
//att specifiera antal bilder eller
//meddelanden. Nu så kommer vi istället att
//söka oss fram. While-slingan kommer
//att leta efter parametern "normalimage0",
//"normalimage1", "normalimage2" osv tills
//den inte hittar fler sådana parametrar.
//Samtidigt så inkrementeras "maxitems" för
//att hållar räkningen.
maxitems=0;
while (getParameter("normalimage"+maxitems)!=null) maxitems++;
normalimage=new Image[maxitems];
currentimage=new Image[maxitems];
mouseoverimage=new Image[maxitems];
mousedownimage=new Image[maxitems];
urls=new String[maxitems];
//for-slingan laddar in alla bilder.
for (int i=0; i < maxitems; i++)
{
//Observera tricket vi använder för att
//lägga in bilderna i spåraren.
normalimage[i]=getImage(getDocumentBase(),getParameter("normalimage"+i));
tracker.addImage(normalimage[i],i*3);
mouseoverimage[i]=getImage(getDocumentBase(),getParameter("mouseoverimage"+i));
tracker.addImage(mouseoverimage[i],i*3+1);
mousedownimage[i]=getImage(getDocumentBase(),getParameter("mousedownimage"+i));
tracker.addImage(mousedownimage[i],i*3+2);
currentimage[i]=normalimage[i];
//Vi passar på att ladda in adresserna
//och lagrar dem i "urls".
urls[i]=getParameter("url"+i);
}
try {tracker.waitForAll();}
catch(InterruptedException e)
{
System.out.println("Någonting stoppade inladdningen...");
}
//Targetparametern laddas in...
target=getParameter("target");
//Här kommer koden som hanterar
//bakgrundsfärgen och bakgrundsbilden.
//Det är bara att klistra in raderna
//från textscroller3 exemplet.
backgroundcolor=new Color(getIntegerParameter("backgroundcolor",16));
String backimage=getParameter("backgroundimage");
if (backimage!=null &&
(backimage.toUpperCase().indexOf("JPG")>-1 ||
backimage.toUpperCase().indexOf("GIF")>-1))
{
backgroundimage=getImage(getDocumentBase(),backimage);
tracker.addImage(backgroundimage,0);
try {tracker.waitForAll();}
catch(InterruptedException e) {}
}
//Slutligen måste vi initiera bufferten.
//Det är bara att klistra in raderna
//från textscroller3 exemplet.
d=size();
bufferimage=createImage(d.width,d.height);
bufferg=bufferimage.getGraphics();
}
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 paint(Graphics g)
{
if (bufferg!=null)
{
if (backgroundimage!=null)
{
bufferg.drawImage(backgroundimage,0,0,this);
}
else
{
bufferg.setColor(backgroundcolor);
bufferg.fillRect(0,0,d.width,d.height);
}
//Slingan ser till att alla knappar
//ritas ut.
for (int i=0; i < maxitems; i++)
{
//Följande rad används för att centrera
//knappen horizontellt.
int dx=(d.width-currentimage[i].getWidth(this))/2;
//Följande rad används för att centrera
//knappen vertikalt.
int dy=(d.height/maxitems-currentimage[i].getHeight(this))/2;
//Observer att eftersom menyn är en vertikal
//meny så ser vi till att det finns ett
//steg på (d.height/maxitems) innan nästa
//knapp ritas ut.
bufferg.drawImage(currentimage[i],dx,dy+i*d.height/maxitems,this);
}
g.drawImage(bufferimage,0,0,this);
}
}
public void update(Graphics g) {paint(g);}
public boolean mouseMove(Event e, int x, int y)
{
//När muspekaren kommer in i appleten
//så måste vi räkna ut vilken knapp
//som han pekar på. Vi vet att
//området som varje knapp "innehar", är
//(d.height/maxitems). Så vi delar
//muspekarens y-parameter med det
//här värdet, och vi får ett index
//som vi kan använda.
currentitem=y/(d.height/maxitems);
//Först måste vi undersöka att innehållet
//i "currentitem" inte ger oss en
//ArrayOutOfBoundsException.
if (currentitem > =0 && currentitem < maxitems)
{
//"nollställ" alla knappar så att
//de pekar på den normala bilden.
for (int i=0; i < maxitems; i++)
currentimage[i]=normalimage[i];
currentimage[currentitem]=mouseoverimage[currentitem];
}
//update() ser till att skärmen
//updateras efter att bilden har ändrats.
update(getGraphics());
return true;
}
public boolean mouseExit(Event e, int x, int y)
{
//Om besökaren lämnar appletområdet så
//måste "currentimage" arrayen nollställas.
for (int i=0; i < maxitems; i++)
currentimage[i]=normalimage[i];
update(getGraphics());
return true;
}
public boolean mouseDown(Event e, int x, int y)
{
//Om användaren klickar på en knapp
//så måste vi först ändra bilden.
currentimage[currentitem]=mousedownimage[currentitem];
update(getGraphics());
//Nu exekverar vi adressen relaterat till
//det menyvalet.
gotoURL(urls[currentitem],target);
return true;
}
public void gotoURL(String address, String target)
{
URL link=null;
AppletContext appletcontrol=getAppletContext();
try {link=new URL(address);}
catch (MalformedURLException ex)
{
showStatus("FELSKRIVEN ADRESS."+address);
};
if (link!=null)
{
if (target!=null && target.length() > 0) appletcontrol.showDocument(link,target);
else appletcontrol.showDocument(link);
}
}
}
|
 |  |
|