|
²É¤l¨t²Îªº°ò¥»·§©À«Ü²³æ¡A¥un¨Ï¥ÎÃþ§O©Îµ²ºc¨Ó¥]¸Ë²É¤lªº°Ê§@¾Þ§@»Pª¬ºA§Y¥i¡AµM¦Ó¨ä§xÃø³B¦b©ó¡A¦p¦óÀÀ¯uªº¼ÒÀÀ¥X²É¤lªº°Ê§@¡A³o´N»Pª«²z¡B¤Æ¾Ç¦³©ÒÃöÁp¤F¡AµM¦Ó¦³®ÉÔ¬O¥i¥H¥Î¤@¨Ç¤p§ÞǨÓ²¤Æ¯u¹ê¥@¬É¤¤ªº²É¤l°Ê§@¡A¦Ó¦b¿Ã¹õ¤W¤S¦³¬Û·íªº®ÄªG¡C
·Ï¤õ²É¤l¥i¥H¦p¤U¥]¸Ë¡G
public class FireworkParticle {
private boolean state; // ²É¤l¬O§_¦s¬¡
private Point position; // ²É¤lªº¦ì¸m
private double vx, vy; // ²É¤lªº³t«×
private int life; // ²É¤lªº¥Í©RÈ
private Color currentcolor; // ²É¤lªºÃC¦â
private int time; // ²É¤l¦s¬¡¦Ü¤µªº®É¶¡
public void resume() {} // ±Ò©l²É¤l
public boolean getState() {} // ¨ú±o²É¤l¦s¬¡ª¬ºA
public Point getPoint() {} // ¨ú±o¦ì¤l¦ì¸m
public Color getColor() {} // ¨ú±o²É¤lÃC¦â
public void nextState() {} // §ïÅܦܤU¤@ª¬ºA
}
Javaª«¥ó¾É¦Vªº¯S©Ê¯S§O¾A¦X¥Î¨Ó¥]¸Ë²É¤l¨t²Î¡A±N©Ò¦³»P²É¤l¦³Ãöªº¾Þ§@¤]¤@¨Ö¥]¸Ë¶i¥h¡F¦pªG¬OVB©ÎC¡A´N¨Ï¥Îµ²ºc¨Ó¥]¸Ë²É¤lªºÄݩʡC
¦b¼ÒÀÀªº³¡¥÷¡Aº¥ý¬OÃz¬µªº®ÉÔ¡A²É¤l©Ò±o¨ìªº¤ô¥»P««ª½³t«×¡A¥i¥H¿í¦u°Ê¶q¦uùÚ¨Ópºâ¥X¨C¤@Ӳɤl©ÒÀò±oªº³t«×¡A¦ý³oÃä¹ê»Ú¤W¨Ã¨S¦³³o»ò§@¡A²³æªº¨Ï¥Î
¶Ã¼Æ¨Ó¼ÒÀÀ¤]¥i¥H¹F¨ì¤£¿ùªº®ÄªG¡F·Ï¤õ²É¤l¦b¤U¸¨ªº®ÉÔ¡A¬O¨ü«¤Oªº¼vÅT¡Avy = vt + 9.8 *
t¡F¦Ó²É¤lªºÃC¦â³¡¥÷¡Aªì©l®É¨Ï¥Î¶Ã¼Æ¨Ó¨M©wRGBÈ¡A¦Ó¦b²É¤l¥Í©R¶i¤J˼ƮɡA§ïÅܬ°¬õ¦â¡A³Ì«á¦A§ïÅܬ°ÂŦâ¡A¥H°t¦X©]ªÅªºÃC¦â¡AÅý²É¤l¦³¿U¿N¬pºÉªº·P
ı¡C
¦b²¾°Êªº¤è±¡A¥Ñ©ó¿Ã¹õ¤j¤p¦³¡A©Ò¥HÅý¤@Ó¹³¯À¥Nªí¹ê»Ú²¾°Ê¤@¤½¤Ø¡A¥H§K²É¤l¦]«¤O¥[³t«×ªº¼vÅT¡A¤@¤U¤l´N¶]¥X¿Ã¹õ¥~¤F¡C
¤j³¡¥÷ªº¼ÒÀÀ¬O¦p¦¹¡A¨ä¥¦ªº½Ð¦Û¤v¬Ý¬Ý ¹ê¨Ò¡A¥Ø«eÁÙ¨S¦³¥[¤W·Ïªº®ÄªG¡C
package onlyfun.caterpillar.graphics.particle; import java.applet.*; import java.awt.*; import javax.swing.JApplet; public class Firework extends JApplet implements Runnable { private final int Max = 200; private FireworkParticle particles[]; // ·Ï¤õ²É¤l private int appletWidth, appletHeight, xCenter,yCenter; private Image offScreen; private Graphics drawOffScreen;
public void init() { setBackground(Color.black); // I´º¬°¶Â¦â
particles = new FireworkParticle[Max]; // «Ø¥ß²É¤l
// ¨ú±oÅã¹³°Ï°ì appletWidth = getSize().width; appletHeight = getSize().height;
// ·Ï¤õªì©l¦ì¸m xCenter = appletWidth/2 + (int)(Math.random()* 150 - 150); yCenter = appletHeight/2 + (int)(Math.random()* 150 - 150); for(int i = 0; i < Max; i++) particles[i] = new FireworkParticle(); // «Ø¥ß¦¸µe± offScreen = createImage(appletWidth, appletHeight); drawOffScreen = offScreen.getGraphics(); } public void start() { (new Thread(this)).start(); } public void update(Graphics g) { paint(g); } public void paint(Graphics g) { g.drawImage(offScreen, 0, 0, this); } public void run() { Color color; boolean replay; while(true) { replay = true; drawOffScreen.clearRect(0,0, appletWidth, appletHeight); for(int i = 0; i < Max; i++) { if(particles[i].getState()) { color = particles[i].getColor(); double x = particles[i].getPoint().getX(); double y = particles[i].getPoint().getY(); drawOffScreen.setColor(color); drawOffScreen.fillOval( (int)x, (int)y, 1, 1); particles[i].nextState(); } } for(int i = 0; i < Max; i++) { if(particles[i].getState()) { replay = false; break; } } // ¬O§_«·s¬I©ñ if(replay) { // ·Ï¤õªì©l¦ì¸m xCenter = appletWidth/2 + (int)(Math.random()* 150 - 150); yCenter = appletHeight/2 + (int)(Math.random()* 150 - 150); for(int i = 0; i < Max; i++) { particles[i].resume(new Point(xCenter, yCenter), Max); particles[i].setLife( (int) (Math.random()*20)); } } // «Ã¸µe± repaint(); // ¼È°±°õ¦æºü 150 ²@¬í try { Thread.sleep(150); } catch (InterruptedException e) { } } } } class FireworkParticle { private boolean state; // ²É¤l¬O§_¦s¬¡ private Point position; // ²É¤lªº¦ì¸m private double vx, vy; // ²É¤lªº³t«× private int life; // ²É¤lªº¥Í©RÈ private Color currentcolor; // ²É¤lªºÃC¦â private int time; // ²É¤l¦s¬¡¦Ü¤µªº®É¶¡ public void resume(Point p, int random) { position = p; state = true; vx = Math.random()*random - Math.random()*random; vy = Math.random()*random - Math.random()*random; currentcolor = new Color((int)(Math.random()*255), (int)(Math.random()*255), (int)(Math.random()*255)); time = 0; } public void setLife(int life) { this.life = life; } public boolean getState() { return state; } public Point getPoint() { return position; } public Color getColor() { return currentcolor; } public void nextState() { vy += 9.8*time; position.setLocation(position.getX() + vx * 0.1, position.getY() + vy * 0.1); life--; time++; if(life < 0) { life = 0; state = false; } else if(life < 2) { currentcolor = new Color(0, 0, 255); } else if(life < 5){ currentcolor = new Color(255, 0, 0); } } }
|