上文中,我们已经获得了一个完整的游戏角色,他能正常的移动,还有一些自身的特色,但是还有一个比较显著的问题,我们当前的游戏却少一个世界。
1. 逻辑分析
抛开其他轮子不谈,我们要自己生成世界可以使用实体或者ui生成的方式按照自己自定的某种数据结构(可能是二维数组)来渲染我们设计出的地图。但是明显会发现这个二维数组的可读可维护性会比较糟糕。这里就需要引入FXGL的一个比较方便的点:可以支持tmx文件格式的地图导入。
首先我们需要下载一个地图编辑器
下载完成后我们需要一些地图资源文件,这些都可以去爱给网上下载得到。
具有ps等软件使用基础的同学可以很容易的学会使用该制作器。
简简单单的画一点东西~这里着重介绍一下图层问题,不同的图层这个很好理解,高位的会遮盖掉低位图层的东西。对象层也是图层的一种,而且尤其重要。
地图中有很多图块,但是这些图块最后会被组成一张image图片整体渲染到游戏中,如果我们希望实现某些图块有特殊操作,某些图块不能通过等等问题,我们需要增加obj对象。这些对象上的类型会在你加载项目的时候,从游戏引擎内的实体工厂寻找并且添加在游戏世界中。
2.代码实践
整体的代码实现很简单,首先我们现在最早的工厂中增加wall对象
GameEntityFactory.java
@Spawns("wall")
public Entity newWall(SpawnData data) {
Entity build = FXGL
.entityBuilder(data)
.bbox(new HitBox(BoundingShape.box(data.<Integer>get("width"), data.<Integer>get("height"))) )
.collidable()
.with(new PhysicsComponent())
.build();
return build;
}
然后再app的init阶段注入该工厂
@Override
protected void initGame() {
FXGL.getGameWorld().addEntityFactory(new GameEntityFactory());
//加载地图的方法
setLevel();
Entity entity = CustomerEntityFactory.createEntity(EntityType.PLANE);
//绑定视角 固定视角
FXGL.getGameWorld().addEntity(entity);
Viewport viewport = FXGL.getGameScene().getViewport();
viewport.setBounds(-10000,-10000,250 *70,10000);
viewport.bindToEntity(entity, FXGL.getAppWidth() / 2, FXGL.getAppHeight() / 2);
}
然后就是加载地图方法
private void setLevel() {
//首先移除全部的实体
FXGL.getGameWorld().getEntitiesCopy().forEach(t -> t.removeFromWorld());
//加载地图
FXGL.setLevelFromMap("tmx/obj_test.tmx");
}
让我们运行一下,真不错。
当然,这还是一个很简单的游戏框架,但是已经能够制作很简单rpggame了。