【问题标题】:Applet "pong" game: ball goes right through paddle if paddle is moving towards the ball小程序“乒乓”游戏:如果球拍向球移动,球会直接穿过球拍
【发布时间】: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


【解决方案1】:

不要将游戏引擎代码与图形代码混在一起——两者必须分开。任何解决方案的关键是确保游戏引擎能够识别“碰撞”并正确且明确地处理它。与其切换速度方向,不如考虑根据碰撞发生的位置设置这些速度的绝对值。

例如,您有以下代码:

if(b.getY() < 0 || b.getY() > sizeY-b.getRadius()){ //top & bottom collision
    VY = -VY;
}

但是,如果精灵被捕捉到超出边距,这可能会导致精灵被困住。也许更好的做法是:

if (b.getY() < 0) {
    // note that variables should start with lower-case letters
    vy = Math.abs(vy); // make sure that it is going in a positive direction
}

if (b.getY() > sizeY - b.getRadius()) {
    vy = -Math.abs(vy);
}

x 方向也是如此

另请注意,如果您将图形与游戏引擎分开,您的引擎将变得可单独测试并且更易于调试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-13
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2020-11-01
    • 1970-01-01
    • 2015-01-06
    相关资源
    最近更新 更多