2024-04-28 13:55:19 +00:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
2024-07-26 14:38:18 +00:00
|
|
|
|
using System.Linq;
|
2024-08-25 10:49:48 +00:00
|
|
|
|
using ColdMint.scripts.character;
|
2024-04-28 13:55:19 +00:00
|
|
|
|
using ColdMint.scripts.debug;
|
|
|
|
|
using ColdMint.scripts.map.dateBean;
|
|
|
|
|
using ColdMint.scripts.utils;
|
|
|
|
|
using Godot;
|
|
|
|
|
|
|
|
|
|
namespace ColdMint.scripts.map.room;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// <para>Room</para>
|
|
|
|
|
/// <para>房间模板</para>
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <remarks>
|
|
|
|
|
///<para>The room template is like a jigsaw puzzle and participates in the map building process.</para>
|
|
|
|
|
///<para>房间模板就像一个拼图,参与到地图的构建过程中。</para>
|
|
|
|
|
/// </remarks>
|
2024-05-20 14:38:41 +00:00
|
|
|
|
public class Room
|
2024-04-28 13:55:19 +00:00
|
|
|
|
{
|
2024-05-08 10:22:04 +00:00
|
|
|
|
private Node2D? _rootNode;
|
|
|
|
|
private RoomSlot?[]? _roomSlots;
|
2024-07-26 14:38:18 +00:00
|
|
|
|
private List<TileMapLayer>? _tileMapLayers;
|
|
|
|
|
|
2024-05-25 16:02:00 +00:00
|
|
|
|
private Area2D? _area2D;
|
2024-08-24 14:49:59 +00:00
|
|
|
|
private PointLight2D? _pointLight2D;
|
2024-05-25 16:02:00 +00:00
|
|
|
|
private CollisionShape2D? _collisionShape2D;
|
2024-08-25 10:49:48 +00:00
|
|
|
|
private bool _hasPlayer;
|
|
|
|
|
private readonly List<CharacterTemplate> _characterTemplateList = [];
|
2024-05-25 16:02:00 +00:00
|
|
|
|
|
2024-06-02 13:48:38 +00:00
|
|
|
|
public string? EnterRoomEventHandlerId { get; set; }
|
|
|
|
|
|
|
|
|
|
public string? ExitRoomEventHandlerId { get; set; }
|
|
|
|
|
|
2024-07-26 14:38:18 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// <para>Get the corresponding tile layer node based on the tile name</para>
|
|
|
|
|
/// <para>根据瓦片名称获取对应的瓦片图层节点</para>
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="layerName">
|
|
|
|
|
///<para>We recommend using the constants defined in <see cref="Config.TileMapLayerName"/>.</para>
|
|
|
|
|
///<para>建议使用<see cref="Config.TileMapLayerName"/>内定义的常量。</para>
|
|
|
|
|
/// </param>
|
|
|
|
|
/// <returns>
|
|
|
|
|
/// <para>Return a Layer node with the same name if it is found, otherwise null.</para>
|
|
|
|
|
///<para>如果找到了与其名称相同的Layer节点则返回它,否则返回null。</para>
|
|
|
|
|
/// </returns>
|
|
|
|
|
public TileMapLayer? GetTileMapLayer(string layerName)
|
|
|
|
|
{
|
|
|
|
|
return _tileMapLayers?.FirstOrDefault(tileMapLayer => tileMapLayer.Name == layerName);
|
|
|
|
|
}
|
|
|
|
|
|
2024-10-08 02:52:42 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// <para>Places a barrier in a slot where a match has been found.</para>
|
|
|
|
|
/// <para>在找到匹配的槽位放置屏障。</para>
|
|
|
|
|
/// </summary>
|
|
|
|
|
private void PlaceBarrierInMatchedSlot()
|
|
|
|
|
{
|
|
|
|
|
ProcessRoomSlots(action: (roomSlot, ground, barrier, i) =>
|
|
|
|
|
{
|
|
|
|
|
if (!roomSlot.Matched)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
var cellSourceId = barrier.GetCellSourceId(i);
|
|
|
|
|
if (cellSourceId == -1)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ground.SetCell(i, cellSourceId, barrier.GetCellAtlasCoords(i), barrier.GetCellAlternativeTile(i));
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// <para>Clear the barrier that finds a matching slot</para>
|
|
|
|
|
/// <para>清空找到匹配的槽位的屏障。</para>
|
|
|
|
|
/// </summary>
|
|
|
|
|
private void ClearBarriersInMatchedSlots()
|
|
|
|
|
{
|
|
|
|
|
ProcessRoomSlots(action: (roomSlot, ground, barrier, i) =>
|
|
|
|
|
{
|
|
|
|
|
if (!roomSlot.Matched)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
var cellSourceId = barrier.GetCellSourceId(i);
|
|
|
|
|
if (cellSourceId == -1)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ground.SetCell(i, cellSourceId, barrier.GetCellAtlasCoords(i), barrier.GetCellAlternativeTile(i));
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// <para>Places barriers in slots that do not have a match.</para>
|
|
|
|
|
/// <para>在未匹配的槽位放置屏障。</para>
|
|
|
|
|
/// </summary>
|
|
|
|
|
public void PlaceBarrierInUnmatchedSlots()
|
|
|
|
|
{
|
|
|
|
|
ProcessRoomSlots(action: (roomSlot, ground, barrier, i) =>
|
|
|
|
|
{
|
|
|
|
|
if (roomSlot.Matched)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
var cellSourceId = barrier.GetCellSourceId(i);
|
|
|
|
|
if (cellSourceId == -1)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ground.SetCell(i, cellSourceId, barrier.GetCellAtlasCoords(i), barrier.GetCellAlternativeTile(i));
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// <para>Executes a callback for each room slot, providing the corresponding coordinates in the barrier and ground layers.</para>
|
|
|
|
|
/// <para>对每个房间槽位执行回调,提供barrier层和ground层对应的坐标。</para>
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="action">
|
|
|
|
|
///<para>The callback action to be executed, which takes the barrier layer, ground layer, and coordinates as parameters.</para>
|
|
|
|
|
///<para>要执行的回调操作,它以屏障层、底层和坐标作为参数。</para>
|
|
|
|
|
/// </param>
|
|
|
|
|
private void ProcessRoomSlots(Action<RoomSlot, TileMapLayer, TileMapLayer, Vector2I> action)
|
|
|
|
|
{
|
|
|
|
|
var ground = GetTileMapLayer(Config.TileMapLayerName.Ground);
|
|
|
|
|
var barrier = GetTileMapLayer(Config.TileMapLayerName.Barrier);
|
|
|
|
|
if (ground == null || barrier == null)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (RoomSlots == null || RoomSlots.Length == 0)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
foreach (var roomSlot in RoomSlots)
|
|
|
|
|
{
|
|
|
|
|
if (roomSlot == null)
|
|
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//Place the corresponding coordinate tiles of the barrier layer on the ground level.
|
|
|
|
|
//将屏障层的对应坐标瓦片放到地面层。
|
|
|
|
|
CoordinateUtils.ForEachCell(roomSlot.StartPosition, roomSlot.EndPosition, i =>
|
|
|
|
|
{
|
|
|
|
|
action.Invoke(roomSlot, ground, barrier, i);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
barrier.QueueFree();
|
|
|
|
|
}
|
|
|
|
|
|
2024-08-25 10:49:48 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// <para>ShowAllCharacterTemplate</para>
|
|
|
|
|
/// <para>显示所有角色模板</para>
|
|
|
|
|
/// </summary>
|
|
|
|
|
private void ShowAllCharacterTemplate()
|
|
|
|
|
{
|
|
|
|
|
LogCat.LogWithFormat("show_all_node", LogCat.LogLabel.Room, LogCat.UploadFormat,
|
|
|
|
|
_characterTemplateList.Count);
|
|
|
|
|
foreach (var characterTemplate in _characterTemplateList)
|
|
|
|
|
{
|
|
|
|
|
characterTemplate.Show();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// <para>HideAllCharacterTemplate</para>
|
|
|
|
|
/// <para>隐藏所有角色模板</para>
|
|
|
|
|
/// </summary>
|
|
|
|
|
private void HideAllCharacterTemplate()
|
|
|
|
|
{
|
|
|
|
|
LogCat.LogWithFormat("hide_all_node", LogCat.LogLabel.Room, LogCat.UploadFormat,
|
|
|
|
|
_characterTemplateList.Count);
|
|
|
|
|
foreach (var characterTemplate in _characterTemplateList)
|
|
|
|
|
{
|
|
|
|
|
characterTemplate.Hide();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-06-02 13:48:38 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// <para>When a node enters the room</para>
|
|
|
|
|
/// <para>当有节点进入房间时</para>
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="node"></param>
|
|
|
|
|
private void OnEnterRoom(Node node)
|
|
|
|
|
{
|
|
|
|
|
if (_rootNode != null)
|
|
|
|
|
{
|
2024-07-26 14:38:18 +00:00
|
|
|
|
LogCat.LogWithFormat("enter_the_room_debug", LogCat.LogLabel.Default, LogCat.UploadFormat, node.Name,
|
|
|
|
|
_rootNode.Name);
|
2024-06-02 13:48:38 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-08-25 10:49:48 +00:00
|
|
|
|
if (node is Player player)
|
2024-08-24 14:49:59 +00:00
|
|
|
|
{
|
2024-08-25 10:49:48 +00:00
|
|
|
|
_characterTemplateList.Add(player);
|
|
|
|
|
_hasPlayer = true;
|
2024-08-24 14:49:59 +00:00
|
|
|
|
//The player enters the room, opening up their view.
|
|
|
|
|
//玩家进入了房间,开放视野。
|
2024-08-25 10:49:48 +00:00
|
|
|
|
if (_pointLight2D != null)
|
|
|
|
|
{
|
|
|
|
|
_pointLight2D.Show();
|
|
|
|
|
_pointLight2D.Texture = AssetHolder.White100;
|
|
|
|
|
}
|
|
|
|
|
|
2024-09-08 01:45:14 +00:00
|
|
|
|
GameSceneDepend.MiniMap?.ShowRoomPreview(this);
|
2024-08-25 10:49:48 +00:00
|
|
|
|
ShowAllCharacterTemplate();
|
2024-09-08 01:45:14 +00:00
|
|
|
|
}
|
|
|
|
|
else if (node is CharacterTemplate characterTemplate)
|
2024-08-25 10:49:48 +00:00
|
|
|
|
{
|
|
|
|
|
if (_hasPlayer)
|
|
|
|
|
{
|
|
|
|
|
characterTemplate.Show();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
characterTemplate.Hide();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_characterTemplateList.Add(characterTemplate);
|
2024-08-24 14:49:59 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-06-02 13:48:38 +00:00
|
|
|
|
if (string.IsNullOrEmpty(EnterRoomEventHandlerId))
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var enterRoomEventHandler = RoomEventManager.GetEnterRoomEventHandler(EnterRoomEventHandlerId);
|
|
|
|
|
enterRoomEventHandler?.OnEnterRoom(node, this);
|
|
|
|
|
}
|
|
|
|
|
|
2024-08-24 14:49:59 +00:00
|
|
|
|
|
2024-06-02 13:48:38 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// <para>When a node exits the room</para>
|
|
|
|
|
/// <para>当有节点退出房间时</para>
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="node"></param>
|
|
|
|
|
private void OnExitRoom(Node node)
|
|
|
|
|
{
|
|
|
|
|
if (_rootNode != null)
|
|
|
|
|
{
|
2024-07-26 14:38:18 +00:00
|
|
|
|
LogCat.LogWithFormat("exit_the_room_debug", LogCat.LogLabel.Default, LogCat.UploadFormat, node.Name,
|
|
|
|
|
_rootNode.Name);
|
2024-06-02 13:48:38 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-08-25 10:49:48 +00:00
|
|
|
|
|
|
|
|
|
if (node is Player player)
|
2024-08-24 14:49:59 +00:00
|
|
|
|
{
|
2024-08-25 10:49:48 +00:00
|
|
|
|
//The player leaves the room, hiding the view.
|
|
|
|
|
//玩家离开了房间,隐藏视野。
|
|
|
|
|
_characterTemplateList.Remove(player);
|
|
|
|
|
_hasPlayer = false;
|
|
|
|
|
if (_pointLight2D != null)
|
|
|
|
|
{
|
|
|
|
|
_pointLight2D.Show();
|
|
|
|
|
_pointLight2D.Texture = AssetHolder.White25;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
HideAllCharacterTemplate();
|
|
|
|
|
}
|
|
|
|
|
else if (node is CharacterTemplate characterTemplate && characterTemplate.Visible)
|
|
|
|
|
{
|
|
|
|
|
_characterTemplateList.Remove(characterTemplate);
|
2024-08-24 14:49:59 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-06-02 13:48:38 +00:00
|
|
|
|
if (string.IsNullOrEmpty(ExitRoomEventHandlerId))
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var exitRoomEventHandler = RoomEventManager.GetExitRoomEventHandler(ExitRoomEventHandlerId);
|
|
|
|
|
exitRoomEventHandler?.OnExitRoom(node, this);
|
|
|
|
|
}
|
|
|
|
|
|
2024-05-25 16:02:00 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// <para>The collision shape of the room</para>
|
|
|
|
|
/// <para>房间的碰撞形状</para>
|
|
|
|
|
/// </summary>
|
|
|
|
|
public CollisionShape2D? RoomCollisionShape2D
|
|
|
|
|
{
|
|
|
|
|
get => _collisionShape2D;
|
|
|
|
|
set => _collisionShape2D = value;
|
|
|
|
|
}
|
2024-06-02 13:48:38 +00:00
|
|
|
|
|
2024-05-25 16:02:00 +00:00
|
|
|
|
public Area2D? Area2D
|
|
|
|
|
{
|
|
|
|
|
get => _area2D;
|
|
|
|
|
set => _area2D = value;
|
|
|
|
|
}
|
2024-04-28 13:55:19 +00:00
|
|
|
|
|
2024-05-08 10:22:04 +00:00
|
|
|
|
public PackedScene? RoomScene
|
2024-04-28 13:55:19 +00:00
|
|
|
|
{
|
|
|
|
|
get => default;
|
|
|
|
|
set => AnalyzeRoomData(value);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// <para>Analyze the data of the room</para>
|
|
|
|
|
/// <para>解析房间的数据</para>
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="packedScene"></param>
|
2024-05-08 10:22:04 +00:00
|
|
|
|
private void AnalyzeRoomData(PackedScene? packedScene)
|
2024-04-28 13:55:19 +00:00
|
|
|
|
{
|
2024-06-10 13:05:18 +00:00
|
|
|
|
if (packedScene == null)
|
2024-04-28 13:55:19 +00:00
|
|
|
|
{
|
2024-06-10 13:05:18 +00:00
|
|
|
|
return;
|
|
|
|
|
}
|
2024-07-02 15:16:04 +00:00
|
|
|
|
|
2024-06-10 13:05:18 +00:00
|
|
|
|
var node2D = NodeUtils.InstantiatePackedScene<Node2D>(packedScene);
|
|
|
|
|
if (node2D == null)
|
|
|
|
|
{
|
|
|
|
|
//The room node is not of Node2D type. An exception is thrown
|
2024-04-28 13:55:19 +00:00
|
|
|
|
//房间节点不是Node2D类型,抛出异常
|
|
|
|
|
LogCat.LogError("room_root_node_must_be_node2d");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_rootNode = node2D;
|
2024-07-26 14:38:18 +00:00
|
|
|
|
var tileMapNode = node2D.GetNode<Node2D>("TileMap");
|
|
|
|
|
NodeUtils.ForEachNode<TileMapLayer>(tileMapNode, node =>
|
|
|
|
|
{
|
|
|
|
|
_tileMapLayers ??= [];
|
|
|
|
|
_tileMapLayers.Add(node);
|
|
|
|
|
return false;
|
|
|
|
|
});
|
2024-05-25 16:02:00 +00:00
|
|
|
|
_area2D = node2D.GetNode<Area2D>("RoomArea");
|
2024-06-02 13:48:38 +00:00
|
|
|
|
_area2D.Monitoring = true;
|
|
|
|
|
_area2D.SetCollisionLayerValue(Config.LayerNumber.RoomArea, true);
|
|
|
|
|
//Sets the collision layer that can be detected in the current room area.
|
|
|
|
|
//设置当前房间区域可检测到的碰撞层。
|
|
|
|
|
_area2D.SetCollisionMaskValue(Config.LayerNumber.Player, true);
|
2024-08-25 10:49:48 +00:00
|
|
|
|
_area2D.SetCollisionMaskValue(Config.LayerNumber.Mob, true);
|
2024-06-02 13:48:38 +00:00
|
|
|
|
_area2D.BodyExited += OnExitRoom;
|
|
|
|
|
_area2D.BodyEntered += OnEnterRoom;
|
2024-05-25 16:02:00 +00:00
|
|
|
|
_collisionShape2D = _area2D.GetChild<CollisionShape2D>(0);
|
2024-07-26 14:38:18 +00:00
|
|
|
|
_roomSlots = GetRoomSlots(GetTileMapLayer(Config.TileMapLayerName.Ground), _area2D,
|
2024-04-28 13:55:19 +00:00
|
|
|
|
node2D.GetNode<Node2D>("RoomSlotList"));
|
2024-08-24 14:49:59 +00:00
|
|
|
|
_pointLight2D = node2D.GetNodeOrNull<PointLight2D>("PointLight2D");
|
2024-08-25 10:49:48 +00:00
|
|
|
|
if (_pointLight2D != null)
|
|
|
|
|
{
|
|
|
|
|
_pointLight2D.BlendMode = Light2D.BlendModeEnum.Mix;
|
|
|
|
|
}
|
2024-04-28 13:55:19 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-05-08 10:22:04 +00:00
|
|
|
|
public Node2D? RootNode => _rootNode;
|
2024-04-28 13:55:19 +00:00
|
|
|
|
|
2024-05-08 10:22:04 +00:00
|
|
|
|
public RoomSlot?[]? RoomSlots => _roomSlots;
|
2024-04-28 13:55:19 +00:00
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// <para>GetRoomSlots</para>
|
|
|
|
|
/// <para>在房间内获取所有插槽</para>
|
|
|
|
|
/// </summary>
|
2024-07-26 14:38:18 +00:00
|
|
|
|
/// <param name="tileMapLayer"></param>
|
2024-05-08 10:22:04 +00:00
|
|
|
|
/// <param name="roomArea2D"></param>
|
2024-04-28 13:55:19 +00:00
|
|
|
|
/// <param name="slotList"></param>
|
|
|
|
|
/// <returns></returns>
|
2024-07-26 14:38:18 +00:00
|
|
|
|
private RoomSlot?[]? GetRoomSlots(TileMapLayer? tileMapLayer, Area2D roomArea2D, Node2D slotList)
|
2024-04-28 13:55:19 +00:00
|
|
|
|
{
|
2024-07-26 14:38:18 +00:00
|
|
|
|
if (tileMapLayer == null)
|
2024-05-08 10:22:04 +00:00
|
|
|
|
{
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
2024-04-28 13:55:19 +00:00
|
|
|
|
var slotCount = slotList.GetChildCount();
|
|
|
|
|
if (slotCount == 0)
|
|
|
|
|
{
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
2024-05-24 14:58:52 +00:00
|
|
|
|
//We calculate the midpoint of the room
|
|
|
|
|
//我们计算房间的中点
|
2024-04-28 13:55:19 +00:00
|
|
|
|
var roomAreaCollisionShape2D = roomArea2D.GetChild<CollisionShape2D>(0);
|
|
|
|
|
var roomAreaRect2 = roomAreaCollisionShape2D.Shape.GetRect();
|
|
|
|
|
var midpoint = roomAreaCollisionShape2D.Position + roomAreaRect2.Position + roomAreaRect2.Size / 2;
|
|
|
|
|
var roomSlots = new List<RoomSlot>();
|
2024-05-22 14:39:41 +00:00
|
|
|
|
for (var i = 0; i < slotCount; i++)
|
2024-04-28 13:55:19 +00:00
|
|
|
|
{
|
2024-05-24 14:58:52 +00:00
|
|
|
|
//Got the object in the room slot
|
|
|
|
|
//拿到了房间槽对象
|
2024-04-28 13:55:19 +00:00
|
|
|
|
var area2D = slotList.GetChild<Area2D>(i);
|
2024-05-25 16:02:00 +00:00
|
|
|
|
//Prevent other areas from detecting the room slot
|
|
|
|
|
//禁止其他区域检测到房间槽
|
|
|
|
|
area2D.Monitorable = false;
|
2024-06-02 13:48:38 +00:00
|
|
|
|
|
2024-04-28 13:55:19 +00:00
|
|
|
|
var collisionShape2D = area2D.GetChild<CollisionShape2D>(0);
|
|
|
|
|
var rect2 = collisionShape2D.Shape.GetRect();
|
2024-05-24 14:58:52 +00:00
|
|
|
|
//Round the size of the impactor to the tile size For example, the impactor size 44 is converted to the tile size 44/32=1.375 rounded to 1
|
2024-04-28 13:55:19 +00:00
|
|
|
|
//将碰撞体的尺寸四舍五入到瓦片尺寸例如:碰撞体尺寸44,转为瓦片尺寸为 44/32=1.375 四舍五入为1
|
|
|
|
|
var intSize = new Vector2I((int)Math.Round(rect2.Size.X / Config.CellSize),
|
|
|
|
|
(int)Math.Round(rect2.Size.Y / Config.CellSize));
|
|
|
|
|
if (intSize.X > 1 && intSize.Y > 1)
|
|
|
|
|
{
|
|
|
|
|
LogCat.LogError("width_or_height_of_room_slot_must_be_1");
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
2024-05-24 14:58:52 +00:00
|
|
|
|
//Gets the absolute position of the slot
|
2024-04-28 13:55:19 +00:00
|
|
|
|
//获取槽位的绝对位置
|
|
|
|
|
var startPosition = area2D.Position + collisionShape2D.Position + rect2.Position;
|
|
|
|
|
var endPosition = area2D.Position + collisionShape2D.Position + rect2.Position + rect2.Size;
|
|
|
|
|
var midpointOfRoomSlots = area2D.Position + collisionShape2D.Position + rect2.Position + rect2.Size / 2;
|
2024-05-24 14:58:52 +00:00
|
|
|
|
//Convert to tile map coordinates (midpoint)
|
2024-04-28 13:55:19 +00:00
|
|
|
|
//转为瓦片地图的坐标(中点)
|
2024-07-26 14:38:18 +00:00
|
|
|
|
var tileMapStartPosition = tileMapLayer.LocalToMap(startPosition);
|
|
|
|
|
var tileMapEndPosition = tileMapLayer.LocalToMap(endPosition);
|
2024-05-22 14:39:41 +00:00
|
|
|
|
var roomSlot = new RoomSlot
|
|
|
|
|
{
|
|
|
|
|
EndPosition = tileMapEndPosition,
|
|
|
|
|
StartPosition = tileMapStartPosition,
|
2024-05-24 14:58:52 +00:00
|
|
|
|
//Calculate the orientation of the slot (the midpoint of the room is the origin, the vector pointing to the midpoint of the slot)
|
2024-05-22 14:39:41 +00:00
|
|
|
|
//计算槽位的方向(房间中点为原点,指向槽位中点的向量)
|
|
|
|
|
DistanceToMidpointOfRoom = CoordinateUtils.VectorToOrientationArray(midpoint, midpointOfRoomSlots)
|
|
|
|
|
};
|
2024-04-28 13:55:19 +00:00
|
|
|
|
roomSlots.Add(roomSlot);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return roomSlots.ToArray();
|
|
|
|
|
}
|
|
|
|
|
}
|