【发布时间】:2018-10-09 10:42:51
【问题描述】:
通常在此类游戏中只有 Y 轴移动可用,但我决定以允许 X 轴桨移动的方式制作它。如果我不在 X 轴上移动球拍,当球击中球拍(在这种情况下,它会直接通过。)如果我在球击中球拍之前停止 X 轴运动,则游戏运行良好。球每次都会从球上反弹。
起初我虽然这与像素有关,但我也尝试以多种方式改变桨碰撞,但没有积极的结果。无论我尝试多少次,球都不会从桨上反弹。
代码非常简单,我一次只移动 1px:
public void drawBall(Graphics g) { //ball speed, movement and collision
b.set(b.getX()+VX,b.getY()+VY); //velocity X and velocity Y both at 1px
g.setColor(Color.black);
b.draw(g);
if(b.getY()<0 || b.getY()>sizeY-b.getRadius()){ //top & bottom collision
VY = -VY;
}
if(b.getX()<0 || b.getX()>sizeX-b.getRadius()){ //left & right detection
b.center();
VX = -VX;
x = (int) (Math.random()*2+0);
if(x == 0)
VY = -VY;
}
if(b.getX() == p1.getX()+p1.width && b.getY()>p1.getY() && b.getY()<p1.getY()+p1.height){ // p1 paddle detection
VX = -VX;
}
if(b.getX()+b.getRadius()==p2.getX() && b.getY()>p2.getY() && b.getY()<p2.getY()+p2.height){ // p2 paddle detection
VX = -VX;
}
}
为了移动桨,我使用了简单的标志,将移动设置为在按键时“开”和在按键释放时“关”的特定方向。我在不定式循环中运行它,因此它会不断执行。
这就是“run()”方法的样子:
public void run() {
while(true){
repaint();
try {
Thread.sleep(5);
playerMovement(); //moves players paddle on X and/or Y axis
playerLimits(); //limits movment of players to specific area
} catch (InterruptedException e){
}
}
}
我再次尝试用“if(ball
提前感谢您的帮助,非常感谢。
【问题讨论】:
-
不要将游戏引擎代码与图形代码混在一起——两者必须分开。任何解决方案的关键是确保游戏引擎能够识别“碰撞”并正确且明确地处理它。与其切换速度方向,不如考虑根据碰撞发生的位置设置这些速度的绝对值。另请注意,如果您将图形与游戏引擎分开,您的引擎将变得可单独测试并且更易于调试。
-
@Hovercraft Full Of Eels 按照您的建议解决了我的 Math.abs 问题。我使用带有大写字母的变量,因为它们最初应该是常量。谢谢你的帮助!我的 Applet 游戏只剩下一个问题,那就是不断闪烁。我真的很想保持我的 Thread.sleep() 低于 20。我有双缓冲,但即使有这个问题仍然存在(它闪烁较少但仍然到了真正令人不安的地步。)
-
这是一个单独的问题,通常与双缓冲有关。仔细检查。
标签: java debugging applet awt pong