Files
aibis-dream/Assets/Scripts/MiniGame/BlockPuzzle/Interface/IBlockShape.cs
T
2026-01-22 18:16:11 +08:00

124 lines
3.2 KiB
C#

using UnityEngine;
namespace AibisDream
{
/// <summary>
/// 形状旋转角度
/// </summary>
public enum RotationAngle
{
Rotate0 = 0, // 0度
Rotate90 = 90, // 90度
Rotate180 = 180, // 180度
Rotate270 = 270 // 270度
}
/// <summary>
/// 形状块接口
/// 负责管理形状的数据和操作
/// </summary>
public interface IBlockShape
{
/// <summary>
/// 形状的唯一ID
/// </summary>
int ShapeId { get; }
/// <summary>
/// 形状名称
/// </summary>
string ShapeName { get; }
/// <summary>
/// 当前旋转角度
/// </summary>
RotationAngle CurrentRotation { get; }
/// <summary>
/// 获取当前形状的宽度(考虑旋转)
/// </summary>
int Width { get; }
/// <summary>
/// 获取当前形状的高度(考虑旋转)
/// </summary>
int Height { get; }
/// <summary>
/// 获取形状占用的格子数量
/// </summary>
int BlockCount { get; }
/// <summary>
/// 获取形状拖拽器
/// </summary>
ShapeDragger ShapeDragger { get; }
/// <summary>
/// 获取原始形状模式(未旋转)
/// </summary>
/// <returns>二维数组,1表示有格子,0表示空</returns>
int[,] GetOriginalPattern();
/// <summary>
/// 获取当前形状模式(考虑旋转)
/// </summary>
/// <returns>二维数组,1表示有格子,0表示空</returns>
int[,] GetCurrentPattern();
/// <summary>
/// 旋转形状
/// </summary>
/// <param name="angle">旋转角度</param>
void Rotate(RotationAngle angle);
/// <summary>
/// 顺时针旋转90度
/// </summary>
void RotateClockwise();
/// <summary>
/// 逆时针旋转90度
/// </summary>
void RotateCounterClockwise();
/// <summary>
/// 重置旋转角度为0
/// </summary>
void ResetRotation();
/// <summary>
/// 检查指定位置是否有格子
/// </summary>
/// <param name="x">形状内的X坐标(相对坐标)</param>
/// <param name="y">形状内的Y坐标(相对坐标)</param>
/// <returns>是否有格子</returns>
bool HasBlockAt(int x, int y);
/// <summary>
/// 获取形状的所有格子位置(相对坐标)
/// </summary>
/// <returns>格子位置列表</returns>
Vector2Int[] GetBlockPositions();
/// <summary>
/// 获取形状旋转后的轴向
/// </summary>
/// <returns>旋转后的轴向</returns>
Vector2Int GetAxis();
/// <summary>
/// 获取形状的中心位置
/// </summary>
/// <returns>中心位置</returns>
Vector3 GetCenterPosition();
/// <summary>
/// 获取形状的全局中心位置
/// </summary>
/// <returns>全局中心位置</returns>
Vector3 GetGlobalCenterPosition();
}
}