java弹跳球碰撞不起作用

时间:2014-11-01 10:43:58

标签: java collision-detection

我一直试图用java制作这个弹跳球游戏,这是我的代码。 当球被撞到墙上时,我无法理解速度的变化。 当我试图改变速度时球不会移动而是停留在一个位置并振动。我不知道问题出在哪里但是球没有从墙上弹起来......可以帮我解决吗?< / p>

    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.
       }
    }

2 个答案:

答案 0 :(得分:0)

dx=+dxdy=+dy什么都不做。

如果要反转方向

dx=-dx;

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

答案 1 :(得分:0)

请注意,如果某个物体出于某种原因位于障碍物之外,那么它将会四处摇晃,看起来保持在同一位置(由于运行相当高的帧速率计算机动画),因为它将继续改变方向(s )每一帧。你可能更想要的是检查射弹是否会在下一帧中越过障碍物,例如:如果p(x-b) != p(x+dx-b),其中b是x边界位置,则反转x速度,其中p是一个特殊函数,也定义为等同于x>0?1:0。 (p非常类似于sign函数,除了省略0,因为否则对象可能会完全卡在边界上)。

此外,为了提高准确度,您应该在此帧中存储要覆盖的边界的绝对距离,并将其加到下一帧中的速度的两倍。例如。 tx = -2(x-b)的边界b(碰撞发生在'一帧'的某个时间)。