Java中的简单弹跳球程序
我正在尝试编写一个简单的弹跳球程序。它有一个长方形和两个球。球必须从长方形的墙壁上弹起(我已经成功地编写了代码),它们也必须相互弹起。这就是我需要你帮助的地方。当我给球相同的速度,他们反弹良好,程序工作,但我必须给球随机速度。当我这样做的时候,球就不再弹起,只是互相移动Java中的简单弹跳球程序,java,bounce,Java,Bounce,我正在尝试编写一个简单的弹跳球程序。它有一个长方形和两个球。球必须从长方形的墙壁上弹起(我已经成功地编写了代码),它们也必须相互弹起。这就是我需要你帮助的地方。当我给球相同的速度,他们反弹良好,程序工作,但我必须给球随机速度。当我这样做的时候,球就不再弹起,只是互相移动 import java.applet.*; import java.awt.*; import javax.swing.*; import javax.swing.event.*; public class BallApp
import java.applet.*;
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
public class BallApplet2 extends Applet implements Runnable
{
// Begin variabelen
int x_pos1 = 150;
int y_pos1 = 200;
int radius1 = 20;
int x_pos2 = 250;
int y_pos2 = 200;
int radius2 = 20;
private float ballspeedx1 = -3;
private float ballspeedy1 = 0;
private float ballspeedx2 = 3;
private float ballspeedy2 = 0;
public void init() {}
public void start() {
Thread th = new Thread (this);
th.start (); }
public void stop() {}
public void destroy() {}
public void run () {
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
while (true)
{
x_pos1 += ballspeedx1;
y_pos1 += ballspeedy1;
x_pos2 += ballspeedx2;
y_pos2 += ballspeedy2;
repaint();
// als x_pos < 100 is draait de richting van de bal om
if (x_pos1 < 100) {
ballspeedx1 = -ballspeedx1;
x_pos1 = 100;
}
if (x_pos2 < 100) {
ballspeedx2 = -ballspeedx2;
x_pos2 = 100;
}
// als x_pos > 300 is draait de richting van de bal om
if (x_pos1 > 300) {
ballspeedx1 = -ballspeedx1;
x_pos1 = 300;
}
if (x_pos2 > 300) {
ballspeedx2 = -ballspeedx2;
x_pos2 = 300;
}
// als de x van de rode bal gelijk is aan de x en twee keer de straal van de blauwe bal, draaien beide ballen om.
if (x_pos1 == x_pos2 + 40) {
ballspeedx1 = -ballspeedx1;
ballspeedx2 = -ballspeedx2;
}
// als de x van de blauwe bal gelijk is aan de x van de rode bal, draaien beide ballen om.
if (x_pos2 == x_pos1 ) {
ballspeedx1 = -ballspeedx1;
ballspeedx2 = -ballspeedx2;
}
// als de x en twee keer de straal van de rode bal gelijk is aan de x van de blauwe bal, draaien beide ballen om.
if (x_pos1 + 40 == x_pos2) {
ballspeedx1 = -ballspeedx1;
ballspeedx2 = -ballspeedx2;
}
// als de x en twee keer de straal
if (x_pos2 + 40 == x_pos1) {
ballspeedx1 = -ballspeedx1;
ballspeedx2 = -ballspeedx2;
}
try { Thread.sleep (20); }
catch (InterruptedException ex) {}
Thread.currentThread().setPriority(Thread.MAX_PRIORITY); }}
public void paint (Graphics g) {
g.setColor (Color.red);
g.fillOval (x_pos1 - radius1, y_pos1 - radius1, 2 * radius1, 2 * radius1);
g.setColor (Color.blue);
g.fillOval (x_pos2 - radius2, y_pos2 - radius2, 2 * radius2, 2 * radius2);
g.setColor(Color.black);
g.drawLine(80,80,80,320); // lijn links
g.drawLine(320,80,320,320); // lijn rechts
g.drawLine(80,80,320,80); // lijn boven
g.drawLine(80,320,320,320); // lijn onder
}
// Einde eventmethoden
}
import java.applet.*;
导入java.awt.*;
导入javax.swing.*;
导入javax.swing.event.*;
公共类BallApplet2扩展小程序实现可运行
{
//开始变奏曲
int x_pos1=150;
int y_pos1=200;
内半径1=20;
int x_pos2=250;
int y_pos2=200;
内半径2=20;
私人浮球速度x1=-3;
私人浮球速度1=0;
私人浮球速度x2=3;
私人浮球速度2=0;
public void init(){}
public void start(){
螺纹th=新螺纹(此);
th.start();}
公共无效停止(){}
public void destroy(){}
公开作废运行(){
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
while(true)
{
x_pos1+=ballspeedx1;
y_pos1+=球速1;
x_pos2+=ballspeedx2;
y_pos2+=球速2;
重新油漆();
//als x_位置<100是德拉特·德里奇·范德巴隆
如果(x_pos1<100){
ballspeedx1=-ballspeedx1;
x_pos1=100;
}
if(x_pos2<100){
ballspeedx2=-ballspeedx2;
x_pos2=100;
}
//als x_pos>300是一家酒店
如果(x_pos1>300){
ballspeedx1=-ballspeedx1;
x_pos1=300;
}
如果(x_pos2>300){
ballspeedx2=-ballspeedx2;
x_pos2=300;
}
//艾尔斯德范德洛德巴尔·格里伊克是一位来自伦敦的芭蕾舞者。
如果(x_pos1==x_pos2+40){
ballspeedx1=-ballspeedx1;
ballspeedx2=-ballspeedx2;
}
//阿尔斯·德·德·布劳韦·巴尔·格里伊克是一名优秀的芭蕾舞者。
if(x_pos2==x_pos1){
ballspeedx1=-ballspeedx1;
ballspeedx2=-ballspeedx2;
}
//这是一个非常有趣的故事,是一个非常有趣的故事。
如果(x_pos1+40==x_pos2){
ballspeedx1=-ballspeedx1;
ballspeedx2=-ballspeedx2;
}
//这是一个非常有趣的故事
如果(x_pos2+40==x_pos1){
ballspeedx1=-ballspeedx1;
ballspeedx2=-ballspeedx2;
}
试试{Thread.sleep(20);}
catch(InterruptedException ex){}
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);}
公共空间涂料(图g){
g、 setColor(Color.red);
g、 圆角(x_pos1-半径1,y_pos1-半径1,2*半径1,2*半径1);
g、 setColor(Color.blue);
g、 圆角(x_pos2-半径2,y_pos2-半径2,2*半径2,2*半径2);
g、 设置颜色(颜色为黑色);
g、 抽绳(80,80,80320);//lijn链环
g、 抽绳(320,80320320);//lijn rechts
g、 抽绳(80,80320,80);//lijn boven
g、 抽绳(80320320);//lijn onder
}
//埃因德事件法
}
有人有解决办法吗?如果是这样,请尽量简单:)这4种情况似乎与检测碰撞有关
if (x_pos1 == x_pos2 + 40) {
ballspeedx1 = -ballspeedx1;
ballspeedx2 = -ballspeedx2;
}
if (x_pos2 == x_pos1 ) {
ballspeedx1 = -ballspeedx1;
ballspeedx2 = -ballspeedx2;
}
if (x_pos1 + 40 == x_pos2) {
ballspeedx1 = -ballspeedx1;
ballspeedx2 = -ballspeedx2;
}
if (x_pos2 + 40 == x_pos1) {
ballspeedx1 = -ballspeedx1;
ballspeedx2 = -ballspeedx2;
}
但他们都会问,物体是否处于相对于其他物体的精确位置,而不是在一个范围内。请记住,由于此类程序是在时间跳跃中运行的,因此当发生碰撞时,对象可能部分位于另一个对象内,将所有4个条件更改为仅此一个条件即可解决问题
if (Math.abs(x_pos2-x_pos1)<radius1+radius2){
ballspeedx1 = -ballspeedx1;
ballspeedx2 = -ballspeedx2;
}
if(Math.abs(x_pos2-x_pos1)这类事情可能很棘手,您是否在任何点解决碰撞(物理上将球移出碰撞)或者只是解决速度问题我猜速度/速度会使球的位置不匹配,即ax_pos2==x_pos1
不可能出现。可以尝试通过Math.abs(x_pos2-x_pos1)
(相对于速度/速度计算bdist
)进行比较啊,是的,JScooby是对的,你在比较他们的中心是否发生碰撞,你似乎没有使用半径1和半径2进行碰撞检测同意@JScoobyCed,但你可能应该通过Math.sqrt((x_pos2-x_pos1)*(x_pos2-x_pos1)+(y_pos2-y_pos1)*(y_pos2-y_pos1))测试中心是否太近(小于半径的2倍)<2*半径)
顺便说一句,要实现真实的反弹,您可能需要做一些更复杂的数学运算。当两个球以任意角度相互撞击时,你不能只是反转x和y的速度。谢谢你这个伟大而简单的答案,Richard!我知道这个程序在物理上是不正确的,但它不一定是正确的。@user2919717很乐意帮助。我有一种感觉是这样的,我自己做过一次这一系列的节目,也经历过同样的经历steps@user2919717顺便说一句,我强烈建议你把球的位置改成双人(或浮球),因为如果你走很小的时间步,你最终会得到位置_int+=0.01;这不会改变立场。我不完全理解你最后一句话的意思。你能进一步解释一下吗?@user2919717目前,在每一个时间步上,你都会给球的位置增加(比如)3个像素。这在一开始效果很好,但是如果你想改变帧速率,这不是很好,当你改变帧速率时,速度会突然改变。更常见的做法是将帧时间作为参数(在您的情况下为0.02),并将其乘以速度(以像素/秒为单位)以获得此帧的实际移动。这可以是一个非整数,在浮点/双精度中更好。