目录
一、效果
二、教程
三、代码
首先,我们来看效果,一共五个颜色不相同的球,每撞击一下边界,分数加1,分数越大,球的速度越快。(效果是动态的)
1、使用IDEA搭建一个项目,项目名称:MyBall(可根据自己的喜好)
具体搭建过程可看博文用IDEA构建一个简单的Java程序范例,这里就不详细说了。
2、MyBall.class
(1)导入包
import java.awt.Component; import javax.swing.JFrame;(2)主函数
在这里我的panel大小设置的是800*600,大家可以根据自己的喜好设置的更大一些。
public static void main(String[] args) { JFrame frame = new JFrame("球球"); MyBallPanel panel = new MyBallPanel(); frame.add(panel); Thread t = new Thread(panel); t.start(); frame.setSize(800, 600); frame.setLocationRelativeTo((Component)null); frame.setDefaultCloseOperation(3); frame.setVisible(true); }3、MyBallPanel.class
(1)导入包
import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import javax.swing.JPanel;(2)类的继承,接口的实现
JPanel类:面板组件,非顶层容器 public class MyBallPanel extends JPanel implements Runnable {}(3)数据类型的定义
color:Colorspeed:int,为小球的速度score:int,为分数xx,yy:int,为小球出现的坐标ff:int,5个小球的运动方向 Color color; int speed = 10; int score = 0; int[] xx = new int[5]; int[] yy = new int[5]; Color[] colors = new Color[5]; int[] ff = new int[5];(4)画布函数MyStarPanel()
for循环:5个小球的一开始出现的位置和颜色画布的大小:800*600,小球的大小为30*30
我们小球的起始位置xx:0 - 770 yy:0 - 570
如下图:划线部分为小球的起始位置,若小球在图中部分,则小球出了画布,不会完整显示。
public MyBallPanel() { for(int i = 0; i < 5; ++i) { this.xx[i] = (int)(Math.random() * 770); this.yy[i] = (int)(Math.random() * 570); this.colors[i] = this.randomColor(); this.ff[i] = (int)(Math.random() * 4); } }
(5)画笔函数paint()
画笔名称g小球的颜色为我们一开始设定的颜色,大小为30左上角的“分数”,字体为微软雅黑,大小50 public void paint(Graphics g) { super.paint(g); for(int i = 0; i < 5; ++i) { g.setColor(this.colors[i]); g.fillOval(this.xx[i], this.yy[i], 30, 30); } g.setFont(new Font("微软雅黑", 1, 28)); g.drawString("分数:" + this.score, 50, 50); }(6)线程函数run()
for循环:循环5次,分别代表5个小球
定义小球运动方向ff:ff:是一个长度为5的int型数组,分别存储5个小球的运动状态,即小球的运动方向。
ff = 0, 1, 2, 3
注:画布的坐标轴和我们数学上的不太一样,起始点O在左上角。因此ff = 0是右下方向,如下图所示。
// ff = 0:右下 if (this.ff[i] == 0) { this.xx[i]++; this.yy[i]++; } // ff = 1:右上 if (this.ff[i] == 1) { this.xx[i]++; this.yy[i]--; } // ff = 2:左上 if (this.ff[i] == 2) { this.xx[i]--; this.yy[i]--; } // ff = 3:左下 if (this.ff[i] == 3) { this.xx[i]--; this.yy[i]++; } 小球运动到边界时,需要更改小球运动状态,改变小球颜色,分数加1 ,速度减1一共四个边界
下面我们以一个边界为例:下边界,即xx[i] > 770(画布大小为800*600)
小球撞击右边边界有两种情况:
一是由①撞击,那么此时小球的运动状态为ff = 0,此时我们需要改变小球的运动状态ff = 3
二是由②撞击,那么此时小球的运动状态为ff = 1,此时我们需要改变小球的运动状态ff = 2
// 撞击下边 if (this.yy[i] > 540) { ++this.score; --this.speed; this.colors[i] = this.randomColor(); if (this.ff[i] == 0) { this.ff[i] = 1; } else { this.ff[i] = 2; } } // 撞击右边 if (this.xx[i] > 770) { ++this.score; --this.speed; this.colors[i] = this.randomColor(); if (this.ff[i] == 1) { this.ff[i] = 2; } else { this.ff[i] = 3; } } // 撞击上边 if (this.yy[i] < 0) { ++this.score; --this.speed; this.colors[i] = this.randomColor(); if (this.ff[i] == 2) { this.ff[i] = 3; } else { this.ff[i] = 0; } } // 撞击左边 if (this.xx[i] < 0) { ++this.score; --this.speed; this.colors[i] = this.randomColor(); if (this.ff[i] == 3) { this.ff[i] = 0; } else { this.ff[i] = 1; } } 当速度为1时,速度保持为1 if (this.speed < 1) { this.speed = 1; }(7)小球颜色函数randomColor()
public Color randomColor() { int R = (int)(Math.random() * 255); int G = (int)(Math.random() * 255); int B = (int)(Math.random() * 255); Color color = new Color(R, G, B); return color; } }1、MyBall.class
package MyBall; import java.awt.Component; import javax.swing.JFrame; public class MyBall { public static void main(String[] args) { JFrame frame = new JFrame("球球"); MyBallPanel panel = new MyBallPanel(); frame.add(panel); Thread t = new Thread(panel); t.start(); frame.setSize(800, 600); frame.setLocationRelativeTo((Component)null); frame.setDefaultCloseOperation(3); frame.setVisible(true); } }2、MyBallPanel.class
package MyBall; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import javax.swing.JPanel; public class MyBallPanel extends JPanel implements Runnable { Color color; int speed = 10; int score = 0; int[] xx = new int[5]; int[] yy = new int[5]; Color[] colors = new Color[5]; int[] ff = new int[5]; public MyBallPanel() { for(int i = 0; i < 5; ++i) { this.xx[i] = (int)(Math.random() * 770); this.yy[i] = (int)(Math.random() * 570); this.colors[i] = this.randomColor(); this.ff[i] = (int)(Math.random() * 4); } } public void paint(Graphics g) { super.paint(g); for(int i = 0; i < 5; ++i) { g.setColor(this.colors[i]); g.fillOval(this.xx[i], this.yy[i], 30, 30); } g.setFont(new Font("微软雅黑", 1, 28)); g.drawString("分数:" + this.score, 50, 50); } public void run() { while(true) { for(int i = 0; i < 5; ++i) { if (this.ff[i] == 0) { this.xx[i]++; this.yy[i]++; } if (this.ff[i] == 1) { this.xx[i]++; this.yy[i]--; } if (this.ff[i] == 2) { this.xx[i]--; this.yy[i]--; } if (this.ff[i] == 3) { this.xx[i]--; this.yy[i]++; } if (this.yy[i] > 540) { ++this.score; --this.speed; this.colors[i] = this.randomColor(); if (this.ff[i] == 0) { this.ff[i] = 1; } else { this.ff[i] = 2; } } if (this.xx[i] > 770) { ++this.score; --this.speed; this.colors[i] = this.randomColor(); if (this.ff[i] == 1) { this.ff[i] = 2; } else { this.ff[i] = 3; } } if (this.yy[i] < 0) { ++this.score; --this.speed; this.colors[i] = this.randomColor(); if (this.ff[i] == 2) { this.ff[i] = 3; } else { this.ff[i] = 0; } } if (this.xx[i] < 0) { ++this.score; --this.speed; this.colors[i] = this.randomColor(); if (this.ff[i] == 3) { this.ff[i] = 0; } else { this.ff[i] = 1; } } if (this.speed < 1) { this.speed = 1; } } try { Thread.sleep((long)this.speed); } catch (InterruptedException var2) { var2.printStackTrace(); } this.repaint(); } } public Color randomColor() { int R = (int)(Math.random() * 255); int G = (int)(Math.random() * 255); int B = (int)(Math.random() * 255); Color color = new Color(R, G, B); return color; } }