/* * BSXDisplay -- a graphics component for drawing BSX Objects on * -- * $Id: BSXDisplay.java,v 1.1 1997/12/16 10:59:49 leo Exp $ * $timestamp: Thu Feb 15 00:47:34 1996 by Matthias L. Jugel :$ */ package modules.bsx; import java.awt.*; import java.util.Hashtable; import java.util.Enumeration; import java.util.Vector; public class BSXDisplay extends Frame { private int Scale = 100; /* display scale */ private Hashtable scenes; /* scene store */ private Hashtable objects; /* object store */ private String curScene = ""; /* current scene */ private Image imageBuffer; private Graphics gBuffer; public BSXDisplay() { this("BSXModule - Visit Regenbogen rb.mud.de:4780"); } public BSXDisplay(String title) { super(title); addNotify(); imageBuffer = createImage(511,255); if(imageBuffer==null) { System.out.println("Couldn't create an offscreen-image :("); System.exit(1); } gBuffer = imageBuffer.getGraphics(); scenes = new Hashtable(); objects = new Hashtable(); setScale(100); resize(510,255); show(); } public void setScale(int scale) { Scale = scale; resize(511 * Scale / 100, 255 * Scale / 100); } /* add a scene to the store, do not yet display */ public void addScene(String id, BSXGraphic picture) { BSXScene scene = new BSXScene(picture); BSXScene sc = (BSXScene)scenes.get(id); if(sc != null) { scene.objects = sc.objects; scenes.remove(id); } scenes.put(id, scene); if(curScene.equals(id)) redraw(); } /* show current scene */ public boolean showScene() { return showScene(curScene); } /* show scene given as argument */ public boolean showScene(String id) { curScene = id; if(!scenes.containsKey(id)) { addScene(id, new BSXGraphic()); return false; } redraw(); return true; } /* add object to store */ public void addObject(String id, BSXGraphic o) { objects.put(id, o); BSXScene scene = (BSXScene)scenes.get(curScene); if(scene != null && scene.objects.containsKey(id)) redraw(); } /* show object at position 0, layer 0 */ public boolean showObject(String id) { return showObject(id, 0, 0); } /* show object at position in layer */ public boolean showObject(String id, int position, int layer) { BSXScene scene = (BSXScene)scenes.get(curScene); /* add object to scene database */ if((scene = (BSXScene)scenes.get(curScene)) == null) { addScene(curScene, new BSXGraphic()); scene = (BSXScene)scenes.get(curScene); } BSXObject o = new BSXObject(position, layer); scene.objects.put(id, o); /* check if object is in our database */ if(!objects.containsKey(id)) return false; redraw(); return true; } /* remove object from scene, if scene exists */ public boolean removeObject(String id) { BSXScene scene = (BSXScene)scenes.get(curScene); if(scene != null) { BSXObject o = (BSXObject)scene.objects.get(id); scene.objects.remove(id); if(o != null) redraw(); } return true; } /* redraw image buffer */ public void redraw() { BSXScene scene = (BSXScene)scenes.get(curScene); if(scene == null) return; Vector[] layer = new Vector[8]; /* create layers */ for(Enumeration e = scene.objects.keys(); e.hasMoreElements();) { String key; key = (String)e.nextElement(); BSXObject o = (BSXObject)scene.objects.get(key); if(layer[o.layer] == null) layer[o.layer] = new Vector(); layer[o.layer].addElement(key); } /* draw background graphic */ if(scene.background != null && scene.background.size() > 0) drawPicture(scene.background); else return; /* display layers from back to front */ for(int l = 7; l >= 0; l--) if(layer[l] != null) for(int o = layer[l].size()-1; o >= 0; o--) { BSXObject obj = (BSXObject) scene.objects.get(layer[l].elementAt(o)); drawPicture((BSXGraphic)objects.get(layer[l].elementAt(o)), 16 * obj.position, 4 * obj.layer); } paint(getGraphics()); } public Point Translate(int x, int y, int centreX, int centreY, int scale) { return new Point(( x - 127 + centreX) * 2 * scale / 100, (255 - (y - 127 + centreY)) * scale / 100); } public void drawPicture(BSXGraphic pic) { drawPicture(pic, 127, 127); } public void drawPicture(BSXGraphic pic, int position, int layer) { if(pic == null) return; int ap = pic.size(); for(int i = 0; i < ap; i++) { BSXPolygon poly = (BSXPolygon)pic.elementAt(i); Polygon p = new Polygon(); gBuffer.setColor(poly.getColor()); for(int j = poly.npoints - 1; j >= 0; j--) { Point pt = Translate(poly.xpoints[j], poly.ypoints[j], position, layer, Scale); p.addPoint(pt.x, pt.y); } gBuffer.fillPolygon(p); } } public boolean mouseEnter(Event evt, int x, int y) { //System.out.println("MOUSE ENTERS"); requestFocus(); return true; } public void update(Graphics g) { paint(g); } public void paint(Graphics g) { g.drawImage(imageBuffer, 0, 0, this); } }