Flutter空间网格管理插件flame_spatial_grid的使用

Flutter空间网格管理插件flame_spatial_grid的使用

概述

该库是一个用于处理无限游戏区域的框架和工具集。它支持加载无限地图,创建无限数量的游戏对象和活跃玩家/NPC,并且与Flame完全兼容,对游戏结构没有严格要求。即使是现有的游戏也可以迁移到这个框架。

该库目前仍在测试阶段,API和整体架构可能会随时更改,包括破坏性更改。

特性

该库提供了许多实用功能,这里只列举一些顶级特性:

  • 构建无尽的游戏关卡:无需改变屏幕即可渲染另一个地图。系统允许你创建大型开放世界,并在玩家接近新地图时无缝加载。
  • 构建具有可破坏环境的游戏关卡:每个Tiled图块都可以转换为单独的游戏组件,并单独处理与其他游戏元素的交互。
  • 动态生成地图:在玩家接近时动态生成地图的一部分或整个地图。
  • 明智的资源管理:系统不会贪婪地消耗资源,它会负责适当的分配和释放,使你可以在浏览器或低端手机上享受游戏。
  • 新的视觉效果:轻量级的资源管理系统允许为多个玩家创建轨迹,并在长时间的游戏会话中持续存在,与地面等其他游戏元素融合。

核心概念

该框架的核心是一个空间网格,它会在运行时动态构建,并控制组件的可见性和活动性,按块加载和卸载地图。这允许通过预渲染静态组件到图像来优化渲染,但保持图像大小足够小,并在未使用时从内存中卸载。

使用:最小设置

以下是使用flame_spatial_grid的基本步骤:

  1. HasSpatialGridFramework混合到你的游戏中。
  2. HasGridSupport混合到每个游戏组件。
  3. 在游戏的onLoad函数中调用initializeSpatialGrid,并在添加任何组件之前进行初始化。
  4. 开始享受!

详细入门教程见此处

完整的代码示例见此处

未来使用说明

以下是一些未来的使用指南:

  1. 入门指南,如果你还没有阅读过。
  2. 与Tiled地图一起工作
  3. 与Tiled世界一起工作
  4. 使用CellLayers优化静态对象的渲染和碰撞检测
  5. 与Flame的相机互动
  6. 创建轨迹和其他临时标记(待完成)。

高级部分

以下是一些高级主题:

  1. 如何自定义碰撞检测系统(待完成)。
  2. 如何使用CellLayers优化碰撞检测(待完成)。

完整示例代码

import 'dart:ui';

import 'package:flame/game.dart';
import 'package:flame_spatial_grid/flame_spatial_grid.dart';
import 'package:flame_spatial_grid_example/game.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  // 这个小部件是你的应用的根。
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.purple,
      ),
      home: GameWidget.controlled(
        gameFactory: SpatialGridExample.new,
        overlayBuilderMap: {
          'loading': (BuildContext ctx, SpatialGridExample game) {
            return Material(
              type: MaterialType.transparency,
              child: BackdropFilter(
                filter: ImageFilter.blur(
                  sigmaX: 5.0,
                  sigmaY: 5.0,
                ),
                child: StreamBuilder<LoadingProgressMessage<String>>(
                  stream: game.loadingStream,
                  builder: (context, snapshot) {
                    final progress = snapshot.data?.progress ?? 0;
                    return Center(
                      child: Text(
                        'Loading: $progress% ',
                        style: const TextStyle(
                          color: Colors.white,
                          fontWeight: FontWeight.bold,
                          fontSize: 24,
                        ),
                      ),
                    );
                  },
                ),
              ),
            );
          },
        },
      ),
    );
  }
}

更多关于Flutter空间网格管理插件flame_spatial_grid的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter空间网格管理插件flame_spatial_grid的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


flame_spatial_grid 是一个用于 Flutter 的插件,主要用于在游戏中实现空间网格管理。它可以帮助你高效地管理和查询游戏中的对象,特别是在需要处理大量对象时,可以提高性能。

安装

首先,你需要在 pubspec.yaml 文件中添加 flame_spatial_grid 依赖:

dependencies:
  flame_spatial_grid: ^0.1.0

然后运行 flutter pub get 来安装依赖。

基本使用

  1. 导入库
import 'package:flame_spatial_grid/flame_spatial_grid.dart';
  1. 创建网格
final grid = SpatialGrid(
  width: 800,  // 网格宽度
  height: 600, // 网格高度
  cellSize: 50, // 单元格大小
);
  1. 添加对象到网格
final object = GameObject(); // 假设你有一个游戏对象
grid.add(object, position: Vector2(100, 100)); // 将对象添加到网格中的指定位置
  1. 查询对象
final objectsAtPosition = grid.query(Vector2(100, 100)); // 查询指定位置的对象
  1. 更新对象位置
grid.update(object, newPosition: Vector2(200, 200)); // 更新对象的位置
  1. 移除对象
grid.remove(object); // 从网格中移除对象

高级用法

自定义查询范围

你可以通过指定一个矩形范围来查询该范围内的所有对象:

final objectsInArea = grid.queryArea(
  Rect.fromLTWH(50, 50, 100, 100), // 查询范围
);

处理对象移动

当对象移动时,你需要更新其在网格中的位置:

void onObjectMoved(GameObject object, Vector2 newPosition) {
  grid.update(object, newPosition: newPosition);
}

监听对象变化

你可以监听网格中对象的变化,例如对象被添加、移除或移动:

grid.onObjectAdded.listen((object) {
  print('Object added: $object');
});

grid.onObjectRemoved.listen((object) {
  print('Object removed: $object');
});

grid.onObjectMoved.listen((object) {
  print('Object moved: $object');
});

示例代码

以下是一个简单的示例,展示了如何使用 flame_spatial_grid 来管理游戏中的对象:

import 'package:flame_spatial_grid/flame_spatial_grid.dart';
import 'package:flame/geometry.dart';

void main() {
  final grid = SpatialGrid(
    width: 800,
    height: 600,
    cellSize: 50,
  );

  final object1 = GameObject();
  final object2 = GameObject();

  grid.add(object1, position: Vector2(100, 100));
  grid.add(object2, position: Vector2(150, 150));

  final objectsAtPosition = grid.query(Vector2(100, 100));
  print('Objects at position (100, 100): $objectsAtPosition');

  grid.update(object1, newPosition: Vector2(200, 200));

  final objectsInArea = grid.queryArea(Rect.fromLTWH(50, 50, 100, 100));
  print('Objects in area: $objectsInArea');

  grid.remove(object2);
}

class GameObject {
  // 你的游戏对象逻辑
}
回到顶部