/* SkyscraperApplet.java */ import java.awt.*; import java.util.*; import java.applet.*; class Skyscraper { public int x; public int y; public int width; public int height; int wndcntx; int wndcnty; boolean blinkon = false; Skyscraper(int x, int y) { this.x = x; this.y = y; this.width = (int)(30*(0.5+Math.random())); this.height = (int)(100*(0.5+Math.random())); wndcntx = (width-4)/5; wndcnty = (height-4)/5; } void LightEvent(Graphics g) { double rnd = Math.random(); int xwnd = (int)(Math.random()*wndcntx); int ywnd = (int)(Math.random()*wndcnty); if (blinkon) { g.setColor(Color.black); g.fillRect(x+width/2,y-height-20,2,2); blinkon = false; } if (rnd >= 0.9) { blinkon = true; g.setColor(Color.red); g.fillRect(x+width/2,y-height-20,2,2); } else if (rnd >= 0.7) { g.setColor(Color.black); g.fillRect(x+2+xwnd*5,y-height+2+ywnd*5,2,2); } else { g.setColor(Color.yellow); g.fillRect(x+2+xwnd*5,y-height+2+ywnd*5,2,2); } } } public class SkyscraperApplet extends Applet implements Runnable { //Membervariablen Thread th; Vector v = new Vector(); AudioClip thunder; boolean running; //Parameter int DELAY; float FLASH; String THUNDER; public void init() { Skyscraper house; int x = 5; //Häuser erzeugen while (this.getSize().width-x-1 >= 30) { house = new Skyscraper(x,this.getSize().height-10); v.addElement(house); x += house.width + 5; } setBackground(Color.black); //Parameter einlesen try { DELAY = Integer.parseInt(getParameter("delay")); } catch (NumberFormatException e) { DELAY = 75; } try { FLASH = (new Float(getParameter("flash"))).floatValue(); } catch (NumberFormatException e) { FLASH = 0.01F; } THUNDER = getParameter("thunder"); if (THUNDER != null) { thunder = getAudioClip(getCodeBase(),THUNDER); } System.out.println("DELAY = "+DELAY); System.out.println("FLASH = "+FLASH); System.out.println("THUNDER = "+THUNDER); } public void start() { if (th == null) { running = true; th = new Thread(this); th.start(); } } public void stop() { if (th != null) { running = false; th = null; } } public void run() { while (running) { repaint(); try { Thread.sleep(DELAY); } catch (InterruptedException e) { //nothing } } } public void update(Graphics g) { paint(g); } public void paint(Graphics g) { int i; Skyscraper house; i = (int)Math.floor(Math.random()*v.size()); house = (Skyscraper)v.elementAt(i); house.LightEvent(g); if (Math.random() < FLASH) { Lightning(g,house.x+10,house.y-house.height); } } public void Lightning(Graphics g, int x, int y) { Vector poly = new Vector(); int dx, dy, i, polysize; thunder.play(); //Blitzpolygon berechnen poly.addElement(new Point(x,y)); polysize = 1; while (y > 10) { dx = 10 - (int)(Math.floor(Math.random()*20)); dy = - (int)(Math.floor(Math.random()*20)); x += dx; y += dy; poly.addElement(new Point(x,y)); ++polysize; } //Blitzvector in Koordinaten-Arrays umwandeln int[] xpoints = new int[poly.size()]; int[] ypoints = new int[poly.size()]; for (i = 0; i < polysize; ++i) { Point p = (Point)poly.elementAt(i); xpoints[i] = p.x; ypoints[i] = p.y; } //Blitz zeichnen for (i = 0; i <= 1; ++i) { g.setColor(Color.white); g.drawPolyline(xpoints, ypoints, polysize); try { Thread.sleep(20); } catch (InterruptedException e) {} g.setColor(Color.black); g.drawPolyline(xpoints, ypoints, polysize); try { Thread.sleep(20); } catch (InterruptedException e) {} } } }