祝大家國慶節快樂
祝大家國慶節快樂
上面是用java的JFrame為基礎實現的效果,下面用面向對象的思考分析并實現此效果:
1)找對象
最開始鼠標點擊沖出來的白色圓點 Bullet
白色圓點爆炸成一片(包含很多小圓點)Piece
主程序類 Guoqing 繼承于 JPanel
程序初始化類執行類GuoqingStart 繼承于JFrame
2) 類的設計, 定義出 類屬性(數據模型)
比如
白色圓點類Bullet
|-- int x x坐標
|-- int y y坐標
3) 界面繪制(利用Java Swing API 繪制界面)
4) 功能算法設計
原則: 一切功能 都是方法: 動詞就是方法
實現策略: 將功能映射到數學模型, 研究數據的變化規律
比如白色圓點類Bullet與*Piece中各個小圓點的移動,其實都是坐標位置的變化
5) 事件綁定(利用Java Swing API 實現事件綁定)
比如鼠標點擊監聽事件
6)完整代碼
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
public class GuoqingStart extends JFrame {
Guoqing gq;
public static void main(String[] args) {
new GuoqingStart();
}
public GuoqingStart() {
gq=new Guoqing();
this.addMouseListener(gq);
this.add(gq);
new Thread(gq).start();
this.setTitle("國慶快樂");
this.setLocation(100, 0);
this.setSize(1000,700);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
}
class Guoqing extends JPanel implements MouseListener,Runnable{
Bullet bullet;
Vector<Bullet> bullets;
static Vector<Piece> pieces;
int times=1;
public Guoqing() {
bullets=new Vector<Bullet>();
pieces=new Vector<Piece>();
}
public void paint(Graphics g) {
super.paint(g);
times++;
g.setColor(Color.black);
g.fillRect(0, 0, 2000, 1000);
g.setColor(Color.lightGray);
for(int i=0;i<this.bullets.size();i++){
Bullet b=this.bullets.get(i);
if(b.isLive){
b.move();
g.fillOval(b.x,b.oldY, 15, 15);
}
}
for(int i=0;i<this.pieces.size();i++){
Piece b=this.pieces.get(i);
if(b.isLive){
if(b.color==0){
g.setColor(Color.red);
}else if(b.color==1){
g.setColor(Color.blue);
}else if(b.color==2){
g.setColor(Color.cyan);
}else if(b.color==3){
g.setColor(Color.green);
}else{
g.setColor(Color.gray);
}
if(times%3==0){
b.move();
}
g.fillOval((int)b.x, (int)b.y, (int)b.w, (int)b.h);
}
}
}
public void mousePressed(MouseEvent e) {
bullet=new Bullet(e.getX(),e.getY());
this.bullets.add(bullet);
}
public void mouseClicked(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
@Override
public void run() {
while(true){
this.repaint();
try {
Thread.sleep(20);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
class Piece{
double x,y;
double w=15;
double h=15;
double velocityX, velocityY;
boolean isLive=true;
int color=0;
int times=1;
public Piece(double x,double y,double velocity,double angle,int color) {
this.x=x;
this.y=y;
this.color=color;
velocityX = velocity * Math.cos(angle);
velocityY = velocity * Math.sin(angle);
}
public void move(){
velocityX *= 0.75;
velocityY += 1.0;
velocityY *= 0.75;
y += velocityY;
x += velocityX;
times++;
if(times%7==0){
this.w-=2;
this.h-=2;
if(this.w<=4){
Guoqing.pieces.remove(this);
}
}
}
}
class Bullet{
int x;
int y;
int oldY=700;
boolean isLive=true;
Piece piece;
Random r=new Random(System.currentTimeMillis());
public Bullet(int x, int y) {
this.x = x;
this.y = y;
}
public void move(){
oldY-=8;
if(oldY<=y){
this.isLive=false;
int color=r.nextInt(4);
for(int i=0;i<200;i++){
double angleXy = r.nextDouble() * 2 * Math.PI;
double angleZ = r.nextDouble() * 2 * Math.PI;
double velocity = 72 * Math.cos(angleZ);
piece=new Piece(x,oldY,velocity, angleXy,color);
Guoqing.pieces.add(piece);
}
}
}
}