java弹跳球碰撞不起作用
我一直在尝试用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
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处的边界,碰撞发生在帧“期间”的某个时间