java游戏开发入门(五) - 碰撞机制
- 前言
- 编码
- 实体类型
- Gold实体定义
- Player实体修改
- 在游戏内部创建Glod实体
- 初始化碰撞效果
- 效果展示
- 完整代码
- EntityType
- DemoEntityFactory
- HelloWorldApp
- 完整项目
前言
上一章呢,我们讲了对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