FXGL JAVA游戏引擎 教程 06_自定义地图加载器(给萌妹一个家)

本文介绍了如何使用FXGL游戏引擎导入TMX地图文件,通过地图编辑器创建游戏世界,并利用图层和对象层实现特殊功能。通过实例代码展示了如何在工厂中添加自定义实体,并在初始化阶段注入地图,最终实现简单的游戏场景。
摘要由CSDN通过智能技术生成

上文中,我们已经获得了一个完整的游戏角色,他能正常的移动,还有一些自身的特色,但是还有一个比较显著的问题,我们当前的游戏却少一个世界。

1. 逻辑分析

抛开其他轮子不谈,我们要自己生成世界可以使用实体或者ui生成的方式按照自己自定的某种数据结构(可能是二维数组)来渲染我们设计出的地图。但是明显会发现这个二维数组的可读可维护性会比较糟糕。这里就需要引入FXGL的一个比较方便的点:可以支持tmx文件格式的地图导入。
首先我们需要下载一个地图编辑器

这里可以下载mapedit

下载完成后我们需要一些地图资源文件,这些都可以去爱给网上下载得到。
具有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了。

这里是本期的git代码

回主目录

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
FXGL 中,可以通过 `FXGL.getSceneService().pushScene(targetScene)` 方法来跳转到目标场景。为了方便起见,我们可以创建一个自定义的组件来实现场景跳转功能。 首先,创建一个名为 `SceneSwitchComponent` 的类,继承 `com.almasb.fxgl.entity.component.Component` 类,代码如下: ```java import com.almasb.fxgl.core.serialization.Bundle; import com.almasb.fxgl.entity.component.Component; public class SceneSwitchComponent extends Component { private String targetScene; public SceneSwitchComponent(String targetScene) { this.targetScene = targetScene; } @Override public void onUpdate(double tpf) { // 空实现,不需要实现 onUpdate 方法 } @Override public void onAdded() { // 点击实体时跳转到目标场景 entity.getViewComponent().addEventHandler(MouseEvent.MOUSE_CLICKED, event -> { FXGL.getSceneService().pushScene(targetScene); }); } @Override public void onRemoved() { // 移除事件监听 entity.getViewComponent().removeEventHandler(MouseEvent.MOUSE_CLICKED, event -> { FXGL.getSceneService().pushScene(targetScene); }); } @Override public void write(Bundle bundle) { bundle.put("targetScene", targetScene); } @Override public void read(Bundle bundle) { targetScene = bundle.get("targetScene"); } } ``` 这个组件包含一个 `targetScene` 字段,表示要跳转的目标场景名称。在 `onAdded()` 方法中,我们为实体的 `ViewComponent` 添加了一个鼠标点击事件监听,当用户点击实体时,就会自动跳转到目标场景。`onRemoved()` 方法用于在移除组件时移除事件监听。 接下来,在需要使用场景跳转功能的实体上添加 `SceneSwitchComponent` 组件即可。例如,我们可以创建一个名为 `Button` 的实体,代码如下: ```java import com.almasb.fxgl.entity.Entities; import com.almasb.fxgl.entity.Entity; import javafx.geometry.Pos; import javafx.scene.paint.Color; import javafx.scene.text.Font; import javafx.scene.text.Text; public class Button extends Entity { public Button(String text, String targetScene) { Text textNode = new Text(text); textNode.setFont(Font.font(24)); textNode.setFill(Color.WHITE); setViewFromNode(textNode); setAlignment(Pos.CENTER); addComponent(new SceneSwitchComponent(targetScene)); } } ``` 这个实体包含一个用于显示文本的 `Text` 节点,并且添加了一个 `SceneSwitchComponent` 组件。创建实体时需要传入两个参数,分别是文本内容和目标场景名称。 最后,在游戏场景中添加这个 `Button` 实体,代码如下: ```java import com.almasb.fxgl.app.scene.GameScene; import com.almasb.fxgl.entity.Entity; import com.almasb.fxgl.entity.Entities; public class MyGameScene extends GameScene { public MyGameScene() { Entity button = Entities.builder() .at(400, 300) .viewFromNode(new Button("跳转到场景2", "scene2")) .build(); addEntities(button); } } ``` 这里创建了一个名为 `MyGameScene` 的游戏场景,并且添加了一个 `Button` 实体。当用户点击这个实体时,就会自动跳转到名为 `scene2` 的场景。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值