FXGL游戏开发-碰撞处理

在【FXGL游戏开发-加载游戏资源】这章节中,游戏世界已经存在两辆坦克了,现在给这两两辆坦克加上碰撞效果,即当玩家的坦克(蓝色)撞上敌军坦克(绿色)时,玩家的坦克自动消失。

FXGL 要使 Entity 有碰撞效果,构建实体时,必须使用 viewWithBBox(),而不能使用 view(),因为 viewWithBBox() 才会构建有边界的 Entity,这样才能实现碰撞效果。

另外,需要给 Entity 添加碰撞组件 CollidableComponent,下面是完整的代码实现:

public class CollisionGameApp extends GameApplication {

    @Override
    protected void initSettings(GameSettings settings) {
        settings.setTitle("Hi IT青年 Game");
        settings.setWidth(480);
        settings.setHeight(320);
        settings.setVersion("0.1");
    }

    private enum Type {
        PLAYER, ENEMY
    }

    private Entity player;

    @Override
    protected void initGame() {
        player = FXGL.entityBuilder()
                .type(Type.PLAYER)
                .at(10, 120)
                .viewWithBBox("tank.png")
                .with(new CollidableComponent(true))
                .buildAndAttach();

        Entity enemy = FXGL.entityBuilder()
                .type(Type.ENEMY)
                .at(280, 120)
                .viewWithBBox("tank2.png")
                .with(new CollidableComponent(true))
                .buildAndAttach();
        enemy.setScaleX(-1);
    }

    @Override
    protected void initInput() {
        FXGL.onKey(KeyCode.A, () -> player.translateX(-5));
        FXGL.onKey(KeyCode.D, () -> player.translateX(5));
    }

    @Override
    protected void initPhysics() {
        FXGL.getPhysicsWorld().addCollisionHandler(new CollisionHandler(Type.PLAYER, Type.ENEMY) {
            @Override
            protected void onCollisionBegin(Entity e1, Entity e2) {
                e1.removeFromWorld();
            }
        });
    }

    public static void main(String[] args) {
        launch(args);
    }
}

上面的例子中,玩家和敌军的坦克分别指定了类型(type),使用 viewWithBBox() 构建带边界的 Entity ,并且添加碰撞组件 CollidableComponent(true),最后在 initPhysics() 处理碰撞事件,当两辆坦克撞击时,玩家坦克从游戏世界中移除。

运行效果:

这样,玩家坦克撞击敌方坦克时,就会从游戏世界消失。

===========================================================================
HiIT青年
关注公众号,阅读更多文章。

posted @ 2022-10-23 22:13  HiIT青年  阅读(138)  评论(0编辑  收藏  举报