概述
java实现简单泡泡屏保动画及点击变实心泡泡,空格暂停动画
实现思路
采用MVC(Model-View-Controller(模型-视图-控制器))设计思路。将数据层与视图层与控制层分开。
在本例中
- Mycircle-数据层 定义圆圈类,并实现圆圈的移动函数和碰撞检测功能。
- AlgoFrane-视图层 绘制视图
- AlgoVisualizer-控制层 将视图与数据连接起来
- 附:AlgoVisHelper 绘制工具类(辅助绘图),其中 有许多具体绘制的方法,例如设置绘画线宽,画实心圆,空心圆…
效果
## 源代码
MyCircle.java
/*
* 圆圈类
*/
/*
* 数据层
*/
import java.awt.*;
public class MyCircle {
//圆圈的圆心坐标
public int x,y;
//圆圈的半径
private int r;
//圆圈速度
public int vx,vy;
//圆圈颜色
public Color color;
//是实心还是空心
public boolean isFilled = false;
public MyCircle(int x, int y, int r, int vx, int vy,Color color){
this.x = x;
this.y = y;
this.r = r;
this.vx = vx;
this.vy = vy;
this.color = color;
}
public int getR(){
return r;}
//圆圈移动函数
public void move(int minx,int miny,int maxx,int maxy){
x += vx;
y += vy;
checkCollision(minx,miny,maxx,maxy);
}
//碰撞检测(与边缘碰撞后返回)
private void checkCollision(int minx,int miny,int maxx,int maxy) {
if (x - r < minx) {
x = r; vx = -vx; }
if (x + r >= maxx) {
x = maxx - r; vx = -vx; }
if (y - r < miny) {
y = r; vy = -vy; }
if (y + r >= maxy) {
y = maxy - r; vy = -vy; }
}
//计算某点是否在圆圈内
public boolean contain(Point p){
return (x - p.x)*(x - p.x)+(y-p.y)*(y-p.y) <= r*r;
}
}
AlgoFrame.java
import javafx.scene.shape.Circle;
import javax.swing.*;
import java.awt.*;
import java.awt.geom.Ellipse2D;
/*
* 视图类
*/
public class AlgoFrame