祝大家国庆节快乐
上面是用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);
}
}
}
}