Traveller/scripts/utils/TileMapUtils.cs
2024-04-28 21:55:19 +08:00

218 lines
7.8 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using ColdMint.scripts.debug;
using ColdMint.scripts.map.dateBean;
using Godot;
using Godot.Collections;
namespace ColdMint.scripts.utils;
public static class TileMapUtils
{
/// <summary>
/// <para>Get the layer number corresponding to LayerName in TileMap</para>
/// <para>在TileMap内获取LayerName所对应的图层序号</para>
/// </summary>
/// <param name="tileMap"></param>
/// <param name="layerName"></param>
/// <returns>
///<para> 1 is returned after obtaining failure</para>
///<para>获取失败返回-1</para>
/// </returns>
public static int GetTileMapLayer(TileMap tileMap, string layerName)
{
var count = tileMap.GetLayersCount();
for (var i = 0; i < count; i++)
{
var currentLayerName = tileMap.GetLayerName(i);
if (currentLayerName == layerName)
{
return i;
}
}
return -1;
}
/// <summary>
/// <para>Resolve the slots in the room layer</para>
/// <para>在房间图层内解析槽位</para>
/// </summary>
/// <param name="tileMap"></param>
/// <param name="layerName"></param>
/// <remarks>
///<para>This method was written by Github Copilot.</para>
///<para>此方法由Github Copilot编写。</para>
/// </remarks>
/// <returns></returns>
public static RoomSlot[] GetRoomSlots(TileMap tileMap, string layerName)
{
var layer = GetTileMapLayer(tileMap, layerName);
if (layer == -1)
{
return null;
}
var cells = tileMap.GetUsedCells(layer);
if (cells.Count == 0)
{
return null;
}
//保存上一个瓦片
var roomSlots = new List<RoomSlot>();
var currentSlot = new RoomSlot();
for (int i = 0; i < cells.Count; i++)
{
var currentCell = cells[i];
if (i == 0)
{
//首次循环时初始化瓦片,设置起始位置和结束位置
currentSlot.StartPosition = currentCell;
currentSlot.EndPosition = currentCell;
continue;
}
var distance = currentSlot.EndPosition - currentSlot.StartPosition;
LogCat.Log("距离从" + currentSlot.StartPosition + "到" + currentSlot.EndPosition + "为" + distance);
if (distance == Vector2I.Zero)
{
//原点可匹配临近瓦片,不需要方向判断
var formCellDistance = currentCell - currentSlot.EndPosition;
if (Math.Abs(formCellDistance.X) == 1 || Math.Abs(formCellDistance.Y) == 1)
{
//方块是相邻的(将终点设置到此方块)
LogCat.Log("添加与原点" + currentSlot.EndPosition + "相邻的坐标" + currentCell);
currentSlot.EndPosition = currentCell;
continue;
}
}
if (distance.X == 0)
{
//垂直方向
var formCellDistanceEnd = currentCell - currentSlot.EndPosition;
LogCat.Log("更新垂直:" + currentCell + "到终点" + currentSlot.EndPosition + "起点" + currentSlot.StartPosition +
"为" + formCellDistanceEnd);
if (formCellDistanceEnd.X != 0)
{
//新瓦片不与终点和起点在一条直线上
continue;
}
//方块是相邻的(将终点设置到此方块)
if (Math.Abs(formCellDistanceEnd.Y) == 1)
{
currentSlot.EndPosition = currentCell;
continue;
}
var formCellDistanceStart = currentCell - currentSlot.StartPosition;
LogCat.Log("更新垂直:" + currentCell + "到终点" + currentSlot.StartPosition + "终点" +
currentSlot.StartPosition +
"为" + formCellDistanceEnd);
//方块是相邻的(将终点设置到此方块)
if (Math.Abs(formCellDistanceStart.Y) == 1)
{
currentSlot.StartPosition = currentCell;
continue;
}
}
if (distance.Y == 0)
{
//水平方向
var formCellDistanceEnd = currentCell - currentSlot.EndPosition;
LogCat.Log("更新水平:" + currentCell + "到" + currentSlot.EndPosition + "为" + formCellDistanceEnd);
if (formCellDistanceEnd.Y != 0)
{
continue;
}
//方块是相邻的(将终点设置到此方块)
if (Math.Abs(formCellDistanceEnd.X) == 1)
{
currentSlot.EndPosition = currentCell;
continue;
}
var formCellDistanceStart = currentCell - currentSlot.StartPosition;
LogCat.Log("更新水平:" + currentCell + "到终点" + currentSlot.StartPosition + "终点" +
currentSlot.StartPosition +
"为" + formCellDistanceEnd);
//方块是相邻的(将终点设置到此方块)
if (Math.Abs(formCellDistanceStart.X) == 1)
{
currentSlot.StartPosition = currentCell;
continue;
}
}
//如果不是临近方块,那么提交槽位
LogCat.Log("新方块" + currentCell + "与槽位" + currentSlot.StartPosition + "到" + currentSlot.EndPosition +
"不匹配。");
roomSlots.Add(currentSlot);
currentSlot = new RoomSlot();
currentSlot.StartPosition = currentCell;
currentSlot.EndPosition = currentCell;
}
//添加没有提交的值
roomSlots.Add(currentSlot);
return roomSlots.ToArray();
}
// public static RoomSlot[] GetRoomSlots(TileMap tileMap, string layerName)
// {
// var layer = GetTileMapLayer(tileMap, layerName);
// if (layer == -1)
// {
// return null;
// }
//
// var cells = tileMap.GetUsedCells(layer).OrderBy(c => c.Y).ThenBy(c => c.X).ToList();
// var roomSlots = new List<RoomSlot>();
// RoomSlot currentSlot = null;
//
// for (int i = 0; i < cells.Count - 1; i++)
// {
// var currentCell = cells[i];
// var nextCell = cells[i + 1];
//
// // Check if the current cell and the next cell are consecutive
// if ((currentCell.X == nextCell.X && Math.Abs(currentCell.Y - nextCell.Y) == 1) ||
// (currentCell.Y == nextCell.Y && Math.Abs(currentCell.X - nextCell.X) == 1))
// {
// if (currentSlot == null)
// {
// currentSlot = new RoomSlot { StartPosition = currentCell, EndPosition = nextCell };
// }
// else
// {
// currentSlot.EndPosition = nextCell;
// }
// }
// else
// {
// if (currentSlot != null)
// {
// roomSlots.Add(currentSlot);
// currentSlot = null;
// }
// }
// }
//
// // Add the last slot if it's not null
// if (currentSlot != null)
// {
// roomSlots.Add(currentSlot);
// }
// return roomSlots.ToArray();
// }
}