Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / ui / weaponRoulette / WeaponRoulettePanel.cs
@小李xl 小李xl on 7 Mar 2024 4 KB 武器轮盘制作中
using System.Collections.Generic;
using Godot;

namespace UI.WeaponRoulette;

/// <summary>
/// 武器轮盘
/// </summary>
public partial class WeaponRoulettePanel : WeaponRoulette
{
    /// <summary>
    /// 武器槽数量
    /// </summary>
    public const int SlotCount = 6;
    
    /// <summary>
    /// 选中的武器
    /// </summary>
    public Weapon ActiveWeapon;    
    
    //是否展开轮盘
    private bool _pressRouletteFlag = false;
    private bool _isMagnifyRoulette = false;
    //所有武器插槽
    private List<WeaponSlotNode> _slotNodes = new List<WeaponSlotNode>();


    public override void OnCreateUi()
    {
        S_RouletteBg.Instance.Visible = false;
        S_Bg.Instance.Visible = false;

        //创建武器插槽
        for (var i = 0; i < SlotCount; i++)
        {
            var angle = i * (360f / SlotCount);
            var clone = S_WeaponSlotNode.CloneAndPut();
            var collisionPolygon2D = clone.L_SlotAreaNode.L_CollisionPolygon2D.Instance;
            var sectorPolygon = Utils.CreateSectorPolygon(0, 100, 360f / SlotCount, 4);
            collisionPolygon2D.Polygon = sectorPolygon;
            clone.Instance.RotationDegrees = angle;
            clone.L_Control.Instance.RotationDegrees = -angle;
            clone.L_Control.L_WeaponIcon.Instance.Material = (Material)S_WeaponSlotNode.L_Control.L_WeaponIcon.Instance.Material.Duplicate();
            _slotNodes.Add(clone);
        }
        
        S_WeaponSlotNode.QueueFree();

        SetEnableSectorCollision(false);
    }

    public override void OnDestroyUi()
    {
        
    }

    public override void Process(float delta)
    {
        if (!InputManager.Roulette)
        {
            _pressRouletteFlag = false;
        }

        //按下地图按键
        if (InputManager.Roulette && !_isMagnifyRoulette) //打开轮盘
        {
            if (UiManager.GetUiInstanceCount(UiManager.UiNames.PauseMenu) == 0)
            {
                ExpandRoulette();
            }
        }
        else if (!InputManager.Roulette && _isMagnifyRoulette) //关闭轮盘
        {
            ShrinkRoulette();
        }

        //已经打开地图
        if (InputManager.Roulette)
        {
            S_MouseArea.Instance.GlobalPosition = GetGlobalMousePosition();
        }
        else
        {
            ActiveWeapon = null;
        }
    }
    
    private void ExpandRoulette()
    {
        World.Current.Pause = true;
        _pressRouletteFlag = true;
        _isMagnifyRoulette = true;
        
        S_RouletteBg.Instance.Visible = true;
        S_Bg.Instance.Visible = true;
        SetEnableSectorCollision(true);
        RefreshWeapon();
    }
    
    private void ShrinkRoulette()
    {
        S_RouletteBg.Instance.Visible = false;
        S_Bg.Instance.Visible = false;
        
        _isMagnifyRoulette = false;
        World.Current.Pause = false;
        SetEnableSectorCollision(false);

        //如果选中了物体
        if (ActiveWeapon != null)
        {
            Player.Current.ExchangeWeaponByIndex(ActiveWeapon.PackageIndex);
        }
    }
    
    //设置是否启用扇形碰撞检测
    private void SetEnableSectorCollision(bool enable)
    {
        S_MouseArea.Instance.Monitorable = enable;
        foreach (var weaponSlotNode in _slotNodes)
        {
            weaponSlotNode.L_SlotAreaNode.Instance.Monitorable = enable;
        }
    }
    
    //更新显示的武器
    private void RefreshWeapon()
    {
        var current = Player.Current;
        if (current == null)
        {
            foreach (var slotNode in _slotNodes)
            {
                slotNode.L_Control.Instance.Visible = false;
            }

            return;
        }

        var weapons = current.WeaponPack.ItemSlot;
        for (var i = 0; i < _slotNodes.Count; i++)
        {
            var slotNode = _slotNodes[i];
            slotNode.L_Control.Instance.Visible = true;
            if (weapons.Length > i)
            {
                var weapon = weapons[i];
                if (weapon != null)
                {
                    slotNode.L_Control.Instance.Visible = true;
                    slotNode.L_Control.L_WeaponIcon.Instance.Texture = weapon.GetDefaultTexture();
                    slotNode.L_Control.L_AmmoLabel.Instance.Text = 
                        (weapon.CurrAmmo + weapon.ResidueAmmo).ToString() + "/" + weapon.Attribute.MaxAmmoCapacity;
                    slotNode.Instance.SetWeapon(weapon);
                }
                else
                {
                    slotNode.L_Control.Instance.Visible = false;
                    slotNode.Instance.ClearWeapon();
                }
            }
            else
            {
                slotNode.L_Control.Instance.Visible = false;
                slotNode.Instance.ClearWeapon();
            }
        }
    }
}