java弹跳球碰撞不起作用

java弹跳球碰撞不起作用,java,collision-detection,Java,Collision Detection,我一直在尝试用java制作这个弹跳球游戏,下面是我的代码。 我无法理解当球撞到墙上时速度的变化。 当我试图改变速度时,球只是不移动,而是停留在一个位置并振动。我不知道问题出在哪里,但球没有从墙上反弹。有人能帮我吗 import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics2D; import java.awt.Graphic

我一直在尝试用java制作这个弹跳球游戏,下面是我的代码。 我无法理解当球撞到墙上时速度的变化。 当我试图改变速度时,球只是不移动,而是停留在一个位置并振动。我不知道问题出在哪里,但球没有从墙上反弹。有人能帮我吗

    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Font;
    import java.awt.Graphics2D;
    import java.awt.Graphics;
    import java.awt.Rectangle;
    import java.awt.RenderingHints;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import java.util.ArrayList;
import java.util.TimerTask;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

import ballGame.SimpleSprite;


public class mainGame extends JPanel
{


    public static void main(String args[])
    {
        JFrame frame = new JFrame("hello");

        mainGame mainPanel = new mainGame(600, 400);

        SimpleSprite st = new SimpleSprite(mainPanel);

        frame.add(mainPanel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);

    }


    private ArrayList<SimpleSprite> sprites = new ArrayList<SimpleSprite>();

    final static int timer_msec=30;

mainGame(int width, int height)
{
    setPreferredSize(new Dimension(width, height));
    sprites.add(new SimpleSprite(Color.blue, 0, 35, 2, 1));

    startTimer();

}

public void startTimer()
{
    java.util.Timer timer = new java.util.Timer();
    TimerTask timerTask = new TimerTask()
    {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            updateSimulation();
        }

    };
    timer.scheduleAtFixedRate(timerTask, 0, timer_msec);

}

public void updateSimulation()
{
    for(SimpleSprite s: sprites)
    {
        s.update();
    }
    repaint();
}

public void paintComponent(Graphics g)
{
    Graphics2D g2d = (Graphics2D) g;
    paintBackground(g2d);
    for (SimpleSprite s : sprites) {
       s.draw(g2d);
}
}

public void paintBackground(Graphics2D g2d)
{
    g2d.setColor(Color.LIGHT_GRAY);
    g2d.fillRect(0, 0, getWidth(), getHeight());
}

}

class SimpleSprite extends JPanel
{
       // basic x,y movement at constant velocity
       float x, y, dx, dy; // position and velocity (pixels/TIMER_MSEC)
       Color color;
      private static float width=600;;
       SimpleSprite(mainGame g)
       {
           width=g.getWidth();
       }

       public SimpleSprite(Color color, float x, float y, float dx, float dy) {
          // initial position and velocity
          this.color = color;
          this.x = x;
          this.y = y;
          this.dx = dx;
          this.dy = dy;
       }
       public void update() { // update position and velocity every n milliSec

           x += dx; // velocity in x direction
           y += dy; // velocity in y direction

            if(x<0)
           {
             dx=+dx;
           }
           if(x>width)
           {
               dx=-dx;
           }





           if(y<0)
           {
               dy=+dy;
           }
           if(y>width)
           {
               dy=-dy;
           }


       }
       public void draw(Graphics2D g2d) {
          g2d.setColor(color);
          g2d.fillOval((int) x, (int) y, 100, 100); // draw this at latest position.
       }
    }
dx=+dx和dy=+dy什么也不做

如果你想改变方向,那就做吧

dx=-dx


无论dx在更改之前是正的还是负的,这都是正确的。

请注意,如果某个对象由于某种原因在屏障之外,那么由于运行了相当高的帧速率计算机动画,它将在相同的位置上抖动,因为它会在每一帧中不断改变方向。您可能更希望的是检查投射物是否在下一帧中“将要穿过”屏障,例如,如果px-b!=px+dx-b,其中b是x边界位置,然后反转x速度,其中p是一个特殊函数,也定义为等效于x>0?1:0。p与符号函数非常相似,只是省略了0,因为否则对象可能会完全卡在边界上

此外,为了提高精度,您应该在此帧中存储朝向边界要覆盖的绝对距离,并将其添加到下一帧中速度的两倍。例如。 tx=-2x-b对于b处的边界,碰撞发生在帧“期间”的某个时间