using Godot;
using System;
using System.Collections.Generic;
using System.Linq;
///
/// 图块映射辅助类
///
public partial class TileMapping : Node
{
///
/// 从图块坐标到像素坐标的映射。如果不为空,则使用此映射。
///
private 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 (int x = _tileRect.Position.X; x < _tileRect.End.X; x++) {
for (int y = _tileRect.Position.Y; y < _tileRect.End.Y; y++) {
var pos = new Vector2I(x, y);
layer.SetCell(pos, sourceId, pos + _pixelOffset);
}
}
}
}
}