Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / ui / roomMap / RoomMapPanel.cs
@小李xl 小李xl on 1 Dec 2023 6 KB 小地图显示过道完成
using System.Linq;
using Godot;

namespace UI.RoomMap;

public partial class RoomMapPanel : RoomMap
{

    public override void OnCreateUi()
    {
        DrawRoom();
    }

    public override void OnDestroyUi()
    {
    }

    public override void Process(float delta)
    {
        // //按下地图按键
        // if (InputManager.Map && !S_RoomMap.Instance.IsOpen)
        // {
        //     World.Current.Pause = true;
        //     S_RoomMap.Instance.ShowUi();
        // }
        // else if (!InputManager.Map && S_RoomMap.Instance.IsOpen)
        // {
        //     S_RoomMap.Instance.HideUi();
        //     World.Current.Pause = false;
        // }
        
        S_Root.Instance.Position = S_DrawContainer.Instance.Size / 2 - Player.Current.Position / 16 * S_Root.Instance.Scale;
    }
    
    private void DrawRoom()
    {
        var startRoom = GameApplication.Instance.DungeonManager.StartRoomInfo;
        startRoom.EachRoom(roomInfo =>
        {
            //房间区域
            var sprite = new Sprite2D();
            sprite.Centered = false;
            sprite.Texture = roomInfo.PreviewTexture;
            sprite.Position = roomInfo.Position;
            var material = ResourceManager.Load<ShaderMaterial>(ResourcePath.resource_material_Outline2_tres);
            material.SetShaderParameter("outline_color", new Color(1, 1, 1, 0.9f));
            material.SetShaderParameter("scale", 0.5f);
            sprite.Material = material;
            S_Root.AddChild(sprite);
            
            //过道
            if (roomInfo.Doors != null)
            {
                foreach (var doorInfo in roomInfo.Doors)
                {
                    if (doorInfo.IsForward)
                    {
                        var aisleSprite = new Sprite2D();
                        aisleSprite.Centered = false;
                        aisleSprite.Texture = doorInfo.AislePreviewTexture;
                        //调整过道预览位置
                        
                        if (!doorInfo.HasCross) //不含交叉点
                        {
                            if (doorInfo.Direction == DoorDirection.N)
                            {
                                aisleSprite.Position = doorInfo.OriginPosition - new Vector2I(0, doorInfo.AislePreviewTexture.GetHeight() - 1);
                            }
                            else if (doorInfo.Direction == DoorDirection.S)
                            {
                                aisleSprite.Position = doorInfo.OriginPosition - new Vector2I(0, 1);
                            }
                            else if (doorInfo.Direction == DoorDirection.E)
                            {
                                aisleSprite.Position = doorInfo.OriginPosition - new Vector2I(1, 0);
                            }
                            else if (doorInfo.Direction == DoorDirection.W)
                            {
                                aisleSprite.Position = doorInfo.OriginPosition - new Vector2I(doorInfo.AislePreviewTexture.GetWidth() - 1, 0);
                            }
                        }
                        else //包含交叉点
                        {
                            if (doorInfo.Direction == DoorDirection.S)
                            {
                                if (doorInfo.ConnectDoor.Direction == DoorDirection.E)
                                {
                                    aisleSprite.Position = doorInfo.OriginPosition - new Vector2I(doorInfo.AislePreviewTexture.GetWidth() - 4, 1);
                                }
                                else if (doorInfo.ConnectDoor.Direction == DoorDirection.W)
                                {
                                    aisleSprite.Position = doorInfo.OriginPosition - new Vector2I(0, 1);
                                }
                                else
                                {
                                    aisleSprite.Position = doorInfo.OriginPosition;
                                }
                            }
                            else if (doorInfo.Direction == DoorDirection.N)
                            {
                                if (doorInfo.ConnectDoor.Direction == DoorDirection.W)
                                {
                                    aisleSprite.Position = doorInfo.OriginPosition - new Vector2I(0, doorInfo.AislePreviewTexture.GetHeight() - 1);
                                }
                                else
                                {
                                    aisleSprite.Position = doorInfo.OriginPosition;
                                }
                            }
                            else if (doorInfo.Direction == DoorDirection.W)
                            {
                                if (doorInfo.ConnectDoor.Direction == DoorDirection.N)
                                {
                                    aisleSprite.Position = doorInfo.OriginPosition - new Vector2I(doorInfo.AislePreviewTexture.GetWidth() - 1, 0);
                                }
                                else
                                {
                                    aisleSprite.Position = doorInfo.OriginPosition;
                                }
                            }
                            else if (doorInfo.Direction == DoorDirection.E)
                            {
                                if (doorInfo.ConnectDoor.Direction == DoorDirection.S)
                                {
                                    aisleSprite.Position = doorInfo.OriginPosition - new Vector2I(1, doorInfo.AislePreviewTexture.GetHeight() - 4);
                                }
                                else if (doorInfo.ConnectDoor.Direction == DoorDirection.N)
                                {
                                    aisleSprite.Position = doorInfo.OriginPosition - new Vector2I(1, 0);
                                }
                                else
                                {
                                    aisleSprite.Position = doorInfo.OriginPosition;
                                }
                            }
                        }

                        var aisleSpriteMaterial = ResourceManager.Load<ShaderMaterial>(ResourcePath.resource_material_Outline2_tres);
                        aisleSpriteMaterial.SetShaderParameter("outline_color", new Color(1, 1, 1, 0.9f));
                        aisleSpriteMaterial.SetShaderParameter("scale", 0.5f);
                        aisleSprite.Material = aisleSpriteMaterial;
                        S_Root.AddChild(aisleSprite);
                    }
                }
            }
        });

    }
}