我正在用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);
}
}
答案 0 :(得分:0)
我相信您要检测的是collisionDetected
从false
到true
的状态变化。一种方法是将先前值的状态保留为每个碰撞对象的成员变量。为此,我们需要为矩形提供一些标识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);