Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的简单弹跳球程序_Java_Bounce - Fatal编程技术网

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)这类事情可能很棘手,您是否在任何点解决碰撞(物理上将球移出碰撞)或者只是解决速度问题我猜速度/速度会使球的位置不匹配,即a
x_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),并将其乘以速度(以像素/秒为单位)以获得此帧的实际移动。这可以是一个非整数,在浮点/双精度中更好。