JavaFX检查窗格上动画形状之间的碰撞-多次碰撞

时间:2018-08-30 23:36:43

标签: java user-interface animation javafx game-physics

我正在用JavaFX制作一个简单的游戏,其中一个球从底部释放(通过按钮)后在屏幕上反弹。当球在窗格周围弹跳时,如果击中Rectangle,则其颜色将变为蓝色。

我正在尝试添加一个名为checkBounds的方法来跟踪球(Circle)何时击中Rectangle。一旦球与矩形接触,得分应增加10。计分机制起作用,但随着球穿过Rectangle的每一帧,计分机制都会继续增加,而不是在它进入。 (例如,它应该只上升10倍,而不是在整个球通过时继续上升10倍)。我在时间轴循环中调用了checkBounds() 3次,以检查每次循环迭代中的每个矩形。

checkBounds(ball, gameSquare); checkBounds(ball, gameSquare2); checkBounds(ball, gameSquare3);

如何解决此逻辑错误?我尝试了几种不同的选择,但是似乎都没有用。

private void checkBounds(Shape block, Rectangle rect) {

    boolean collisionDetected = false;

    Shape intersect = Shape.intersect(block, rect);

    if (intersect.getBoundsInLocal().getWidth() != -1) {
        collisionDetected = true;
    }

    if (collisionDetected) {
        score.setText(Integer.toString(currentScore.getCurrentValue()));
        currentScore.incrementBy(10);
        rect.setFill(Color.BLUE);
    }
}

1 个答案:

答案 0 :(得分:0)

我相信您要检测的是collisionDetectedfalsetrue的状态变化。一种方法是将先前值的状态保留为每个碰撞对象的成员变量。为此,我们需要为矩形提供一些标识ID,因此您可能需要将ID传递到checkBounds方法中:

private void checkBounds(Shape block, Rectangle rect, int id) {

我们还需要创建一个成员变量来存储状态:

private HashMap<Integer,Boolean> previousCollisionStateMap = new HashMap<>();

然后在您的checkBounds代码中,您可以修改条件以检查更改

Boolean prevState = previousCollisionStateMap.get(id);
if (prevState == null) {  // this is just to initialize value
    prevState = false;
    previousCollisionStateMap.put(id,false);
}

if (!prevState && collisionDetected) {
    score.setText(Integer.toString(currentScore.getCurrentValue()));
    currentScore.incrementBy(10);
    rect.setFill(Color.BLUE);
}

别忘了最后更新状态

previousCollisionStateMap.put(id,collisionDetected);