火焰和瓷砖新手

问题描述 投票:0回答:1

我已经在 Flame 和 Tiled 上闲逛了几天,我已经阅读了文档,但我不知道如何从 TiledComponent 获取图块数据?

希望有人能帮忙:)

我还想知道如何向ObjectGroup图层添加新对象。 比如在地图上添加怪物等。

import 'package:flame/components.dart';
import 'package:flame/effects.dart';
import 'package:flame/flame.dart';
import 'package:flame/game.dart';
import 'package:flame_tiled/flame_tiled.dart';
import 'package:flutter/widgets.dart' hide Animation, Image;

import 'package:flame/input.dart';
import 'package:flame/events.dart';

// Main
void main() {
  runApp(GameWidget(game: TiledGame()));
}

// Tile and map
Size tile = const Size(128, 64);
Size map = const Size(30, 30);

//  TiledGame
class TiledGame extends FlameGame with PanDetector, TapDetector {
  late TiledComponent mapComponent;

  TiledGame() : super(
    camera: CameraComponent.withFixedResolution(
      width: map.width * tile.width,
      height: map.height * tile.height,
    ),
  );

  @override
  Future<void> onLoad() async {
    debugMode = true;

    // Map
    mapComponent = await TiledComponent.load(
        'test.tmx',
        Vector2(128, 64),
        prefix: 'assets/maps/'
    );
    world.add(mapComponent);

    // Camera
    camera.viewfinder.anchor = Anchor.center;
    camera.moveTo(
        Vector2(
            (map.width * tile.width) * 0.5,
            (map.height * tile.height) * 0.5
        )
    );
  }

  @override
  void onTapDown(TapDownInfo info) {
    // int x = ??
    // int y = ??
    // print(mapComponent.tileMap.getTileData(layerId: 0, x: x, y: y));
  }

  @override
  void onPanUpdate(DragUpdateInfo info) {
    double offset = 3.3;
    Vector2 pos = Vector2((info.delta.global.x*offset)*-1, (info.delta.global.y*offset)*-1);
    camera.moveBy(pos);
  }

}
flutter tiled flame
1个回答
0
投票

您可以通过

RenderableTiledMap
TiledComponent
获取图块地图中的任何图层。例如,如果您的图块地图包含一个名为“触发器”的对象层,您可以这样读取它:

    mapComponent = TiledComponent(...);
    final triggerLayer = mapComponent.tileMap.getLayer<ObjectGroup>('Trigger');

以下是从

Tiled
的图层类型到
tiled.dart
的图层类类型的映射:

    Tiled layers | tiled.dart types
    ---------------------------------------
    Tile Layer   | TileLayer
    Object Layer | ObjectGroup
    Image Layer  | ImageLayer
    Group Layer  | Group

此信息也可以在 Flame 的官方文档中找到:https://docs.flame-engine.org/latest/bridge_packages/flame_tiled/layers.html#layers

至于你问题的第二部分:

  1. 您的地图中需要一个对象图层来添加对象
  2. 一旦您激活了对象层,所有放置工具将被激活。使用这些工具,您可以在地图上标记要生成游戏实体的位置。
  3. 最后你可以像这样读取所有对象的数据:
    final objects = triggerLayer?.objects;
    if (objects != null) {
     for (final object in objects) {
       // You logic goes here...
       // You access various properties of the object
       // to decide which game entity to spawn and 
       // where to spawn it.
     }
    }

您可以查看以下代码以供参考:https://github.com/ufrshubham/ski_master/blob/afbaa158cdf9f35a0d0575726ef8abe079f3d868/lib/game/routes/gameplay.dart#L88-L112

© www.soinside.com 2019 - 2024. All rights reserved.