JavaFX 2D停车游戏车辆旋转时碰撞盒扩大错位问题如何解决
问题根源
你当前使用的getBoundsInParent()方法返回的是轴对齐边界盒(AABB),该边界盒永远保持水平垂直朝向,只会包裹旋转后的节点内容,不会跟随节点同步旋转,因此碰撞检测判断完全失准。
解决方案(新手友好,改动量极小)
我们通过绑定同步旋转的真实形状做碰撞检测,而非轴对齐边界盒,步骤如下:
- 导入所需依赖(已有导入可跳过)
import javafx.scene.Group; import javafx.scene.shape.Shape; import javafx.scene.paint.Color;
- 修改
Player类,给车辆绑定同尺寸的碰撞矩形
private static class Player extends GameObject { Player() { ImageView carView = new ImageView("caarr.png"); // 创建和车辆尺寸一致的碰撞矩形,调试阶段可以把Color.TRANSPARENT换成Color.rgb(255,0,0,0.3)查看碰撞盒位置是否正确 Rectangle collisionRect = new Rectangle( carView.getImage().getWidth(), carView.getImage().getHeight(), Color.TRANSPARENT ); // 放入同一个Group,旋转、位移时两个节点会自动同步 Group carGroup = new Group(carView, collisionRect); super(carGroup); } }
- 修改
GameObject类,替换碰撞检测逻辑
先新增获取碰撞形状的方法:
private Shape getCollisionShape() { if (view instanceof Group) { // Group中第二个节点是我们新增的碰撞矩形 return (Shape) ((Group) view).getChildren().get(1); } // Wall、Park本身就是矩形形状,直接返回 return (Shape) view; }
替换原有isColliding方法:
public boolean isColliding(GameObject other){ Shape intersectResult = Shape.intersect(this.getCollisionShape(), other.getCollisionShape()); // 相交区域宽高都大于0则判定为真实碰撞 return intersectResult.getBoundsInLocal().getWidth() > 0 && intersectResult.getBoundsInLocal().getHeight() > 0; }
如果需要精准的停车入位判定,可以把isContaining方法也改成判断车辆碰撞盒完全落在停车位矩形内即可,调试阶段可以给碰撞矩形加半透明颜色,确认碰撞盒和车辆完全对齐后再改回透明。
内容的提问来源于stack exchange,提问作者Michal Jegh
相关产品推荐
相关产品推荐

