java游戏开发入门(五) - 碰撞机制

前言

  上一章呢,我们讲了对Player的控制,这一章讲一下怎么处理不同实体之间的碰撞处理,

编码

实体类型

  既然是不同的实体,那我们就要对实体进行类型区分,这里采用枚举的方式区分不同的实体。

/**
 * 实体类型
 * @author lhDream
 */
public enum EntityType {
    PLAYER,GOLD
}

Gold实体定义

  既然是不同的实体碰撞,那么就需要不同的实体,这里我们创建一个Gold实体,并设置类型为GOLD

    /**
     * 创建Gold实体
     * @return 玩家实体
     */
    @Spawns("Gold")
    public Entity newGold(SpawnData data){
        return FXGL.entityBuilder(data)
                //声明设备类型
                .type(EntityType.GOLD)
                // 根据UI大小自动生成碰撞体积
                .collidable()
                // 宽 50px 高 50px 颜色红色
                .viewWithBBox(new Rectangle(50,50, Color.RED))
                .build();
    }

Player实体修改

  与此同时,Player实体也要声明实体类型,并标记实体为可碰撞类型。(ps:这里把Player的大小改为了50x50,主要是因为10x10看着太小了)

    /**
     * 创建玩家实体
     * @return 玩家实体
     */
    @Spawns("Player")
    public Entity newPlayer(SpawnData data){
        return FXGL.entityBuilder(data)
                // 声明设备类型
                .type(EntityType.PLAYER)
                // 将实体标记为可碰撞,并根据UI大小自动生成碰撞体积
                .collidable()
                // 宽 10px 高 10px 颜色黑色
                .viewWithBBox(new Rectangle(50,50, Color.BLACK))
                .build();
    }

在游戏内部创建Glod实体

// 在界面200,200位置生成一个Gold实体
spawn("Gold", 200,200);

初始化碰撞效果

	/**
     * 初始化碰撞效果
     */
    @Override
    protected void initPhysics() {
        getPhysicsWorld().addCollisionHandler(new CollisionHandler(EntityType.PLAYER,EntityType.GOLD){
            @Override
            protected void onCollisionBegin(Entity player, Entity gold) {
                //将gold对象从游戏中移除
                gold.removeFromWorld();
            }
        });
    }

效果展示

碰撞or物理引擎

在这里插入图片描述
在这里插入图片描述

完整代码

EntityType

/**
 * 实体类型
 * @author lhDream
 */
public enum EntityType {
    PLAYER,GOLD
}

DemoEntityFactory

import com.almasb.fxgl.dsl.FXGL;
import com.almasb.fxgl.entity.Entity;
import com.almasb.fxgl.entity.EntityFactory;
import com.almasb.fxgl.entity.SpawnData;
import com.almasb.fxgl.entity.Spawns;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;


/**
 * 实体工厂
 * @author lhDream
 */
public class DemoEntityFactory implements EntityFactory {

    /**
     * 创建玩家实体
     * @return 玩家实体
     */
    @Spawns("Player")
    public Entity newPlayer(SpawnData data){
        return FXGL.entityBuilder(data)
                // 声明设备类型
                .type(EntityType.PLAYER)
                // 将实体标记为可碰撞,并根据UI大小自动生成碰撞体积
                .collidable()
                // 宽 10px 高 10px 颜色黑色
                .viewWithBBox(new Rectangle(50,50, Color.BLACK))
                .build();
    }

    /**
     * 创建Gold实体
     * @return 玩家实体
     */
    @Spawns("Gold")
    public Entity newGold(SpawnData data){
        return FXGL.entityBuilder(data)
                //声明设备类型
                .type(EntityType.GOLD)
                // 根据UI大小自动生成碰撞体积
                .collidable()
                // 宽 50px 高 50px 颜色红色
                .viewWithBBox(new Rectangle(50,50, Color.RED))
                .build();
    }

}

HelloWorldApp

import com.almasb.fxgl.app.GameApplication;
import com.almasb.fxgl.app.GameSettings;
import com.almasb.fxgl.dsl.FXGL;
import com.almasb.fxgl.entity.Entity;
import com.almasb.fxgl.physics.CollisionHandler;
import javafx.scene.input.KeyCode;

import static com.almasb.fxgl.dsl.FXGL.*;

/**
 * @author lhDream
 */
public class HelloWorldApp extends GameApplication {

    /**
     * 玩家实体
     */
    private Entity player;

    /**
     * 初始化设置
     * @param settings 配置对象
     */
    @Override
    protected void initSettings(GameSettings settings) {
        settings.setTitle("Hello world");
        settings.setWidth(600);
        settings.setHeight(600);

        settings.setMainMenuEnabled(true);
        settings.setGameMenuEnabled(true);
    }

    /**
     * 初始化游戏内容
     */
    @Override
    protected void initGame() {
        // 注册实体工厂
        FXGL.getGameWorld().addEntityFactory(new DemoEntityFactory());

        // 在界面正中间生成玩家实体
        player = FXGL.spawn("Player",FXGL.getAppWidth()/2,FXGL.getAppHeight()/2);

        // 在界面200,200位置生成一个Gold实体
        spawn("Gold", 200,200);
    }

    /**
     * 初始化输入
     */
    @Override
    protected void initInput() {
        onKey(KeyCode.W,"上",()->{
            player.translateY(-5);
        });
        onKey(KeyCode.S,"下",()->{
            player.translateY(+5);
        });
        onKey(KeyCode.A,"左",()->{
            player.translateX(-5);
        });
        onKey(KeyCode.D,"右",()->{
            player.translateX(+5);
        });
    }

    /**
     * 初始化物理引擎(碰撞效果)
     */
    @Override
    protected void initPhysics() {
        getPhysicsWorld().addCollisionHandler(new CollisionHandler(EntityType.PLAYER,EntityType.GOLD){
            @Override
            protected void onCollisionBegin(Entity tank, Entity gold) {
                //将gold对象从游戏中移除
                gold.removeFromWorld();
            }
        });
    }


    /**
     * main 程序的开始
     * @param args 参数
     */
    public static void main(String[] args) {
        launch(args);
    }
}

完整项目

https://github.com/lhDream/lhDreamGameDemo/tree/master/HelloWorld

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dan淡淡的心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值