using System.Collections.Generic; using System.Linq; using Godot; /// /// 图块映射辅助类 /// public partial class TileMapping : Node { /// /// 从图块坐标到像素坐标的映射。如果不为空,则使用此映射。 /// private readonly Dictionary _pixelMap; /// /// 如果 pixelMap 为空,使用此偏移量将图块坐标转换为像素坐标。 /// private Vector2I _pixelOffset; /// /// 图块区域 /// private Rect2I _tileRect; /// /// 构造函数,使用坐标映射字典 /// /// 坐标映射字典 public TileMapping(Dictionary map) { _pixelMap = map; _pixelOffset = new Vector2I(-int.MaxValue, -int.MaxValue); } /// /// 构造函数,使用偏移量和区域 /// /// 偏移量 /// 区域 public TileMapping(Vector2I offset, Rect2I rect) { _pixelMap = null; _pixelOffset = offset; _tileRect = rect; } public TileMapping() { } /// /// 应用映射到TileMapLayer /// /// TileMapLayer public void Apply(TileMapLayer layer) { // if pixelMap is not null, use all the pairs in pixelMap to set the tiles. if (_pixelMap != null) { var sourceId = layer.GetCellSourceId(_pixelMap.Keys.First()); foreach (var pair in _pixelMap) layer.SetCell(pair.Key, sourceId, pair.Value); } else { var sourceId = layer.GetCellSourceId(_tileRect.Position); GD.Print(_tileRect); for (var x = _tileRect.Position.X; x < _tileRect.End.X; x++) for (var y = _tileRect.Position.Y; y < _tileRect.End.Y; y++) { var pos = new Vector2I(x, y); layer.SetCell(pos, sourceId, pos + _pixelOffset); } } } }