using Godot; /// <summary> /// 房间中的ui /// </summary> public partial class RoomUI : Control { //public static RoomUI Current { get; private set; } /// <summary> /// 当前血量 /// </summary> public int Hp { get; private set; } /// <summary> /// 最大血量 /// </summary> public int MaxHp { get; private set; } /// <summary> /// 当前护盾值 /// </summary> public int Shield { get; private set; } /// <summary> /// 最大护盾值 /// </summary> public int MaxShield { get; private set; } /// <summary> /// 互动提示组件 /// </summary> public InteractiveTipBar InteractiveTipBar { get; private set; } /// <summary> /// 换弹进度组件 /// </summary> public ReloadBar ReloadBar { get; private set; } private NinePatchRect hpSlot; private NinePatchRect shieldSlot; private TextureRect hpBar; private TextureRect shieldBar; private Label bulletText; private TextureRect gunSprite; public override void _EnterTree() { hpSlot = GetNode<NinePatchRect>("Control/HealthBar/HpSlot"); shieldSlot = GetNode<NinePatchRect>("Control/HealthBar/ShieldSlot"); hpBar = GetNode<TextureRect>("Control/HealthBar/HpSlot/HpBar"); shieldBar = GetNode<TextureRect>("Control/HealthBar/ShieldSlot/ShieldBar"); bulletText = GetNode<Label>("Control/GunBar/BulletText"); gunSprite = GetNode<TextureRect>("Control/GunBar/GunSprite"); InteractiveTipBar = GetNode<InteractiveTipBar>("ViewNode/InteractiveTipBar"); InteractiveTipBar.Visible = false; ReloadBar = GetNode<ReloadBar>("ViewNode/ReloadBar"); ReloadBar.Visible = false; } public override void _Ready() { //将 GlobalNode 节点下的 ui 节点放入全局坐标中 var globalNode = GetNode("GlobalNode"); var root = GameApplication.Instance.GlobalNodeRoot; var count = globalNode.GetChildCount(); for (int i = count - 1; i >= 0; i--) { var node = globalNode.GetChild(i); globalNode.RemoveChild(node); root.CallDeferred("add_child", node); } globalNode.CallDeferred("queue_free"); //将 ViewNode 节点放到 SubViewport 下 var viewNode = GetNode("ViewNode"); var viewport = GameApplication.Instance.SubViewport; count = viewNode.GetChildCount(); for (int i = count - 1; i >= 0; i--) { var node = viewNode.GetChild(i); viewNode.RemoveChild(node); viewport.CallDeferred("add_child", node); } viewNode.CallDeferred("queue_free"); } public override void _Process(double delta) { } public override void _PhysicsProcess(double delta) { // var colorRect = GetNode<ColorRect>("ColorRect"); // var pos = GameApplication.Instance.ViewToGlobalPosition(GameApplication.Instance.Node3D.Player.GlobalPosition); // colorRect.SetGlobalPosition(pos); //GD.Print("pos: " + pos + ", " + colorRect.GlobalPosition); } /// <summary> /// 设置最大血量 /// </summary> public void SetMaxHp(int maxHp) { MaxHp = Mathf.Max(maxHp, 0); hpSlot.Size = new Vector2(maxHp + 3, hpSlot.Size.Y); if (Hp > maxHp) { SetHp(maxHp); } } /// <summary> /// 设置最大护盾值 /// </summary> public void SetMaxShield(int maxShield) { MaxShield = Mathf.Max(maxShield, 0); ; shieldSlot.Size = new Vector2(maxShield + 2, shieldSlot.Size.Y); if (Shield > MaxShield) { SetShield(maxShield); } } /// <summary> /// 设置当前血量 /// </summary> public void SetHp(int hp) { Hp = Mathf.Clamp(hp, 0, MaxHp); hpBar.Size = new Vector2(hp, hpBar.Size.Y); } /// <summary> /// 设置护盾值 /// </summary> public void SetShield(int shield) { Shield = Mathf.Clamp(shield, 0, MaxShield); shieldBar.Size = new Vector2(shield, shieldBar.Size.Y); } /// <summary> /// 玩家受到伤害 /// </summary> public void Hit(int num) { } /// <summary> /// 设置显示在 ui 上的枪的纹理 /// </summary> /// <param name="gun">纹理</param> public void SetGunTexture(Texture2D gun) { if (gun != null) { gunSprite.Texture = gun; gunSprite.Visible = true; bulletText.Visible = true; } else { gunSprite.Visible = false; bulletText.Visible = false; } } /// <summary> /// 设置弹药数据 /// </summary> /// <param name="curr">当前弹夹弹药量</param> /// <param name="total">剩余弹药总数</param> public void SetAmmunition(int curr, int total) { bulletText.Text = curr + " / " + total; } }