miduo_client/Assets/ManagedResources/~Lua/Modules/Fight/View/FightMapIconShowView.lua

692 lines
20 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

--- 执行关卡地图图标事件
--- Generated by EmmyLua(https://github.com/EmmyLua)
--- Created by aaa.
--- DateTime: 2019/10/18 18:23
---
local this = {}
local mapIconConfig = ConfigManager.GetConfig(ConfigName.MainMapIconConfig)
--- 执行完行为后的回调
local actionCallBack = nil
--- 是否界面已经关闭
local panelIsClose = false
-- 角色当前的位置信息
local m_roleCurPos
local m_selectPointPos = 0
local m_parent
-- 默认0是没有buff1是攻击buff 2是防御buff
local m_isHaveBuff = 0
-- 当前Buff创建的buff应该存在的时间
local m_buffStayStep = 0
-- 是不是单纯的屁话
local simpleTalk = true
--- 配置定义
-- 角色对话气泡位置
local m_roleTextPos = {
[3] = {pos = Vector3.New(172, 200, 0), angleOffset = 180}, -- 角色朝左, 气泡在右
[4] = {pos = Vector3.New(-177, 204, 0), angleOffset = 0} -- 反之
}
-- 老头对话气泡位置
local m_oldManTextPos = {
[3] = {pos = Vector3.New(-176, 130, 0), angleOffset = 0}, -- 角色朝左,气泡在左
[4] = {pos = Vector3.New(154, 130, 0), angleOffset = 180} -- 反之
}
-- buff提示图片
local buffTipImg = {
-- 攻击提升
[1] = {
[1] = "r_guanka_baojitisheng",
[2] = "r_guanka_baoshangtisheng",
[3] = "r_guanka_gongjitisheng",
},
-- 防御加强
[2] = {
[1] = "r_guanka_hujiatisheng",
[2] = "r_guanka_mokangtisheng",
},
}
-- 角色移动速度
local m_moveSpeed = 0.4
-- 打击速度
local m_hitSpeed = 0.15
-- 飘血资源
local hurtRes = "FloatingText"
--- 从父对象注册需要的组件
function this.InitRegisterComponent(parent)
panelIsClose = false
m_parent = nil
m_parent = parent
--this.isBeginFight = false
-- 加载初始化资源
-- 初始化3个伤害字体
this.hurtNum = {}
for i = 1, 3 do
this.hurtNum[i] = poolManager:LoadAsset(hurtRes, PoolManager.AssetType.GameObject)
-- 设置父级
this.hurtNum[i].transform:SetParent(m_parent.effectRoot.transform)
this.hurtNum[i].transform.localScale = Vector3.New(0.5, 0.5, 0.5)
Util.GetGameObject(this.hurtNum[i], "anim"):GetComponent("Canvas").sortingOrder = m_parent.GetCurLayer()
this.hurtNum[i]:SetActive(false)
end
this.SetActionSpeed(1, 1)
this.public_EndDialogue()
end
-- 设置暴击文字层级
function this:OnSortingOrderChange(parentSort)
if #this.hurtNum > 0 then -- 初始化完成
for i = 1, 3 do
Util.GetGameObject(this.hurtNum[i], "anim"):GetComponent("Canvas").sortingOrder = parentSort
end
end
end
-------------------- 事件的对外接口函数 -----------------
--- 遇见一个宝箱
--- @parame iconType 图标类型
--- @parame roleFaceDir 角色朝向
function this.public_MeGetBaby(iconType, roleFaceDir, point, func, isSelf)
actionCallBack = nil
if func then actionCallBack = func end
if isSelf then
simpleTalk = true
-- 对话次数
local talktimes = 1
this.private_SetDialogueBoxDir(roleFaceDir, point, false)
this.private_StartBB(talktimes, iconType, point)
else
if actionCallBack then
actionCallBack()
end
end
end
--- 遇见一个老大爷
--- @parame iconType 图标类型
--- @parame roleFaceDir 角色朝向
function this.public_MeetYourGrandPa(iconType, roleFaceDir, point, func, isSelf)
actionCallBack = nil
if func then actionCallBack = func end
if isSelf then
simpleTalk = true
-- 对话次数
local talktimes = 3
this.private_SetDialogueBoxDir(roleFaceDir, point, true)
this.private_StartBB(talktimes, iconType, point)
else
if actionCallBack then
actionCallBack()
end
end
end
--- 进入战斗
----@param battleTimes 战斗次数
----@param roleCurPosInfo 角色当前的位置信息
function this.public_SetBattleTimes(point, roleFaceDir, battleTimes, roleCurPosInfo, selectPointPos, func)
actionCallBack = nil
if func then actionCallBack = func end
m_roleCurPos = nil
if roleCurPosInfo then
m_roleCurPos = roleCurPosInfo
end
m_selectPointPos = 0
if selectPointPos then
m_selectPointPos = selectPointPos
end
-- 开始战斗
this.private_StartBattle(point, roleFaceDir, battleTimes)
end
--- 加点血
function this.public_GiveMeMilk(iconType, point, roleFaceDir, selectPointPos, func)
actionCallBack = nil
if func then actionCallBack = func end
m_roleCurPos = nil
m_selectPointPos = 0
if selectPointPos then
m_selectPointPos = selectPointPos
end
simpleTalk = false
--this.private_StartBB(2, iconType, point)
this.private_DrinkSomeMilk(iconType, point, roleFaceDir)
end
-- 显示一个buff 管他是个什么锤子
function this.public_GetBuff(iconType, func)
actionCallBack = nil
if func then actionCallBack = func end
if mapIconConfig[iconType].Steps and mapIconConfig[iconType].Steps > 0 then
m_buffStayStep = mapIconConfig[iconType].Steps
else
Log("搞笑呢,这数据都没有!")
end
local buffType = iconType == 14 and 1 or 2
this.showBuffTimer = nil
this.showBuffTimer = Timer.New(function ()
if panelIsClose then return end
this.private_CreateBuff(buffType)
end, 1)
this.showBuffTimer:Start()
end
--- 结束对话
function this.public_EndDialogue()
this.private_SetDialogueText(false, " ")
end
-- 设置行动速度
function this.SetActionSpeed(moveSpeed, hitSpeed)
m_moveSpeed = 0.4 / moveSpeed
m_hitSpeed = 0.15 / hitSpeed
end
-- 获取移动速度
function this.GetRoleSpeed()
return m_moveSpeed
end
-- 隐藏飘字
function this.public_HideEffect()
for i = 1, 3 do
this.hurtNum[i]:SetActive(false)
end
end
-- 界面销毁时,可能还有方法在调用父对象的组件,注意判断
function this.public_DestroyRegisterComponent()
panelIsClose = true
-- 注销时钟
if this.talkTimer then
this.talkTimer:Stop()
end
if this.callbackTimer then
this.callbackTimer:Stop()
end
if this.hurtNumTimer then
this.hurtNumTimer:Stop()
end
if this.showBuffTimer then
this.showBuffTimer:Stop()
end
for i = 1, 3 do
if this.hurtNum[i] then
poolManager:UnLoadAsset(hurtRes, this.hurtNum[i], PoolManager.AssetType.GameObject)
this.hurtNum[i] = nil
end
end
this.talkTimer = nil
this.callbackTimer = nil
this.hurtNumTimer = nil
this.showBuffTimer = nil
-- 清空列表引用
this.hurtNum = {}
m_isHaveBuff = 0
m_buffStayStep = 0
SoundManager.StopSoundByChannel(20)
end
--------------------------------------------------------
-------------------- 私有函数 --------------------------
----- ============== 角色对话处理 ======================
--- 开始对话
--- @param leftTimes 剩余对话次数
--- @param iconType 图标类型
--- @param point 遇到的图标
function this.private_StartBB(leftTimes, iconType, point)
if leftTimes > 0 then
this.private_SetTalkObj(leftTimes, iconType, point, function ()
leftTimes = leftTimes - 1
this.private_StartBB(leftTimes, iconType, point)
end)
else -- 对话完执行回调
if actionCallBack then actionCallBack() end
actionCallBack = nil
return
end
end
--- 这是对话时的气泡朝向
----@param point 需要设置的事件点
----@param isSetIcon 是否需要设置事件点
function this.private_SetDialogueBoxDir(roleFaceDir, point, isSetIcon)
if panelIsClose then return end
-- 设置角色, 值为4的时候是角色朝右
local index = roleFaceDir == 4 and 4 or 3
m_parent.dialogueRoot.transform.localEulerAngles = Vector3.New(0, m_roleTextPos[index].angleOffset, 0)
m_parent.context.transform.localEulerAngles = Vector3.New(0, m_roleTextPos[index].angleOffset, 0)
m_parent.dialogueRoot.transform.localPosition = m_roleTextPos[index].pos
if isSetIcon then
-- 设置老头
local oldManAngle = Vector3.New(0, m_oldManTextPos[index].angleOffset, 0)
point:SetDialogueDir(m_oldManTextPos[index].pos, oldManAngle)
point:ShowDialogue(false)
end
end
--- 设置角色对话内容
function this.private_SetDialogueText(state, iconType)
if panelIsClose then return end
m_parent.dialogueRoot:SetActive(state)
if state then
PlayUIAnim(m_parent.dialogueRoot)
m_parent.context.text = this.private_GetRoleTalkShit(iconType)
end
end
--- 随机一份角色的对话内容
function this.private_GetRoleTalkShit(iconType)
local contents = string.split(GetLanguageStrById(mapIconConfig[iconType].Desc), "#")
local index = math.random(1, #contents)
return contents[index]
end
--- 选择当前的说话对象
function this.private_SetTalkObj(leftTimes, iconType, point, func)
local isMe = math.floor(leftTimes % 2) == 1
local damnOld = point
damnOld:ShowDialogue(not isMe)
this.private_SetDialogueText(isMe, iconType)
if not isMe then
-- 找找他该说啥
local contents = string.split(GetLanguageStrById(mapIconConfig[iconType].DescNPC), "#")
local index = math.random(1, #contents)
damnOld:SetDialogueStr(contents[index])
PlayUIAnim(damnOld.go)
end
if leftTimes > 1 then
this.talkTimer = nil
this.talkTimer = Timer.New(function ()
if not panelIsClose then
if func then func() end
end
end, 0.8)
this.talkTimer:Start()
else
if func then func() end
end
end
--- ====================================================
--- ============ 战斗显示设置 ===========================
--- 开始战斗
function this.private_StartBattle(point, roleFaceDir, battleTimes)
if not panelIsClose then
this.private_ShakeByTimes(point, roleFaceDir, battleTimes, 1)
end
end
function this.private_ShakeByTimes(point, roleFaceDir, shakeTime, index)
if panelIsClose then return end
if point then
local icon = point.go
local start = index
local iconType = point.iconId
local leftNum = math.floor(start % 2)
-- 主动打击者
local go = leftNum == 1 and m_parent.roleRoot or icon
-- 受击对象
local hurtGo = leftNum ~= 1 and m_parent.roleRoot or Util.GetGameObject(icon, "root")
local isReverse = leftNum == 0
local objPos = isReverse and m_roleCurPos.u * 256 + m_roleCurPos.v or m_selectPointPos
local end_callBack = function() -- 受击结束动画
if panelIsClose then return end
m_parent.hitEffect:SetActive(false)
if start >= shakeTime then
-- 执行最终回调
actionCallBack()
return
else
start = start + 1
this.private_ShakeByTimes(point, roleFaceDir, shakeTime, start)
end
end
local mid_callBack = function() -- 打击时间点
-- 泼血
this.private_BloodBlood(objPos, start, iconType, isReverse, 0)
this.pravite_PlayHitEffect(objPos)
if point then
point:SetPointAnimation(iconType, 2)
end
--整个东西缩一下
this.PlayScale(hurtGo, 0.7)
SoundManager.PlaySound(SoundConfig.Sound_FightArea_Attack[math.random(1, #SoundConfig.Sound_FightArea_Attack)])
end
local func = function()
this.pravite_ShakeObjOnce(go, isReverse, roleFaceDir, end_callBack, mid_callBack)
end
this.callbackTimer = nil
this.callbackTimer = Timer.New(function ()
if not panelIsClose then
func()
end
end, 0.2)
this.callbackTimer:Start()
end
end
-- 怪物被打得吐血
--- @param showType 参数为0时表示为掉血参数大于0时表示为补血
function this.private_BloodBlood(objPos, index, iconType, isMonster, showType, func)
if panelIsClose then return end
local go = this.hurtNum[math.floor(index % 3 + 1)]
-- 吐血随机值
local hurtNum, isCritical = this.pravite_GetHurtValue(isMonster, iconType, showType)
local v2 = SetObjPosByUV(objPos)
go:GetComponent("RectTransform").anchoredPosition3D = Vector3.New(v2.x, v2.y, 0) + Vector3.New(0, 120, 0)
Util.GetGameObject(go, "anim/Image"):SetActive(false)
Util.GetGameObject(go, "anim/anim"):GetComponent("Text").text = this.DecodeHurt(hurtNum, isCritical, showType)
if not FightPointPassManager.isBeginFight then
go:SetActive(true)
else
go:SetActive(false)
end
this.hurtNumTimer = nil
this.hurtNumTimer = Timer.New(function()
if panelIsClose then return end
if go then
go:SetActive(false)
end
if func then func() end
end, 1.5)
this.hurtNumTimer:Start()
end
-- 获取伤害值
--- @param hadFought 已经战斗的次数
function this.pravite_GetHurtValue(isMonster, iconType, showType)
local hurtNum = 0
-- 计算是否有宝鸡
local isCritical = false
if showType == 0 then -- 计算掉血量
-- 计算普伤
if isMonster then
hurtNum = math.floor(math.random(100, mapIconConfig[iconType].HurtMax / 2))
else
hurtNum = math.random(mapIconConfig[iconType].HurtMin, mapIconConfig[iconType].HurtMax)
end
-- 宝鸡概率
local forceRate = mapIconConfig[iconType].StrikeProbability / 100
local forceValue = (math.random(0, 0.8) + forceRate * math.random(0.5, 1)) + 0.2
isCritical = forceValue >= 1
hurtNum = isCritical and hurtNum * 2 or hurtNum
else -- 计算补血量
hurtNum = math.random(mapIconConfig[iconType].HurtMin, mapIconConfig[iconType].HurtMax)
end
-- 是否有buff
hurtNum = this.private_GetBuffGain(not isMonster, hurtNum)
return hurtNum, isCritical
end
-- 解码显示伤害值
function this.DecodeHurt(hurtValue, iscritical, showType)
-- 信息头
local color = 0
local offSet = 0
local text = ""
if showType == 0 then
if iscritical then -- 宝鸡
color = 0
-- text = text .. string.char(33) -- 暴击文字
else -- 普伤
color = 1
end
offSet = 10
else
color = 3
offSet = 11
end
-- 数字
text = text .. string.char((color*2)+100 + offSet) -- 符号
local str = tostring(hurtValue)
for i=1,#str do
text = text..string.char((string.byte(str,i) - 48) + color*10 + 40)
end
return text
end
-- 受击特效
function this.pravite_PlayHitEffect(pos)
if panelIsClose then return end
--local u, v = Map_Pos2UV(pos)
--local v2 = RectTransformUtility.WorldToScreenPoint(TileMapView.GetCamera(), TileMapView.GetLiveTilePos(u, v))
--v2 = v2 / math.min(Screen.width/1080, Screen.height/1920)
m_parent.hitEffect.transform.localPosition = SetObjPosByUV(pos)
if not FightPointPassManager.isBeginFight then
m_parent.hitEffect:SetActive(true)
else
m_parent.hitEffect:SetActive(false)
end
end
-- 震动动画
function this.pravite_ShakeObjOnce(go, isReverse, roleFaceDir, func, mid_func)
if panelIsClose then
func = nil
mid_func = nil
return
end
local offSet = isReverse and 90 or 120
offSet = offSet / math.min(Screen.width/1080, Screen.height/1920)
local originPos = go:GetComponent("RectTransform").anchoredPosition
local value = isReverse and -1 or 1
local targetPos = originPos + Vector2.New(offSet * roleFaceDir.x * value, offSet * roleFaceDir.y * value)
if go then
go:GetComponent("RectTransform"):DOAnchorPos(targetPos, m_hitSpeed, false):OnComplete(function ()
if panelIsClose then return end
if mid_func then mid_func() end
go:GetComponent("RectTransform"):DOAnchorPos(originPos, m_hitSpeed, false):OnComplete(function ()
if panelIsClose then return end
if func then func() end
end)
end)
end
end
-- 缩放
function this.PlayScale(go, scale)
if go then
local originScale = go.transform.localScale
go.transform:DOScale(originScale * scale, 0.1):OnComplete(function ()
go.transform:DOScale(originScale, 0.1)
end)
end
end
--- ================= 我要喝点牛牛补补血 ============
function this.private_DrinkSomeMilk(iconType, point, roleFaceDir)
this.private_BloodBlood(m_selectPointPos, 1, iconType, false, 1)
if actionCallBack then
actionCallBack()
end
end
--- ===================================================
-- 每走一步看看我是否还有Buff
function this.JudgeBuffState(spLoader, u, v)
if m_isHaveBuff > 0 then
this.private_UpDateBuff()
if m_buffStayStep % 2 == 1 then
-- 设置一下提示文字
this.ShowBuffTip(u, v)
end
end
m_buffStayStep = m_buffStayStep - 1
end
-- 显示buff的提示文字
function this.ShowBuffTip(spLoader, u, v)
if m_parent.buffTipList then
local go = m_parent.buffTipList[m_buffStayStep % 3 + 1]
if go then
local originPos = SetObjPosByUV(u * 256 + v)
local targetPos = originPos + Vector2.New(0, 164)
go:GetComponent("RectTransform").anchoredPosition = originPos
local imgList = buffTipImg[m_isHaveBuff]
go:GetComponent("Image").sprite = spLoader:LoadSprite(imgList[math.random(1, #imgList)])
go:SetActive(true)
go:GetComponent("Image"):DOFade(0, 0.3):SetDelay(0.5):OnComplete(function ()
if panelIsClose then return end
if go then
go:GetComponent("Image"):DOFade(1, 0.1)
end
end)
go:GetComponent("RectTransform"):DOAnchorPos(targetPos, 0.8, false):OnComplete(function ()
if panelIsClose then return end
if go then
go:SetActive(false)
end
end)
end
end
end
-- 添加一个Buff
--- @param buffType 1 -- 攻击buff 2 -- 防御buff 0 -- 无buff隐藏所有
function this.private_CreateBuff(buffType)
local haveBuff = buffType > 0
local isAttackBuff = buffType == 1
if panelIsClose then return end
if m_parent.buffEffectRoot then
m_parent.buffEffectRoot:SetActive(haveBuff)
end
if m_parent.buffAttack then
m_parent.buffAttack:SetActive(isAttackBuff)
end
if m_parent.buffDefend then
m_parent.buffDefend:SetActive(not isAttackBuff)
end
m_isHaveBuff = buffType
-- 创建完毕
if actionCallBack then
actionCallBack()
end
-- 加速吧,少年
this.SetActionSpeed(2, 1.5)
-- 用一个特殊的音频通道播放并在关闭界面和buff结束时关闭
SoundManager.PlaySound(SoundConfig.Sound_FightArea_Buff,nil, nil, 20)
end
-- 消除一个Buff
function this.private_EndBuff()
if panelIsClose then return end
if m_parent.buffEffectRoot then
m_parent.buffEffectRoot:SetActive(false)
end
if m_parent.buffAttack then
m_parent.buffAttack:SetActive(false)
end
if m_parent.buffDefend then
m_parent.buffDefend:SetActive(not false)
end
m_isHaveBuff = 0
-- 变成龟速
this.SetActionSpeed(1, 1)
SoundManager.StopSoundByChannel(20)
end
-- 走一步更新buff状态
function this.private_UpDateBuff()
m_buffStayStep = m_buffStayStep > 0 and m_buffStayStep or 0
if m_buffStayStep == 0 then
this.private_EndBuff()
end
end
-- 攻击乘以 1.5
-- 防御降低到0.5的伤害值
-- 计算当前buff带来的数值增量
--- @param isMonster 攻击对象是否是个怪
--- @param curHurtNum 叠加暴击后的伤害值
function this.private_GetBuffGain(isMonster, curHurtNum)
-- 如果没有buff
if m_isHaveBuff then return curHurtNum end
local gainNum = curHurtNum
if isMonster then
if m_isHaveBuff == 1 then -- 攻击怪时拥有攻击buff
gainNum = curHurtNum * 1.2
else
gainNum = curHurtNum
end
else -- 天呢,我被打了
if m_isHaveBuff == 1 then
gainNum = curHurtNum
else
gainNum = curHurtNum * 0.5
end
end
return gainNum
end
--- ====================================================
--------------------------------------------------------
return this