Files
StellaSora_DataLua/lua/game/ui/hud/playerhudctrl.lua
T
SL1900 5e0d58cfad Initial version - 1.2.0.60
EN: 1.2.0.60
CN: 1.2.0.61
JP: 1.2.0.63
KR: 1.2.0.67
2025-12-03 01:00:00 +09:00

363 lines
14 KiB
Lua

local PlayerHudCtrl = class("PlayerHudCtrl", BaseCtrl)
local AdventureModuleHelper = CS.AdventureModuleHelper
local nShieldParam = 0.3
local nShieldParamPower = 0.5
local BarHeight = 21
local BarWidth = 166
local ShieldBarHeight = 32
local ShieldBarWidth = 190
local ShieldDelayHeight = 21
local AniTimeHighlight = 0.5
local AniTime = 0.16
local AniTimeShield = 0.5
local ToughnessRecoverTime = 0.3
local ToughnessWidth = 208
local ToughnessHeight = 21
local colorHide = Color(1, 1, 1, 0)
local colorWhite = Color(1, 1, 1, 1)
local colorShieldDelay = Color(1, 1, 1, 0.5)
local colorRed = Color(0.9176470588235294, 0.043137254901960784, 0.08627450980392157, 1)
local colorRedHide = Color(0.9176470588235294, 0.043137254901960784, 0.08627450980392157, 0)
local colorRecover = Color(0.043137254901960784, 0.9921568627450981, 0.7568627450980392, 1)
local colorGreen = Color(0.5568627450980392, 0.8274509803921568, 0.28627450980392155, 1)
local colorGreenHide = Color(0.5568627450980392, 0.8274509803921568, 0.28627450980392155, 0)
local bulletType = {
[1] = "icon_bullet_1",
[2] = "icon_bullet_2",
[3] = "icon_bullet_3",
[4] = "icon_bullet_4",
[5] = "icon_bullet_5"
}
PlayerHudCtrl._mapNodeConfig = {
canvasGroup = {
sNodeName = "rtRoot",
sComponentName = "CanvasGroup"
},
rtHpFillDelay = {
sNodeName = "imgHpFillDelay",
sComponentName = "RectTransform"
},
rtHpFill = {
sNodeName = "imgHpFill",
sComponentName = "RectTransform"
},
aniRtHpDelay = {
sNodeName = "imgHpFillDelay",
sComponentName = "HpBarRectTransform"
},
ainColorHpDelay = {
sNodeName = "imgHpFillDelay",
sComponentName = "HpBarColor"
},
aniRtHpFill = {
sNodeName = "imgHpFill",
sComponentName = "HpBarRectTransform"
},
ainColorHpDelayHighlight = {
sNodeName = "imgHpDelayHighLight",
sComponentName = "HpBarColor"
},
ainColorHpFillHighLight = {
sNodeName = "imgHpHighLight",
sComponentName = "HpBarColor"
},
ainColorHpFillRecoverLight = {
sNodeName = "imgHpFillRecoverLight",
sComponentName = "HpBarColor"
},
ainColorimgBigHit = {sNodeName = "imgBigHit", sComponentName = "HpBarColor"},
imgBg2 = {},
aniShield = {
sComponentName = "Animator",
sNodeName = "rtShieldMask"
},
rtShieldMask = {
sComponentName = "RectTransform"
},
rtShieldMaskAin = {
sNodeName = "rtShieldMask",
sComponentName = "HpBarRectTransform"
},
imgShieldDelay = {
sComponentName = "RectTransform"
},
imgShieldDelayAin = {
sNodeName = "imgShieldDelay",
sComponentName = "HpBarRectTransform"
},
imgShieldFillHighLight = {
sComponentName = "RectTransform"
},
imgShieldFillHighLightAni = {
sNodeName = "imgShieldFillHighLight",
sComponentName = "HpBarColor"
},
imgShieldFillLIght = {sComponentName = "HpBarColor"},
AmmoBar = {sNodeName = "AmmoBar"},
AmmoBarAnim = {sNodeName = "AmmoBar", sComponentName = "Animator"},
txtAmmoCount = {sComponentName = "TMP_Text"},
AmmoIcon = {sComponentName = "Image"},
JsAniObj = {sNodeName = "JsAniObj"},
rtShakeRoot = {sComponentName = "Animator"},
rtBuff = {
sCtrlName = "Game.UI.Hud.Buff.BuffCtrl"
}
}
PlayerHudCtrl._mapEventConfig = {
ShowPlayerHudRootCanvas = "OnEvent_ShowPlayerHudRootCanvas",
PlayerSwitchGun = "OnEvent_PlayerSwitchGun"
}
function PlayerHudCtrl:PlayTweenHp(hp, hpMax)
local nWidth = 1 <= hp / hpMax and BarWidth or hp / hpMax * BarWidth
if nWidth > BarWidth then
nWidth = BarWidth
end
if hp < self.nBeforeHp then
if self._mapNode.rtHpFill.sizeDelta.x > self._mapNode.rtHpFillDelay.sizeDelta.x then
self._mapNode.aniRtHpDelay:SetTarget(self._mapNode.rtHpFill.sizeDelta, 0)
end
self._mapNode.aniRtHpFill:SetTarget(Vector2(nWidth, BarHeight), 0)
self._mapNode.ainColorHpFillHighLight:SetTarget(colorWhite, 0)
local delayTime = 0
if (self.nBeforeHp - hp) / hpMax > self.bigDamageThreshold then
self._mapNode.ainColorHpDelay:SetTarget(colorWhite, 0)
self._mapNode.ainColorHpDelay:SetTarget(colorRed, 0.1, AniTime)
self._mapNode.rtShakeRoot:Play("HPShake_in")
delayTime = 0.5
end
if hp / hpMax < 0.25 then
self._mapNode.ainColorimgBigHit:SetTarget(colorWhite, 0)
self._mapNode.ainColorimgBigHit:SetTarget(colorHide, AniTime, 0.5)
self._mapNode.rtShakeRoot:Play("HPShake_in")
end
self._mapNode.aniRtHpDelay:SetTarget(Vector2(nWidth, BarHeight), AniTime, delayTime)
self._mapNode.ainColorHpFillHighLight:SetTarget(colorHide, AniTimeHighlight, 0.2 + delayTime)
else
self._mapNode.rtHpFillDelay.sizeDelta = self._mapNode.rtHpFill.sizeDelta
self._mapNode.ainColorHpFillHighLight:SetTarget(colorWhite, 0)
self._mapNode.ainColorHpFillHighLight:SetTarget(colorHide, AniTimeHighlight, AniTime)
self._mapNode.ainColorHpDelayHighlight:SetTarget(colorWhite, 0)
self._mapNode.ainColorHpDelayHighlight:SetTarget(colorHide, AniTimeHighlight)
self._mapNode.ainColorHpDelay:SetTarget(colorRecover)
self._mapNode.aniRtHpDelay:SetTarget(Vector2(nWidth, BarHeight), AniTime)
self._mapNode.aniRtHpFill:SetTarget(Vector2(nWidth, BarHeight), AniTime, AniTime)
self._mapNode.ainColorHpFillRecoverLight:SetTarget(colorGreen, 0)
self._mapNode.ainColorHpFillRecoverLight:SetTarget(colorGreenHide, AniTimeHighlight, AniTime)
end
end
function PlayerHudCtrl:PlayTweenShield(shieldValue, shieldValueMax)
local nShieldPersent = shieldValue / self.nBeforeHpMax
if nShieldPersent < 0.3 then
nShieldPersent = (nShieldParam * nShieldPersent) ^ nShieldParamPower
end
local nWidth = math.min(nShieldPersent, 1) * ShieldBarWidth
local nHighlightPos = math.min(nShieldPersent, 1) * 180 + 8
local nBeforePersent = self.nBeforeShield / self.nBeforeHpMax
if nBeforePersent < 0.3 then
nBeforePersent = (nShieldParam * nBeforePersent) ^ nShieldParamPower
end
local nSumWidth = math.min(nBeforePersent - nShieldPersent, 1) * ShieldBarWidth
if nSumWidth + nWidth > ShieldBarWidth then
nSumWidth = ShieldBarWidth - nWidth
end
if shieldValue < self.nBeforeShield then
self._mapNode.imgShieldFillHighLight.anchoredPosition = Vector2(nHighlightPos, 0)
self._mapNode.imgShieldDelay.anchoredPosition = Vector2(nHighlightPos, 0)
self._mapNode.imgShieldFillHighLightAni:SetTarget(colorWhite, 0)
self._mapNode.imgShieldFillHighLightAni:SetTarget(colorHide, AniTimeShield * 1.5)
self._mapNode.imgShieldFillLIght:SetTarget(colorWhite, 0)
self._mapNode.imgShieldFillLIght:SetTarget(colorHide, AniTimeShield)
self._mapNode.rtShieldMaskAin:SetTarget(Vector2(nWidth, ShieldBarHeight), AniTimeShield)
self._mapNode.imgShieldDelay.anchoredPosition = Vector2(nWidth, 0)
self._mapNode.imgShieldDelayAin:SetTarget(Vector2(nSumWidth, ShieldBarHeight), 0)
self._mapNode.imgShieldDelayAin:SetTarget(Vector2(0, ShieldBarHeight), AniTimeShield, AniTimeShield * 0.5)
elseif self.nBeforeShield <= 0 and 0 < shieldValue then
self._mapNode.rtShieldMaskAin:SetTarget(Vector2(nWidth, ShieldBarHeight), 0)
self._mapNode.imgShieldFillLIght:SetTarget(colorHide, 0)
self._mapNode.aniShield:Play("PlayShield_in")
else
self._mapNode.imgShieldDelayAin:SetTarget(Vector2(0, BarHeight), 0)
self._mapNode.imgShieldFillHighLightAni:SetTarget(colorHide, 0)
self._mapNode.rtShieldMaskAin:SetTarget(Vector2(nWidth, ShieldBarHeight), AniTimeShield)
self._mapNode.imgShieldFillLIght:SetTarget(colorWhite, 0)
self._mapNode.imgShieldFillLIght:SetTarget(colorHide, AniTimeShield)
end
end
function PlayerHudCtrl:ResetHit()
self._mapNode.ainColorHpDelay:SetTarget(colorRed, 0)
self._mapNode.ainColorHpFillHighLight:SetTarget(colorHide, 0)
self._mapNode.ainColorHpDelayHighlight:SetTarget(colorHide, 0)
self._mapNode.imgShieldFillHighLightAni:SetTarget(colorHide, 0)
self._mapNode.ainColorimgBigHit:SetTarget(colorHide, 0)
self.nBeforeHp = 0
self.nBeforeHpMax = 0
self.nBeforeShield1 = 0
self.nBeforeShield2 = 0
self.nBeforeShield3 = 0
self.nBeforeShield4 = 0
end
function PlayerHudCtrl:KillTween()
self._mapNode.aniRtHpDelay:Stop()
self._mapNode.ainColorHpDelay:Stop()
self._mapNode.aniRtHpFill:Stop()
self._mapNode.ainColorHpDelayHighlight:Stop()
self._mapNode.ainColorHpFillHighLight:Stop()
self._mapNode.ainColorHpFillRecoverLight:Stop()
self._mapNode.rtShieldMaskAin:Stop()
self._mapNode.imgShieldDelayAin:Stop()
self._mapNode.imgShieldFillHighLightAni:Stop()
end
function PlayerHudCtrl:Awake()
self.playerId = 0
self.bigDamageThreshold = ConfigTable.GetConfigNumber("BloodSpecialEffectThresholdValue") / 100
end
function PlayerHudCtrl:OnEnable()
self.playerId = 0
self._mapNode.AmmoBar:SetActive(false)
self:ResetHit()
end
function PlayerHudCtrl:OnDisable()
self._mapNode.rtBuff:UnbindEntity()
EventManager.RemoveEntityEvent("HpChanged", self.playerId, self, self.OnEvent_HpChanged)
EventManager.RemoveEntityEvent("AmmoChanged", self.playerId, self, self.OnEvent_AmmoChanged)
EventManager.RemoveEntityEvent("BuffReduceTime", self.playerId, self, self.OnEvent_JsAniObjActive)
EventManager.RemoveEntityEvent("ShieldChanged", self.playerId, self, self.OnEvent_ShieldChanged)
EventManager.RemoveEntityEvent("PlayerDeathStateEnter", self.playerId, self, self.OnEvent_Deaded)
self.playerId = 0
self:KillTween()
self:ResetHit()
end
function PlayerHudCtrl:OnDestroy()
end
function PlayerHudCtrl:SetPlayerId(playerId)
if self.playerId == playerId then
return
end
if NovaAPI.GetEntryLevelFade() then
NovaAPI.SetCanvasGroupAlpha(self._mapNode.canvasGroup, 0)
else
NovaAPI.SetCanvasGroupAlpha(self._mapNode.canvasGroup, 1)
end
self.playerId = playerId
self:ResetHit()
self:KillTween()
local ammoMax = AdventureModuleHelper.GetEntityAmmoMax(self.playerId)
local ammoCount = AdventureModuleHelper.GetEntityAmmoCount(self.playerId)
local bulletType = AdventureModuleHelper.GetEntityBulletType(self.playerId)
self:SetAmmo(ammoCount, ammoMax)
self:SetAmmoIcon(bulletType)
local hp = AdventureModuleHelper.GetEntityHp(self.playerId)
local hpMax = AdventureModuleHelper.GetEntityMaxHp(self.playerId)
self:SetHp(hp, hpMax, true)
local activeJs = AdventureModuleHelper.GetEntityHaveBuffTimeReduce(self.playerId)
self:OnEvent_JsAniObjActive(activeJs)
local shieldValue, shieldValueMax = AdventureModuleHelper.GetEntityShieldValue(self.playerId)
self:SetShield(shieldValue, shieldValueMax, true)
self._mapNode.rtBuff:BindEntity(self.playerId)
EventManager.AddEntityEvent("HpChanged", self.playerId, self, self.OnEvent_HpChanged)
EventManager.AddEntityEvent("AmmoChanged", self.playerId, self, self.OnEvent_AmmoChanged)
EventManager.AddEntityEvent("BuffReduceTime", self.playerId, self, self.OnEvent_JsAniObjActive)
EventManager.AddEntityEvent("ShieldChanged", self.playerId, self, self.OnEvent_ShieldChanged)
EventManager.AddEntityEvent("PlayerDeathStateEnter", self.playerId, self, self.OnEvent_Deaded)
end
function PlayerHudCtrl:SetHp(hp, hpMax, bChange)
if self.playerId == 0 then
return
end
if hpMax <= 0 then
self._mapNode.rtHpFillDelay.sizeDelta = Vector2(0, BarHeight)
self._mapNode.rtHpFill.sizeDelta = Vector2(0, BarHeight)
elseif bChange then
self._mapNode.rtHpFillDelay.sizeDelta = Vector2(hp / hpMax * BarWidth, BarHeight)
self._mapNode.rtHpFill.sizeDelta = Vector2(hp / hpMax * BarWidth, BarHeight)
self._mapNode.ainColorHpFillRecoverLight:SetTarget(colorGreenHide, 0)
else
self:PlayTweenHp(hp, hpMax)
end
self.nBeforeHp = hp
self.nBeforeHpMax = hpMax
self._mapNode.imgBg2:SetActive(hp / hpMax < 0.25)
end
function PlayerHudCtrl:OnEvent_HpChanged(hp, hpMax)
if hp == self.nBeforeHp then
self:SetHp(hp, hpMax, true)
else
self:SetHp(hp, hpMax)
end
if hpMax ~= self.nBeforeHpMax then
self:SetShield(self.nBeforeShield, self.nBeforeShieldMax, true)
end
end
function PlayerHudCtrl:OnEvent_ShieldChanged(value1, value2)
self:SetShield(value1, value2)
end
function PlayerHudCtrl:OnEvent_AmmoChanged(ammo, ammoMax)
self:SetAmmo(ammo, ammoMax)
end
function PlayerHudCtrl:OnEvent_JsAniObjActive(active)
self._mapNode.JsAniObj:SetActive(active)
end
function PlayerHudCtrl:SetShield(shieldValue, shieldValueMax, bChange)
if self.playerId == 0 then
return
end
if shieldValue <= 0 then
self._mapNode.rtShieldMaskAin:SetTarget(Vector2(0, BarHeight), 0)
self._mapNode.imgShieldDelayAin:SetTarget(Vector2(0, BarHeight), 0)
self._mapNode.imgShieldFillHighLightAni:SetTarget(colorHide, 0)
elseif bChange then
self._mapNode.imgShieldDelayAin:SetTarget(Vector2(0, BarHeight), 0)
self._mapNode.imgShieldFillHighLightAni:SetTarget(colorHide, 0)
local nShieldPersent = shieldValue / self.nBeforeHpMax
if nShieldPersent < 0.3 then
nShieldPersent = (nShieldParam * nShieldPersent) ^ nShieldParamPower
end
local nWidth = math.min(nShieldPersent, 1) * BarWidth
self._mapNode.rtShieldMaskAin:SetTarget(Vector2(nWidth, BarHeight), 0)
self._mapNode.imgShieldFillLIght:SetTarget(colorHide, 0)
else
self:PlayTweenShield(shieldValue, shieldValueMax)
end
self.nBeforeShield = shieldValue
self.nBeforeShieldMax = shieldValueMax
if 0 < shieldValue then
self._mapNode.rtBuff:AddShield()
else
self._mapNode.rtBuff:RemoveShield()
end
end
function PlayerHudCtrl:SetAmmo(ammo, ammoMax)
if 0 < ammoMax then
self._mapNode.AmmoBar:SetActive(true)
NovaAPI.SetTMPText(self._mapNode.txtAmmoCount, ammo)
else
self._mapNode.AmmoBar:SetActive(false)
end
end
function PlayerHudCtrl:SetAmmoIcon(type)
if type ~= 0 then
local spriteBullet = bulletType[type]
self:SetAtlasSprite(self._mapNode.AmmoIcon, "15_battle", spriteBullet)
end
end
function PlayerHudCtrl:OnEvent_Deaded()
EventManager.Hit("PlayerShow", self.playerId, false)
end
function PlayerHudCtrl:OnEvent_ShowPlayerHudRootCanvas()
local sequence = DOTween.Sequence()
sequence:Append(self._mapNode.canvasGroup:DOFade(1, 0.7):SetUpdate(true))
sequence:AppendCallback(function()
NovaAPI.SetEntryLevelFade(false)
end)
sequence:SetUpdate(true)
end
function PlayerHudCtrl:OnEvent_PlayerSwitchGun(type)
local waitCallback = function()
self:SetAmmoIcon(type)
self._mapNode.AmmoBarAnim:Play("AmmoBar_in")
end
self._mapNode.AmmoBarAnim:Play("AmmorBar_out")
self:AddTimer(1, 0.2, waitCallback, true, true, true, nil)
end
return PlayerHudCtrl