游戏开发入门(五)"/>
java游戏开发入门(五)
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);
初始化碰撞效果
/*** 初始化碰撞效果*/@Overrideprotected void initPhysics() {getPhysicsWorld().addCollisionHandler(new CollisionHandler(EntityType.PLAYER,EntityType.GOLD){@Overrideprotected 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 配置对象*/@Overrideprotected void initSettings(GameSettings settings) {settings.setTitle("Hello world");settings.setWidth(600);settings.setHeight(600);settings.setMainMenuEnabled(true);settings.setGameMenuEnabled(true);}/*** 初始化游戏内容*/@Overrideprotected void initGame() {// 注册实体工厂FXGL.getGameWorld().addEntityFactory(new DemoEntityFactory());// 在界面正中间生成玩家实体player = FXGL.spawn("Player",FXGL.getAppWidth()/2,FXGL.getAppHeight()/2);// 在界面200,200位置生成一个Gold实体spawn("Gold", 200,200);}/*** 初始化输入*/@Overrideprotected 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);});}/*** 初始化物理引擎(碰撞效果)*/@Overrideprotected void initPhysics() {getPhysicsWorld().addCollisionHandler(new CollisionHandler(EntityType.PLAYER,EntityType.GOLD){@Overrideprotected void onCollisionBegin(Entity tank, Entity gold) {//将gold对象从游戏中移除gold.removeFromWorld();}});}/*** main 程序的开始* @param args 参数*/public static void main(String[] args) {launch(args);}
}
完整项目
更多推荐
java游戏开发入门(五)
发布评论