Java俩个小球碰撞的代码_java实现小球碰撞功能
本文實例為大家分享了java實現小球碰撞的具體代碼,供大家參考,具體內容如下
這次我們做一個小球的碰撞的游戲,規則是:按下添加按鈕,窗口的中心部分會產生一個小球(剛開始默認為黑色),四個方向隨機產生,發射小球,再次按下即產生兩個小球。當小球碰到窗體邊緣的時候會產生反彈,當兩個小球接觸時會產生碰撞,雙方交換速度,向相反方向移動。我們可以選擇相應的顏色來改變下一個發射的小球顏色。當按下清除可以清除屏幕上的小球,當按下添加則會繼續產生小球。最后我們還添加了自動產生小球的功能,按下開關,在屏幕中間會定時產生小球。接下來,我們來展示代碼部分。
public class Jframe {
private Ball[] arrayball = new Ball[100];
public static void main(String[] args) {
Jframe frame = new Jframe();
frame.showUI();
}
public void showUI() {
javax.swing.JFrame jf = new javax.swing.JFrame();
jf.setSize(1000, 1000);
jf.getContentPane().setBackground(Color.WHITE);
jf.setTitle("小球");
jf.setDefaultCloseOperation(3);
// 設置居中顯示
jf.setLocationRelativeTo(null);
JPanel jp1 =new JPanel();
JButton jb1 = new JButton("添加");
jp1.add(jb1);
// jb1.setBounds(100,50, 40, 20);
JButton jb2 = new JButton("暫停");
jp1.add(jb2);
// jb1.setBounds(200,50, 40, 20);
JButton jb3 = new JButton("清除");
jp1.add(jb3);
// jb1.setBounds(300,50, 40, 20);
JButton jb4 = new JButton("自動添加");
jp1.add(jb4);
jf.add(jp1,BorderLayout.NORTH);
Mouse mouse = new Mouse();
Color[] color = {Color.RED,Color.BLUE,Color.BLACK,Color.GREEN,Color.YELLOW};
for(int i=0;i
JButton jbu = new JButton();
jbu.setBackground(color[i]);
jbu.setPreferredSize(new Dimension(30, 30));
jp1.add(jbu);
jbu.addActionListener(mouse);
}
jb1.addActionListener(mouse);
jb2.addActionListener(mouse);
jb3.addActionListener(mouse);
jb4.addActionListener(mouse);
jf.addMouseListener(mouse);
jf.addMouseMotionListener(mouse);
BallJpanel cp = new BallJpanel();
cp.setBackground(Color.WHITE);
jf.add(cp,BorderLayout.CENTER);
jf.setVisible(true);
Graphics g = cp.getGraphics();
mouse.setcp(cp);
mouse.setg(g);
mouse.setarrayball(arrayball);
mouse.setmouse(mouse);
cp.setarrayball(arrayball);
}
}
這是窗體的基本配置,采用邊框布局,上方放置按鈕,中間是畫布。我們為按鈕添加了動作監聽器,并使用了一系列的方法來把對象傳遞到其他類中。
public class Ball {
public int size = 90; // 小球的直徑
public int x = 500; // 小球所在的x坐標
public int y = 500; // 小球所在的y坐標
public int vx = 5;
public int vy = 5;
public BallJpanel cp;
public Color color = Color.BLACK;
public int max_x, max_y, Min_x, Min_y;
private Ball[] arrayball;
public void setcp(BallJpanel cp) {
this.cp = cp;
}
public void setarrayball(Ball[] arrayball) {
this.arrayball = arrayball;
}
public void setX(int x) {
this.x = x;
}
public int getX() {
return x;
}
public void setY(int y) {
this.y = y;
}
public int setY() {
return y;
}
public Ball(int x, int y, int vx, int vy, Color color) {
this.x = x;
this.y = y;
this.vx = vx;
this.vy = vy;
this.color = color;
}
public void ballMove(Graphics g) {
x += vx;
y += vy;
max_y = cp.getHeight();
max_x = cp.getWidth();
if (x <= size / 2) {
x = size / 2;
vx = -vx;
}
if (y <= size / 2) {
y = size / 2;
vy = -vy;
}
if (x + size / 2 >= max_x) {
x = max_x - size / 2;
vx = -vx;
}
if (y + size / 2 >= max_y) {
y = max_y - size / 2;
vy = -vy;
}
for (int i = 0; i < arrayball.length; i++)
{
if (arrayball[i] == null)
break;
Ball ball = arrayball[i];
if (this.equals(ball))
continue;
if ((ball.x - this.x) * (ball.x - this.x) + (ball.y - this.y) * (ball.y - this.y) <= size * size)
{
int tempvx = this.vx;
int tempvy = this.vy;
this.vx = ball.vx;
this.vy = ball.vy;
ball.vx = tempvx;
ball.vy = tempvy;
while ((ball.x - this.x) * (ball.x - this.x) + (ball.y - this.y) * (ball.y - this.y) <= size * size)
{
this.x += this.vx;
this.y += this.vy;
System.out.println("等待");
}
}
}
}
}
考慮到這是一個小球的運動系統,我們為小球寫了一個類,添加小球的時候,會創建小球對象,并使其獲得位置,顏色,速度等參數,并將其存入數組。小球的方法就是運動,每當執行ballMove方法,便會為小球修改位置坐標(基于其速度),再判斷是否撞擊邊框,以及判斷是否和別的小球有坐標重疊,如果有重疊,則跑一個循環,修改位置坐標,使其分離。Ball這部分代碼和監聽器中的方法有所聯系,我們接下來介紹監聽器的方法。
public class Mouse implements MouseMotionListener, MouseListener, ActionListener {
private Graphics g;
private BallJpanel cp;
private Ball[] arrayball;
private int index = 0;
private int x;
private int y;
private int vx;
private int vy;
private int random=1;
private Color color=Color.black;
private ThreadBall tb;
private Mouse mouse;
public int selfFlag=0;
public void setmouse(Mouse mouse)
{
this.mouse= mouse;
}
public void setarrayball(Ball[] arrayball) {
this.arrayball = arrayball;
}
public void setg(Graphics g) {
this.g = g;
}
public void setcp(BallJpanel cp) {
this.cp = cp;
}
public void actionPerformed(ActionEvent e) {
if ("添加".equals(e.getActionCommand())) {
System.out.println("添加");
if (tb == null) {
// 創建線程對象
tb = new ThreadBall();
tb.setcp(cp);
tb.setarrayball(arrayball);
tb.setg(g);
tb.start();
tb.setmouse(mouse);
}
tb.stopFlag=0;
addBall();
}
if ("暫停".equals(e.getActionCommand())) {
if(tb!=null)
{
if(tb.stopFlag==0)
{
tb.stopFlag=1;
System.out.println("暫停");
}
else
{
tb.stopFlag=0;
System.out.println("開始");
}
}
}
if ("清除".equals(e.getActionCommand())) {
tb.stopFlag=1;
cp.paint1(g);
index=0;
System.out.println("清除");
}
if ("自動添加".equals(e.getActionCommand())){
if(selfFlag==0)
{selfFlag=1;System.out.println("自動添加打開");}
else
{selfFlag=0;System.out.println("自動添加關閉");}
}
if("".equals(e.getActionCommand())){
JButton jbu=(JButton)e.getSource();
color=jbu.getBackground();
g.setColor(color);
}
}
public void mouseDragged(MouseEvent e) {
}
public void mouseMoved(MouseEvent e) {
}
public void mouseClicked(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void addBall() {
x = 500;
y = 500;
random=1+(int)(Math.random()*4);
switch(random)
{
case 1:
vx=5;
vy=5;
break;
case 2:
vx=-5;
vy=-5;
break;
case 3:
vx=5;
vy=-5;
break;
case 4:
vx=-5;
vy=5;
break;
}
Ball ball = new Ball(x, y,vx , vy, color);
arrayball[index++] = ball;
}
}
監聽器中,我們設置了一系列參數來控制一些方法的開啟和關閉,以及寫了添加小球的方法,為其賦初值,隨機一個初始發射方向。這段代碼我們用到了線程。線程的使用分為兩步,創建線程對象并start線程。
public class ThreadBall extends Thread {
private Graphics g;
private BallJpanel cp;
private Ball[] arrayball;
public int stopFlag=0;
private int add=0;
private Mouse mouse;
public void setmouse(Mouse mouse)
{
this.mouse=mouse;
}
public void setcp(BallJpanel cp) {
this.cp = cp;
}
public void setg(Graphics g)
{
this.g=g;
}
public void setarrayball(Ball[] arrayball) {
this.arrayball = arrayball;
}
/**
* 啟動線程執行的方法
*/
public void run() {
while (true) {
if(stopFlag==0)
{
for (int i = 0; i < arrayball.length; i++)
{
if(arrayball[i]==null)
break;
Ball ball = arrayball[i];
ball.setarrayball(arrayball);
ball.setcp(cp);
ball.ballMove(g);
}
cp.paint(g);
add++;
if(add==5000)
add=0;
if(add%50==0&&mouse.selfFlag==1)
mouse.addBall();
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
以上是線程的屬性和方法,此類繼承Thread并重寫了run方法。run方法的思路是循環調用ballMove方法修改小球坐標,并調用paint方法更新顯示,我們加入了一個延時函數,來控制調用的頻率。
public class BallJpanel extends JPanel {
private Ball[] arrayball;
public void setarrayball(Ball[] arrayball)
{
this.arrayball=arrayball;
}
public void paint(Graphics g)
{
super.paint(g);
for(int i=0;i
{
if(arrayball[i]==null)
{
break;
}
Ball ball=arrayball[i];
g.setColor(ball.color);
g.fillOval(ball.x-ball.size/2, ball.y-ball.size/2, ball.size, ball.size);
}
}
public void paint1(Graphics g)
{
super.paint(g);
for(int i=0;i
{
if(arrayball[i]==null)
{
break;
}
arrayball[i]=null;
}
}
}
BallJpanel類寫的是畫布,及小球的運動區域,畫筆也是從其對象cp上獲得。類里用paint寫畫面的重繪方法(包括畫板小球的重繪),paint1用來清空畫布及數組。
以上便是java小球運動的全部代碼,我們來看一下效果。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持免費資源網。
總結
以上是生活随笔為你收集整理的Java俩个小球碰撞的代码_java实现小球碰撞功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 调查:2013年十大急需的热门IT技能
- 下一篇: matlab 定义离散函数,matlab