import java.awt.*; import java.applet.*; import java.awt.event.*; public class Fireflies extends Applet implements Runnable { Firefly fireflies[] = new Firefly[100]; // Double buffering initialization private Dimension appletSize; private Image offscreenBuffer; public Graphics gOff, g; private Image moon; private Thread runMe; public void init() { // Set up the double buffering. g = getGraphics(); appletSize = getSize(); offscreenBuffer = createImage(appletSize.width, appletSize.height); gOff = offscreenBuffer.getGraphics(); moon = getImage(getDocumentBase(), "moon.gif"); // Wait for image load // Pass media tracker any component (such as a canvas or an applet) MediaTracker tracker = new MediaTracker(this); // Add images tracker.addImage (moon, 0); // Wait for images try { tracker.waitForAll(); } catch (InterruptedException ie) {} // Create fireflies for (int i=0; i < fireflies.length; i++) fireflies[i] = new Firefly(appletSize.width, appletSize.height-300 - (int)(Math.random()*150)); runMe = new Thread(this); runMe.start(); } public void run() { while (true) { gOff.setColor(Color.black); gOff.fillRect(0,0, appletSize.width, appletSize.height); gOff.drawImage(moon, (appletSize.width-256) / 2, 32, null); gOff.setColor(Color.yellow); for (int i=0; i < fireflies.length; i++) { fireflies[i].updatePos(); if (fireflies[i].visible) { gOff.setColor(fireflies[i].color); gOff.fillRect((int)fireflies[i].x, (int)fireflies[i].y+320, fireflies[i].size, fireflies[i].size); } } paint(g); try {runMe.sleep(5);} catch (InterruptedException e) {return; } } } public void paint(Graphics g) { // Blit the buffer g.drawImage(offscreenBuffer, 0, 0, null); } } class Firefly { double x, y; double dX, dY; double speed = 1.0; double biasAmount = .225; Color color; int xRange, yRange; int size; int lightInterval; boolean visible; public Firefly(int xRange, int yRange) { this.xRange = xRange; this.yRange = yRange; x = Math.random() * xRange; y = Math.random() * yRange; dX = (Math.random() * speed - speed / 2.0f) * .8f; dY = (Math.random() * speed - speed / 2.0f) * .5f; if (Math.random() > .5) visible = true; else visible = false; if (Math.random() > .5) size = 1; else size = 2; lightInterval = (int)(Math.random() * 60); int shade = (int)(Math.random() * 128 + 128); int greenShade = (int)(Math.random() * 15); if (greenShade + shade <= 255) greenShade = greenShade + shade; color = new Color(greenShade, shade, 0); } public void updatePos() { double denom = 1; if (size == 1) denom = 2; x += dX / denom; y += dY / denom; // Add some directional bias double ddX = Math.random() * biasAmount - biasAmount / 2.0; double ddY = Math.random() * biasAmount - biasAmount / 2.0; if (ddX + dX < speed && ddX + dX > 0) dX += ddX; if (ddY + dY < speed / 2.0 && ddY + dY > 0) dY += ddY; // Make sure they stay on screen if (x > xRange) { x -= xRange; visible = false; } if (x < 0) { x += xRange; visible = false; } if (y > yRange) { y -= yRange; visible = false; } if (y < 0) { if (Math.random() < .02) { y += yRange; visible = false; } } // Make them blink in and out if (visible) { lightInterval--; if (lightInterval <= 0) { visible = false; lightInterval = (int)(Math.random() * 30) + 90; } } else { lightInterval--; if (lightInterval <= 0) { visible = true; lightInterval = (int)(Math.random() * 30) + 90; } } } }