miduo_client/Assets/ManagedResources/~Lua/View/SingleExplorePlayerView.lua

952 lines
33 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.

SingleExplorePlayerView = {}
local mapIconConfig = ConfigManager.GetConfig(ConfigName.MainMapIconConfig)
local iconAction = require("Modules/Fight/View/FightMapIconShowView")
local GlobalSysConfig = ConfigManager.GetConfig(ConfigName.GlobalSystemConfig)
local pointnum = 2
-- 角色对话气泡位置
local m_roleTextPos = {
[3] = {pos = Vector3.New(172, 200, 0), angleOffset = 180}, -- 角色朝左, 气泡在右
[4] = {pos = Vector3.New(-177, 204, 0), angleOffset = 0} -- 反之
}
local namePos = {
[1] = {pos = Vector3.New(-1.86, 185.3, 0)}, -- 角色朝左,气泡在左
[2] = {pos = Vector3.New(-1.86, 273.5, 0)} -- 反之
}
-- 老头对话气泡位置
local m_oldManTextPos = {
[3] = {pos = Vector3.New(-176, 130, 0), angleOffset = 0}, -- 角色朝左,气泡在左
[4] = {pos = Vector3.New(154, 130, 0), angleOffset = 180} -- 反之
}
function SingleExplorePlayerView:AddListener()
Game.GlobalEvent:AddEvent(GameEvent.GuaJi.getEvent, self.ReciveData,self)
end
function SingleExplorePlayerView:ReciveData(data)
if data.goData.data.formationId == self.data.formationId then
self.eventPointPos = data.event
self.state = 1
self:RoleWalkEnd(data)
end
return
end
function SingleExplorePlayerView:RemoveListener()
Game.GlobalEvent:RemoveEvent(GameEvent.GuaJi.getEvent, self.ReciveData, self)
end
function SingleExplorePlayerView:New(gameObject)
local b = {}
b.gameObject = gameObject
b.transform = gameObject.transform
setmetatable(b, { __index = SingleExplorePlayerView })
return b
end
local sortingorder = 0
local hitRootPath = "UI_Map_XunBaoEffect_hit"
local npc1 = "live2d_npc_map_boy"
local npc2 = "live2d_npc_map_nv"
-- 飘血资源
local hurtRes = "FloatingText"
function SingleExplorePlayerView:InitComponent()
self.root = Util.GetGameObject(self.gameObject, "root")
self.ui = Util.GetGameObject(self.root, "ui")
self.roleRoot = Util.GetGameObject(self.ui,"roleRoot")
Util.GetGameObject(self.ui, "lizi effect").gameObject:SetActive(false)
self.battleEffect = Util.GetGameObject(self.ui, "quickBattleEffect")
self.bLeaderIsIdle = true
-- 临时代码
self.dialogueRoot = Util.GetGameObject(self.ui, "Dialogue")
self.context = Util.GetGameObject(self.dialogueRoot, "Text"):GetComponent("Text")
-- buff特效
self.buffEffectRoot = Util.GetGameObject(self.roleRoot, "effectRoot")
Util.SetParticleScale(self.buffEffectRoot, 2)
-- 攻击buff
self.buffAttack = Util.GetGameObject(self.buffEffectRoot, "r_MapEffect_NewEvent_011")
self.buffAttack:SetActive(false)
-- 防御buff
self.buffDefend = Util.GetGameObject(self.buffEffectRoot, "r_MapEffect_NewEvent_012")
self.buffEffectRoot:SetActive(false)
self.blood = Util.GetGameObject(self.ui,"blood")
self.bloodSlider = Util.GetGameObject(self.blood,"hpYellow"):GetComponent("Image")
self.tip = Util.GetGameObject(self.blood,"tip")
-- 隐藏一堆东西
Util.GetGameObject(self.ui,"arrow"):SetActive(false)
Util.GetGameObject(self.ui,"pos"):SetActive(false)
self.blood:SetActive(false)
Util.GetGameObject(self.ui,"optionCancelBtn"):SetActive(false)
Util.GetGameObject(self.ui,"roleOption"):SetActive(false)
self:SetBattleState(false)
--角色当前方向
self.curDir = nil
self.gameObject:SetActive(true)
--- 注册组件
self.callList = Stack.New()
--当前选中点的位置
self.selectPointPos = 0
-- 角色停止行走时的朝向, 上 下 左 右1 2 3
self.m_roleFaceDir = Vector2.New(-1, 0)
--角色停止行走时的朝向
self.eventpoint = 0
--当前触发的事件点
self.eventPointPos = nil
self.nameDi = Util.GetGameObject(self.ui, "nemeDi")
self.name = Util.GetGameObject(self.nameDi, "name"):GetComponent("Text")
--修行标识
self.PracticeIcon = Util.GetGameObject(self.name.gameObject, "Icon")
self.PracticeIcon:SetActive(false)
self.hurtNum = {}
self.exploreList = {}
for i = 1,pointnum do
self.exploreList[i] = Util.GetGameObject(self.tip,"tip"..i)
end
end
function SingleExplorePlayerView:OnOpen(parent)
self.parent = parent
self.hitEffect = poolManager:LoadAsset(hitRootPath, PoolManager.AssetType.GameObject)
self.hitEffect.transform:SetParent(parent.effectRoot.transform)
self.hitEffect.transform.localScale = Vector3.one
self.hitEffect:SetActive(false)
if not self.buffTipList then
self.buffTipList = {}
end
-- buff飘字
for i = 1, 3 do
if not self.buffTipList[i] then
self.buffTipList[i] = newObjToParent(parent.buffTip, parent.effectRoot)
self.buffTipList[i].transform.localScale = Vector3.New(1.2, 1.2, 1.2)
self.buffTipList[i]:SetActive(false)
end
end
if not self.hurtNum then
self.hurtNum = {}
end
for i = 1, 3 do
self.hurtNum[i] = poolManager:LoadAsset(hurtRes, PoolManager.AssetType.GameObject)
-- 设置父级
self.hurtNum[i].transform:SetParent(parent.effectRoot.transform)
self.hurtNum[i].transform.localScale = Vector3.New(0.5, 0.5, 0.5)
Util.GetGameObject(self.hurtNum[i], "anim"):GetComponent("Canvas").sortingOrder = parent.GetCurLayer()
self.hurtNum[i]:SetActive(false)
end
end
function SingleExplorePlayerView:RefreshIsSelf(isSelf)
if isSelf then
self.ui:GetComponent("Canvas").worldCamera = TileMapView.GetCamera()
else
self.ui:GetComponent("Canvas").worldCamera = nil
end
self.isSelf = isSelf
if self.eventPointPos then
self.parent.RemoveSelectIconList(self.eventPointPos)
self.eventPointPos = nil
end
self:RoleWalkEnd(nil)
end
function SingleExplorePlayerView:SetData(u,v,data)
sortingorder = self.parent.GetCurLayer()
self.data = data
self.isclose = false
self._PlayTimeStamp = 0
local v3 = TileMapView.GetLiveTilePos(u, v)
self.gameObject.transform.localPosition = Vector3(v3.x, v3.y, v3.z - 10)
self.gameObject.transform.localScale = Vector3.one * 1.5
if self.playerLiveView then
self.playerLiveView:OnClose()
self.playerLiveView = nil
end
local npc,scale
if data.formationId > 3100 then
npc = NameManager.roleSex == ROLE_SEX.BOY and npc1 or npc2
scale = NameManager.roleSex == ROLE_SEX.BOY and 1 or 0.5
self.userId = PlayerManager.uid
self.playerLiveView = PlayerLiveView:New(self.roleRoot,1,nil,sortingorder)
self.playerLiveView:RemoveTitleCanvas()
self.nameDi.gameObject:SetActive(false)
--如果修行开启设置修行标识
if ActTimeCtrlManager.SingleFuncState(108) then
self.PracticeIcon:SetActive(true)
PracticeManager.SetPracticeIcon(self.PracticeIcon,PracticeManager.PracticeLevel or 1)
end
else
npc = data.sex == ROLE_SEX.BOY and npc1 or npc2
scale = data.sex == ROLE_SEX.BOY and 1 or 0.5
self.userId = data.uid or data.roleUid or data.id
self.playerLiveView = PlayerLiveView:New(self.roleRoot,2, {
skin = data.userSkin,
sex = data.sex,
ride = data.userMount,
designation = data.userTitle,
},sortingorder)
self.playerLiveView:SetNameHeight(1.5)
self.playerLiveView:RemoveTitleCanvas()
if data.userMount == 0 then
self.nameDi.transform.localPosition = namePos[1].pos
else
self.nameDi.transform.localPosition = namePos[2].pos
end
self.name.text = PracticeManager.SetNameColor(data.userName or data.name,data.practiceLevel)
self.nameDi.gameObject:SetActive(true)
local _lv = data.lv
if _lv and _lv >= GlobalSysConfig[108].OpenRules[2] then
self.PracticeIcon:SetActive(true)
PracticeManager.SetPracticeIcon(self.PracticeIcon,data.practiceLevel)
end
end
self.playerLiveView:OnOpen(GetPlayerRoleSingleConFig().Scale2)
self.playerLiveView:OnSortingOrderChange(sortingorder)
if self.isSelf then
self.playerLiveView:SetSelfTag()
self.playerLiveView:SetEffectScale(2)
end
self.playerLiveView.name = "npc"
--角色当前的uv
self.roleCurPos = TileMapView.GetMapData():GetMapData(u, v)
-- LogWarn(self.roleCurPos.u.."||"..self.roleCurPos.v)
self.bLeaderIsIdle = true
self:HideSomeTrash()
self:OnSortingOrderChange(sortingorder)
--当前状态
self.state = 0
self.HaveIconRequest = 0
self.activeState = 0
PlayUIAnim(self.gameObject)
end
function SingleExplorePlayerView:OnSortingOrderChange(orginLayer)
Util.AddParticleSortLayer(self.hitEffect, orginLayer - sortingorder)
if #self.hurtNum > 0 then -- 初始化完成
for i = 1, 3 do
Util.GetGameObject(self.hurtNum[i], "anim"):GetComponent("Canvas").sortingOrder = orginLayer - sortingorder
end
end
sortingorder = orginLayer
end
function SingleExplorePlayerView:HideSomeTrash()
for i = 1, 3 do
self.buffTipList[i]:SetActive(false)
end
end
function SingleExplorePlayerView:Run()
self:SetWalkDir(WALK_DIR.LAUCH)
end
function SingleExplorePlayerView:RefreshHp()
if self.timer then
self.timer:Stop()
self.timer = nil
end
if self.eventPointPos then
self.parent.RemoveSelectIconList(self.eventPointPos)
self.eventPointPos = nil
end
if self.data.formationId > 3100 then
self.blood:SetActive(true)
local hp = ExploreManager.GetHpById(self.data.formationId)
if hp <= 0 then
self.tip.gameObject:SetActive(true)
self.bloodSlider.gameObject:SetActive(false)
self.activeState = 0
self:RefreshPoints()
else
self.bloodSlider.fillAmount = hp/FormationManager.GetFormationPower(self.data.formationId)
self.bloodSlider.gameObject:SetActive(true)
self.tip.gameObject:SetActive(false)
self.activeState = 1
self.activeState = 1
end
else
self.activeState = 1
self.blood:SetActive(false)
end
self:RoleWalkEnd(nil)
end
function SingleExplorePlayerView:RefreshPoints()
if self.timer then
self.timer:Stop()
self.timer = nil
end
local s = function()
local index = 0
for i = 1,#self.exploreList do
self.exploreList[i].gameObject:SetActive(false)
end
Timer.New(function()
index = (index + 1)%pointnum == 0 and pointnum or (index + 1)%pointnum
if self.exploreList[index] then
self.exploreList[index].gameObject:SetActive(true)
end
end,0.25,2):Start()
end
s()
self.timer = Timer.New(s,1,-1,false)
self.timer:Start()
end
function SingleExplorePlayerView:SetWalkDir(dir)
if self.playerLiveView then
self.playerLiveView:SetWalkDir(dir)
end
end
function SingleExplorePlayerView:SetBattleState(state)
self.buffEffectRoot.gameObject:SetActive(state)
end
-- 撞击事件结束后的回调
function SingleExplorePlayerView:hitCallBack(pos)
self:SetWalkDir(WALK_DIR.IDLE_FRONT)
self.state = 0
self.parent.BattleEnd(pos) -- 战斗结束
if self.isSelf then
self:SetEffect(self.selectPointPos)
self.selectPointPos = nil
end
if self.targetTimer then
self.targetTimer:Stop()
self.targetTimer = nil
end
self:SetRoleHitTarget()
self.targetTimer = Timer.New(function () -- 延迟生成下一个小怪
self.parent.LoadPointIcon(false)
end, 0.5)
self.targetTimer:Start()
end
-- 随机一个位置给大爷走走
function SingleExplorePlayerView:SetRoleHitTarget()
if self.activeState == 0 then
self:SetWalkDir(WALK_DIR.IDLE_FRONT)
return
end
if self.thread then
coroutine.stop(self.thread)
self.thread=nil
end
if self.HaveIconRequest == 1 then
self.parent.ReleaseIconList()
end
self.HaveIconRequest = 0
self.thread = coroutine.start(function()
--LogGreen("随机一个位置给大爷走走")
--local eventPoint = self.parent.AsideTriggerJudge(self.roleCurPos,self.isSelf)
--self.parent.AsideTriggerJudge(self.roleCurPos,self.isSelf)
local pos
while not pos do
if self.isclose then
coroutine.yield()
end
coroutine.wait(0.01)
pos = self:SelectTargetPos()
end
--LogGreen("选中的点:"..tostring(pos).." "..tostring(self.userId))
local pathlist = self:SetRoleWalk(pos)
self:RoleMove(pathlist)
end)
end
-- 选择一个目标位置, 就近原则
function SingleExplorePlayerView:SelectTargetPos()
local iconList = self.parent.RequestIconList()
--LogGreen("iconList:"..tostring(iconList))
if iconList and LengthOfTable(iconList) > 0 then
--LogGreen("iconList:"..tostring(LengthOfTable(iconList)))
self.HaveIconRequest = 1
local selectIconList = {}
local minDis = 999
for i, v in pairs(iconList) do
if self.parent.HasSelectIconList(i,self.userId) then
local targetU, targetV = Map_Pos2UV(i)
-- 计算相对距离
local dis = math.abs(self.roleCurPos.u - targetU) + math.abs(self.roleCurPos.v - targetV)
minDis = minDis <= dis and minDis or dis
local data = {}
data.dis = dis
data.x_axis = targetU
data.pos = i
selectIconList[#selectIconList + 1] = data
end
end
-- 取出目标值. 相等则要x最小的
if #selectIconList > 1 then
table.sort(selectIconList, function (a, b)
if a.dis == b.dis then
return a.x_axis < b.x_axis
else
return a.dis < b.dis
end
end )
end
-- 万一图标还没生出来
local targetPos = 0
--LogGreen("#selectIconList:"..#selectIconList.." self.uid:"..self.userId)
if #selectIconList > 1 then
self.parent.RemoveSelectIconList(self.eventPointPos)
self.eventPointPos = selectIconList[1].pos
self.parent.AddSelectIconList(selectIconList[1].pos,self.data.formationId)
targetPos = self:GetTargetPos(selectIconList[1].pos)
else
self.parent.ReleaseIconList()
self.HaveIconRequest = 0
return
end
self.parent.ReleaseIconList()
self.HaveIconRequest = 0
return targetPos
end
end
-- 获取当前图标的目标值,传入图标的坐标值, 就近原则
function SingleExplorePlayerView:GetTargetPos(iconPos)
local u0, v0 = Map_Pos2UV(iconPos)
local posList = {
[1] = Vector2.New(u0, v0 - 1), -- 上
[2] = Vector2.New(u0, v0 + 1), -- 下
[3] = Vector2.New(u0 - 1, v0), -- 左
[4] = Vector2.New(u0 + 1, v0), -- 右
}
local newList = {}
for i = 1, 4 do
local dis = math.abs(self.roleCurPos.u - posList[i].x) + math.abs(self.roleCurPos.v - posList[i].y)
local data = {}
data.dis = dis
data.axis = posList[i]
data.index = i
newList[#newList + 1] = data
end
if #newList > 1 then
table.sort(newList, function (a, b)
if a.dis == b.dis then
return a.axis.x < b.axis.x
else
return a.dis < b.dis
end
end)
end
local pos = posList[newList[1].index]
return pos
end
function SingleExplorePlayerView:SetRoleWalk(targetPos)
local funcCanPass = function(data)
return data.val <= 1
end
local pathList = TileMapView.ShowPath(self.roleCurPos.u, self.roleCurPos.v, targetPos.x, targetPos.y, funcCanPass)
TileMapView.ClearPath()
return pathList
end
function SingleExplorePlayerView:RoleMove(pathList)
if not pathList or #pathList == 0 then
self.parent.AsideTriggerJudge(self.roleCurPos,self.isSelf,self)
return
end
-- --把最终回调最先入栈
-- self.callList:Push(function ()
-- local eventPoint = self.parent.AsideTriggerJudge(self.roleCurPos,self.isSelf,self)
-- self:RoleWalkEnd(eventPoint)
-- end)
for i=1, #pathList-1 do --最后的点为起点,不处理
local data = pathList[i]
local v3 = TileMapView.GetLiveTilePos(data.u, data.v)
self.callList:Push(function ()
self:SetRoleDirAction(data.u, data.v)
self.roleCurPos = data
local speed = 0.5
self.gameObject.transform:DOLocalMove(Vector3(v3.x, v3.y, v3.z - 10), speed, false):OnStart(function () end):OnUpdate(function() --TODO:测试速度
if self.isSelf and not self.isclose then
self:PlayStepSound()
local v4 = self.gameObject.transform.localPosition
v4.z = TileMapView.ViewCameraPos.z
TileMapView.SetCameraPos(v4)
end
end):OnComplete(function ()
self.parent.AsideTriggerJudge(data,self.isSelf,self)
--self:SetRoleHitTarget()
if self.state == 0 then
self:StackPop()
end
end):SetEase(Ease.Linear)
end)
end
self:StackPop()
self:PlayerMove()
end
function SingleExplorePlayerView:PlayerMove()
self.bLeaderIsIdle = false
end
function SingleExplorePlayerView:PlayStepSound()
local curTimeStamp = GetTimeStamp()
if curTimeStamp - self._PlayTimeStamp >= 0.3 then
self._PlayTimeStamp = curTimeStamp
SoundManager.PlaySound(SoundConfig.Sound_FootStep.. 8) --math.random(1,7))
end
end
-- 角色行走结束
function SingleExplorePlayerView:RoleWalkEnd(eventPoint)
self.callList:Clear()
self:PlayerIdle()
if self.eventPointPos then
local iconType = self.eventPointPos.iconId or -1
if iconType == -1 then
self.selectPointPos = Map_UV2Pos(self.eventPointPos.roleCurPos.u,self.eventPointPos.roleCurPos.v)
else
self.selectPointPos = eventPoint.pos
end
--LogGreen("eventPoint.pos:"..tostring(self.selectPointPos))
-- 检测方向
self:SetRoleDir(self.roleCurPos.u * 256 + self.roleCurPos.v, self.selectPointPos)
-- 设置角色纵深
self:SetRoleLayer(self:IsRoleFront(self.selectPointPos))
self:SetIconShow(eventPoint)
else
self:SetRoleHitTarget()
end
end
---检查角色与图标的纵深关系
function SingleExplorePlayerView:IsRoleFront(pos)
local v0 = self.roleCurPos.v
local u, v = Map_Pos2UV(pos)
return v0 >= v
end
function SingleExplorePlayerView:PlayerIdle()
self.bLeaderIsIdle = true
if self.SkeletonGraphic and self.SkeletonGraphic.AnimationState then
self.SkeletonGraphic.AnimationState:SetAnimation(0, "idle", true)
self.SkeletonGraphic.transform.localEulerAngles = Vector3.zero
end
self.curDir = nil
end
-- 角色停止行走时的朝向
function SingleExplorePlayerView:SetRoleDir(rolePos, iconPos)
local u0, v0 = Map_Pos2UV(rolePos)
local u, v = Map_Pos2UV(iconPos)
if v0 == v then
if u0 > u then
self.m_roleFaceDir = Vector2.New(-1, 0)
--LogGreen("他要朝左左左左左")
self.eventpoint = 3
else
self.m_roleFaceDir = Vector2.New(1, 0)
--LogGreen("他要朝右右右右")
self.eventpoint = 4
end
else
if v0 > v then
self.m_roleFaceDir = Vector2.New(0, 1)
--LogGreen("他要朝上上上上")
self.eventpoint = 2
else
self.m_roleFaceDir = Vector2.New(0, -1)
--LogGreen("他要朝下下下下下下")
self.eventpoint = 1
end
end
self:SetWalkDir(self.eventpoint)
end
---设置角色纵深
---@param isFront 设置是否角色在前
function SingleExplorePlayerView:SetRoleLayer(isFront)
local z_axis = isFront and -10 or 10
local v3 = self.gameObject.transform.localPosition
self.gameObject.transform.localPosition = Vector3(v3.x, v3.y, z_axis)
end
-- 角色相关
function SingleExplorePlayerView:SetRoleDirAction(u, v, isBack)
local dU = isBack and self.roleCurPos.u - u or u - self.roleCurPos.u
local dV = isBack and self.roleCurPos.v - v or v - self.roleCurPos.v
if dU > 0 then
self:SetWalkDir(WALK_DIR.RUN_RIGHT)
elseif dU < 0 then
self:SetWalkDir(WALK_DIR.RUN_LEFT)
elseif dV < 0 then
self:SetWalkDir(WALK_DIR.RUN_UP)
elseif dV > 0 then
self:SetWalkDir(WALK_DIR.RUN_DOWN)
end
end
function SingleExplorePlayerView:StackPop()
if self.callList:Count() > 0 then
self.callList:Pop()()
end
end
-- 设置遇到图标时的表现
function SingleExplorePlayerView:SetIconShow(_eventpoint)
local iconType = self.eventPointPos.iconId or -1
--LogGreen("iconType:"..iconType)
local index = (self.eventpoint == 4 or self.eventpoint == 1) and 4 or 3
if iconType == -1 then
self:NotBattleShow()
elseif iconType == 8 or iconType == 11 then -- 宝箱
self:SetWalkDir(WALK_DIR.JINGYA)
if self.isSelf then
self.dialogueRoot.gameObject:SetActive(true)
self.dialogueRoot.transform.localEulerAngles = Vector3.New(0, m_roleTextPos[index].angleOffset, 0)
self.context.transform.localEulerAngles = Vector3.New(0, m_roleTextPos[index].angleOffset, 0)
self.dialogueRoot.transform.localPosition = m_roleTextPos[index].pos
local str = ""
local strList = {}
str = ConfigManager.GetConfigData(ConfigName.MainMapIconConfig,iconType).Desc
strList = string.split(str,"#")
local num = math.random(1,#strList)
self.context.text = strList[num]
local boxPos = self.selectPointPos
Timer.New(function()
if self.state == 1 then
self:SetEffect(boxPos)
end
end,1.5):Start()
end
self:NotBattleShow()
elseif iconType == 7 then -- NPC, 不一样的BB
self:SetWalkDir(WALK_DIR.JINGYA)
if self.isSelf then
local str, str1 = ""
local strList,strList1 = {}
str = ConfigManager.GetConfigData(ConfigName.MainMapIconConfig,iconType).Desc
str1 = ConfigManager.GetConfigData(ConfigName.MainMapIconConfig,iconType).DescNPC
strList = string.split(str,"#")
strList1 = string.split(str1,"#")
local num = math.random(1,#strList)
self.dialogueRoot.gameObject:SetActive(true)
self.dialogueRoot.transform.localEulerAngles = Vector3.New(0, m_roleTextPos[index].angleOffset, 0)
self.context.transform.localEulerAngles = Vector3.New(0, m_roleTextPos[index].angleOffset, 0)
self.dialogueRoot.transform.localPosition = m_roleTextPos[index].pos
self.context.text = strList[num]
-- 设置老头
local oldManAngle = Vector3.New(0, m_oldManTextPos[index].angleOffset, 0)
self.eventPointPos:SetDialogueDir(m_oldManTextPos[index].pos, oldManAngle)
self.eventPointPos:ShowDialogue(false)
self.eventPointPos:SetDialogueStr(strList1[num])
Timer.New(function()
if self.dialogueRoot then
if self.dialogueRoot.gameObject then
self.dialogueRoot.gameObject:SetActive(false)
end
end
if self.state == 1 then
self.eventPointPos:ShowDialogue(true)
self:NotBattleShow()
end
end,1):Start()
else
self:NotBattleShow()
end
self:NotBattleShow()
else -- 战斗
-- 设置战斗状态
self:EnterBattle()
self.dialogueRoot.gameObject:SetActive(false)
self:private_ShakeByTimes(_eventpoint, self.m_roleFaceDir, mapIconConfig[iconType].HurtNum,1,function()
self:hitCallBack(_eventpoint.pos)
end)
end
end
-- 宝箱特效的位置
local boxEffectPos = {
[1] = Vector3.New(44, 140, 0),
[2] = Vector3.New(35, 188, 0),
[3] = Vector3.New(169, 168, 0),
}
function SingleExplorePlayerView:SetEffect(pos)
local boxState = FightPointPassManager.GetBoxState()
boxState = boxState == 0 and 1 or boxState
local tartPos = boxEffectPos[boxState]
--LogGreen("boxState:" ..boxState)
if self.parent.moneyEffect then
self.parent.moneyEffect:GetComponent("RectTransform").anchoredPosition = SetObjPosByUV(pos)
Util.ClearTrailRender(self.parent.moneyEffect)
self:SetBoxEffect(false, Vector3.zero)
self.parent.moneyEffect:SetActive(true)
self.parent.moneyEffect:GetComponent("RectTransform"):DOAnchorPos(Vector2.New(tartPos.x + 88, tartPos.y + 359), 0.6, false):OnComplete(function ()
self:SetBoxEffect(true, boxState)
if self.parent.moneyEffect then
self.parent.moneyEffect:SetActive(false)
end
end)
end
SoundManager.PlaySound(SoundConfig.Sound_FightArea_Gold)
end
-- 设置宝箱特效s
function SingleExplorePlayerView:SetBoxEffect(isShow, state)
if not isShow then
if self.parent.boxEffect then
self.parent.boxEffect:SetActive(false)
end
else
self.parent.boxEffect.transform.localPosition = boxEffectPos[state]
self.parent.boxEffect:SetActive(true)
end
end
function SingleExplorePlayerView:private_ShakeByTimes(_point, roleFaceDir, shakeTime, index, func)
local point = _point.event
local icon = point.go
local start = index
local iconType = point.iconId
local leftNum = math.floor(start % 2)
-- 主动打击者
local go = leftNum == 1 and self.roleRoot or icon
-- 受击对象
local hurtGo = leftNum ~= 1 and self.roleRoot or Util.GetGameObject(icon, "root")
local isReverse = leftNum == 0
local objPos = isReverse and self.roleCurPos.u * 256 + self.roleCurPos.v or _point.pos
local end_callBack = function() -- 受击结束动画
self.hitEffect:SetActive(false)
--LogGreen("end_callBack:"..start)
if start >= shakeTime then
-- 执行最终回调
func()
return
else
start = start + 1
self:private_ShakeByTimes(_point, roleFaceDir, shakeTime, start, func)
end
end
local mid_callBack = function() -- 打击时间点
--LogGreen("mid_callBack:")
self:private_BloodBlood(objPos, start, iconType, isReverse, 0)
self:pravite_PlayHitEffect(objPos)
if point then
point:SetPointAnimation(iconType, 2)
end
--整个东西缩一下
self:PlayScale(hurtGo, 0.7)
if self.isSelf then
SoundManager.PlaySound(SoundConfig.Sound_FightArea_Attack[math.random(1, #SoundConfig.Sound_FightArea_Attack)])
end
end
local func = function()
self:pravite_ShakeObjOnce(go, isReverse, roleFaceDir, end_callBack, mid_callBack)
end
if self.callbackTimer then
self.callbackTimer:Stop()
self.callbackTimer = nil
end
self.callbackTimer = Timer.New(function ()
func()
end, 0.2)
self.callbackTimer:Start()
end
-- 怪物被打得吐血
--- @param showType 参数为0时表示为掉血参数大于0时表示为补血
function SingleExplorePlayerView:private_BloodBlood(objPos, index, iconType, isMonster, showType, func)
local i = math.floor(index % 3 + 1)
-- 吐血随机值
local hurtNum, isCritical = iconAction.pravite_GetHurtValue(isMonster, iconType, showType)
local v2 = SetObjPosByUV(objPos)
self.hurtNum[i]:GetComponent("RectTransform").anchoredPosition3D = Vector3.New(v2.x, v2.y, 0) + Vector3.New(0, 120, 0)
Util.GetGameObject(self.hurtNum[i], "anim/Image"):SetActive(false)
Util.GetGameObject(self.hurtNum[i], "anim/anim"):GetComponent("Text").text = iconAction.DecodeHurt(hurtNum, isCritical, showType)
self.hurtNum[i]:SetActive(true)
-- if self.hurtNumTimer then
-- self.hurtNumTimer:Stop()
-- self.hurtNumTimer = nil
-- end
-- self.hurtNumTimer =
Timer.New(function()
if self.hurtNum[i] then
self.hurtNum[i]:SetActive(false)
end
if func then func() end
end, 1.5):Start()
-- self.hurtNumTimer
end
-- 震动动画
function SingleExplorePlayerView:pravite_ShakeObjOnce(go, isReverse, roleFaceDir, func, mid_func)
if self.isclose then
return
end
--LogGreen("pravite_ShakeObjOnce:"..go.name.." isReverse:"..tostring(isReverse).." roleFaceDir:"..tostring(roleFaceDir))
local offSet = isReverse and 90 or 120
offSet = offSet / math.min(Screen.width/1080, Screen.height/1920)
if not IsNull(go) then
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)
go:GetComponent("RectTransform"):DOAnchorPos(targetPos, 0.1, false):OnComplete(function ()
if mid_func then mid_func() end
go:GetComponent("RectTransform"):DOAnchorPos(originPos, 0.1, false):OnComplete(function ()
if func then func() end
end)
end)
end
end
-- 缩放
function SingleExplorePlayerView:PlayScale(go, scale)
if self.isclose then
return
end
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 SingleExplorePlayerView:pravite_PlayHitEffect(pos)
--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)
--LogGreen("self.hitEffect:")
self.hitEffect.transform.localPosition = SetObjPosByUV(pos)
self.hitEffect:SetActive(true)
end
-- 不是战斗的表现
function SingleExplorePlayerView:NotBattleShow()
if self.battleTimer then
self.battleTimer:Stop()
self.battleTimer = nil
end
if self.targetTimer then
self.targetTimer:Stop()
self.targetTimer = nil
end
self.battleTimer = Timer.New(function ()
self.dialogueRoot.gameObject:SetActive(false)
self.parent.BattleEnd(self.selectPointPos)
self:SetRoleLayer(true)
self:SetBattleState(false)
self.targetTimer = Timer.New(function ()
self.parent.LoadPointIcon(false)
self:SetRoleHitTarget()
self.state = 0
self.selectPointPos = nil
self.eventPointPos = nil
end, 0.5)
self.targetTimer:Start()
end, 1)
self.battleTimer:Start()
end
-- 进入战斗状态
function SingleExplorePlayerView:EnterBattle()
self:SetBattleState(true)
end
function SingleExplorePlayerView:StopAction()
self.callList:Clear()
self:SetWalkDir(WALK_DIR.IDLE_FRONT)
self.hitEffect:SetActive(false)
if self.timer then
self.timer:Stop()
self.timer = nil
end
for i = 1, #self.hurtNum do
self.hurtNum[i].gameObject:SetActive(false)
end
if self.targetTimer then
self.targetTimer:Stop()
self.targetTimer = nil
end
if self.callbackTimer then
self.callbackTimer:Stop()
self.callbackTimer = nil
end
-- if self.hurtNumTimer then
-- self.hurtNumTimer:Stop()
-- self.hurtNumTimer = nil
-- end
if self.battleTimer then
self.battleTimer:Stop()
self.battleTimer = nil
end
--LogGreen("停止协程")
if self.thread then
coroutine.stop(self.thread)
self.thread = nil
end
end
function SingleExplorePlayerView:OnClose()
self.isclose = true
if self.dialogueRoot then
self.dialogueRoot.gameObject:SetActive(false)
end
self:StopAction()
self.hurtNum = {}
self.buffTipList = {}
if self.playerLiveView then
self.playerLiveView:OnClose()
self.playerLiveView = nil
end
--角色当前方向
self.curDir = nil
--当前选中点的位置
self.selectPointPos = 0
--角色停止行走时的朝向
self.eventpoint = 0
--当前触发的事件点
self.eventPointPos = nil
self.state = 0
self.exploreList = {}
end
return SingleExplorePlayerView