51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

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

前言 {#前言}

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

编码 {#编码}

实体类型 {#实体类型}

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

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

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实体修改}

  与此同时,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实体 {#在游戏内部创建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();
            }
        });
    }

完整代码 {#完整代码}

EntityType {#entitytype}

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

DemoEntityFactory {#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 {#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

赞(5)
未经允许不得转载:工具盒子 » java游戏开发入门(五) - 碰撞机制