java小球反弹_JAVA窗体中2个小球怎样能互不干涉反弹移动?

代码问题有点多 应该是刚开始学吧 要加油了

其实我想说我也是[尴尬!]

容我先吐槽一下:

1.首先代码的排版需要好看一点;至少不至于让别人看的头疼;

毕竟像我这样又无聊又好心的人不多了[笑哭]

2.写窗口的时候可以增加一下关闭窗口事件[详见代码注释];

3.你最关心的

/******************************

为什么两个球会同时改变方向 :

简单来说你的函数通过x,y 控制a球位置    通过i j控制b球位置 通过att控制球的方向

但是你只有一个att 所以共用一个att的两个球肯定会同时改变方向

最少你需要定义两个att才可以;lg: att1=0;att2=0;

不过java是面向对象的编程 你写的跟C语言似的,嗯~~~不太好[斜眼笑]

对你的程序稍改:

*******************************/

import java.awt.Color;

import java.awt.Container;

import java.awt.Graphics;

import javax.swing.*;

public class Rebound{

public static void main(String args[]) {

JFrame frame=new JFrame();

MyRebound mr=new MyRebound();

frame.setSize(800, 800);        //设置窗口大小

frame.setResizable(false);        //设置窗口大小不可更改

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    //点击[X]关闭窗口结束程序

mr.setBounds(0, 0, 800, 800);    //设置JPanel起始位置与大小

Container con=frame.getContentPane();    //取得窗口内容面板

con.add(mr);                            //将JPanel添加到窗口的内容面板

frame.setVisible(true);                    //显示窗口 一般最后面

}

}

class Oval implements Runnable{

public int x;        //假装我是私有属性 我有get set方法

public int y;        //假装我是私有属性 我有get set方法

public int att;        //假装我是私有属性 我有get set方法

public Oval(){

x=(int)(Math.random()*800);

y=(int)(Math.random()*800);

att=0;

}

public void run(){

while(true) {

//定义飞行姿态

if(att==0) {

x++;

y++;

}

if(att==1) {

x--;

y++;

}

if(att==2) {

x--;

y--;

}

if(att==3) {

x++;

y--;

}

//改变飞行姿态

if(x>750) {

if (att==0) {

att=1;

}else {

att=2;

}

}

if(y>750) {

if(att==1) {

att=2;

}else {

att=3;

}

}

if(x<0) {

if(att==2    ) {

att=3;

}else {

att=0;

}

}

if(y<0) {

if(att==3) {

att=0;

}else {

att=1;

}

}

//    异常处理

try {

Thread.sleep(5);   //线程休眠5毫秒

}catch(Exception e) {

}

}

}

}

class MyRebound extends JPanel{

Oval o1=new Oval();

Oval o2=new Oval();

Thread thread1=new Thread(o1);

Thread thread2=new Thread(o2);

public MyRebound(){

thread1.start();

thread2.start();

}

public void paint(Graphics g) {

super.paint(g);                //调用父类paint方法

g.fillOval(o1.x, o1.y, 50, 50);

g.setColor(Color.yellow);

g.fillOval(o2.x, o2.y, 50, 50);

try {

Thread.sleep(5);        //线程休眠5毫秒

repaint();                //重绘

}catch(Exception e) {}  //异常处理

}

}

Java,实现一个小球反弹的游戏通常涉及到图形用户界面(GUI)、运动学以及碰撞检测。我们可以使用Swing库创建基本的窗口,并结合坐标系和时间控制来模拟小球的运动。以下是一个简单的步骤概述: 1. **设置场景**: - 创建一个`JFrame`或`JPanel`作为游戏窗口。 - 设置窗口大小和背景颜色。 2. **小球类**: - 创建一个`Ball`类,包含属性如位置(x, y)、速度(dx, dy)、半径和颜色。 - 定义方法`move()`,根据速度更新小球的位置,并处理边界碰撞。 ```java public class Ball { private int x, y; private int dx, dy; private final int radius; private Color color; // 构造函数和相关方法... public void move() { if (isColliding()) { // 检查碰撞 bounce(); // 弹跳 } x += dx; y += dy; } // 边界碰撞处理、弹跳逻辑等... } ``` 3. **碰撞检测**: - 使用嵌套循环检查小球是否与屏幕边框或其它障碍物碰撞。可以使用`getRect()`方法获取小球的边界框,并进行比较。 4. **方向反转**: - 根据碰撞的方向调整小球的速度矢量。例如,如果小球撞到顶部,将dy置为负数。 ```java private boolean isColliding() { return x + radius >= width || x - radius <= 0 || y + radius >= height || y - radius <= 0; // 假设width和height为窗口尺寸 } private void bounce() { if (y + dy > height) { dy = -dy; } else if (y + dy < 0) { dy = -dy; // 如果碰到底部,上弹 } // 同理,处理左/右/上/下四个方向的碰撞 } ``` 5. **动画和循环**: - 使用`Timer`或`javax.swing.Timer`定时调用`move()`方法,更新游戏画面。 - 为了平滑动画,可以设置合适的帧率。 6. **事件监听**: - 可能还需要添加鼠标点击或键盘输入,用于改变小球的方向。 ```java // 添加事件监听器处理方向控制 MouseListener mouseListener = new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { // 更新小球移动方向 } }; frame.addMouseListener(mouseListener); ``` 相关问题-- 1. 如何在Java实现小球移动动画? 2. 如何处理小球与屏幕外边缘的碰撞? 3. 如何在游戏添加用户交互,以便控制小球的方向?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值