我一直试图用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.
}
}
答案 0 :(得分:0)
dx=+dx
和dy=+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
(碰撞发生在'一帧'的某个时间)。