920 lines
28 KiB
Lua
920 lines
28 KiB
Lua
--- 关卡小地图
|
||
--- Generated by EmmyLua(https://github.com/EmmyLua)
|
||
--- Created by aaa.
|
||
--- DateTime: 2019/9/25 14:19
|
||
--- 这个该死的地图资源在界面的关闭时就会清除资源,所有延迟的操作(动画,定时器)注意组件可能已经被注销但是还在使用
|
||
--- 对于引用的物体在注销物体时注销引用
|
||
---
|
||
require("Base/Stack")
|
||
require("Modules/Map/Logic/TileMapController")
|
||
require("Modules/Map/Logic/TileMapView")
|
||
require("Modules/Map/Config/MapConfig")
|
||
require("Modules/Map/View/MapPointView")
|
||
local mapIconConfig = ConfigManager.GetConfig(ConfigName.MainMapIconConfig)
|
||
local iconAction = require("Modules/Fight/View/FightMapIconShowView")
|
||
|
||
local this = {}
|
||
local mapCtrl = "MapCtrl"
|
||
this.bLeaderIsIdle = false
|
||
|
||
local callList = Stack.New()
|
||
local funcCanPass = function(data) return data.val <= 1 end
|
||
local curDir
|
||
-- 允许出现的事件点的图标数量
|
||
local iconNum = 3
|
||
-- 被选中去死的事件点
|
||
local selectPointPos = 0
|
||
local isPanelClose = false
|
||
local mapIdList = {
|
||
[1] = 5002,--204,--curFightMapId
|
||
[2] = 4002,
|
||
[3] = 5003,
|
||
}
|
||
local InitCamPos = {
|
||
[4002] = {pos = Vector3.New(27.5, -27.5, -50)},
|
||
[204] = {pos = Vector3.New(20, -15, -50)},
|
||
[5002] = {pos = Vector3.New(27.5, -27.5, -50)},
|
||
[5003] = {pos = Vector3.New(27.5, -18, -50)},
|
||
}
|
||
-- 临时可生成怪的区域
|
||
local monsterArea = {
|
||
[204] = {
|
||
x_pos = {min = 6, max = 16},
|
||
y_pos = {min = 7, max = 9},
|
||
},
|
||
[4002] = {
|
||
x_pos = {min = 10, max = 20},
|
||
y_pos = {min = 10, max = 15},
|
||
},
|
||
[5002] = {
|
||
x_pos = {min = 9, max = 28},
|
||
y_pos = {min = 8, max = 16},
|
||
},
|
||
[5003] = {
|
||
x_pos = {min = 8, max = 29},
|
||
y_pos = {min = 8, max = 14},
|
||
},
|
||
}
|
||
local startUV = {
|
||
[204] = {u = 11, v = 8},
|
||
[4002] = {u = 15, v = 15},
|
||
[5002] = {u = 15, v = 15},
|
||
[5003] = {u = 15, v = 10},
|
||
}
|
||
-- 地图图标的上限值
|
||
local maxIcon = 9
|
||
-- NPC
|
||
local roleRootPath = "UI_effect_DiTu_huoguang"
|
||
local npc1 = "live2d_npc_map"
|
||
local npc2 = "live2d_npc_map_nv"
|
||
local npc, scale
|
||
local testAnims = {
|
||
"jingya",
|
||
"lauch",
|
||
"touch"
|
||
}
|
||
|
||
|
||
-- 当前关卡地图编号
|
||
local m_curMapId = 1011
|
||
|
||
local m_orginLayer
|
||
|
||
|
||
-- 角色停止行走时的朝向, 上 下 左 右,1 2 3 4
|
||
local m_faceDir = 0
|
||
-- 设置角色行走方向
|
||
local WALK_DIR = {
|
||
RIGHT = {animation = "move2", y = 0},
|
||
LEFT = {animation = "move2", y = 180},
|
||
UP = {animation = "move3", y = 0},
|
||
DOWN = {animation = "move", y = 0},
|
||
}
|
||
-- 宝箱特效的位置
|
||
local boxEffectPos = {
|
||
[1] = Vector3.New(44, 140, 0),
|
||
[2] = Vector3.New(35, 188, 0),
|
||
[3] = Vector3.New(169, 168, 0),
|
||
}
|
||
|
||
local m_roleFaceDir = Vector2.New(-1, 0)
|
||
|
||
local SkeletonGraphic
|
||
------------- 关卡地图的相关设置 -----------------
|
||
-- 地图的显示初始位置
|
||
|
||
|
||
-- 关卡地图
|
||
local mapRes = {
|
||
[1] = "r_guanka_bg1",
|
||
[2] = "r_guanka_bg2"
|
||
}
|
||
------------------------------------------------
|
||
local effectPath = "c_xy_0012_skeff_slidesk_ballistic"
|
||
local m_parent
|
||
|
||
-- 缓存2个buff加成信息
|
||
this.buffTipList = {}
|
||
|
||
-- 撞击事件结束后的回调
|
||
local hitCallBack = function ()
|
||
this.targetTimer = nil
|
||
this.BattleEnd() -- 战斗结束
|
||
SkeletonGraphic.AnimationState:SetAnimation(0, "idle", true)
|
||
this.targetTimer = Timer.New(function () -- 延迟生成下一个小怪
|
||
if not isPanelClose then
|
||
this.LoadPointIcon(math.random(1, maxIcon), false)
|
||
this.SetRoleHitTarget()
|
||
end
|
||
end, 0.5)
|
||
this.targetTimer:Start()
|
||
end
|
||
|
||
function this:InitComponent(root, parent)
|
||
m_orginLayer = 0
|
||
m_parent = parent
|
||
this.buffTipList = {}
|
||
-- 地图点击拖动
|
||
this.dragCtrl = Util.GetGameObject(root, "Bg/Ctrl")
|
||
this.effectRoot = Util.GetGameObject(root, "effectRoot")
|
||
this.hitEffect = Util.GetGameObject(this.effectRoot, "UI_Map_XunBaoEffect_hit")
|
||
this.buffTip = Util.GetGameObject(root, "effectRoot/money")
|
||
-- 箱子
|
||
this.boxEffect = Util.GetGameObject(root, "boxRoot/UI_effect_GuaJi_Box_BaoDian")
|
||
|
||
-- buff飘字
|
||
for i = 1, 3 do
|
||
if not this.buffTipList[i] then
|
||
this.buffTipList[i] = newObjToParent(this.buffTip, this.effectRoot)
|
||
this.buffTipList[i].transform.localScale = Vector3.New(1.2, 1.2, 1.2)
|
||
this.buffTipList[i]:SetActive(false)
|
||
end
|
||
end
|
||
|
||
end
|
||
|
||
function this:AddListener()
|
||
Game.GlobalEvent:AddEvent(GameEvent.Adventure.OnRefeshBoxRewardShow, this.HideEffect)
|
||
|
||
end
|
||
|
||
function this:RemoveListener()
|
||
Game.GlobalEvent:RemoveEvent(GameEvent.Adventure.OnRefeshBoxRewardShow, this.HideEffect)
|
||
|
||
end
|
||
|
||
|
||
function this:Init()
|
||
isPanelClose = false
|
||
-- 初始化加载地图块数据
|
||
this:LoadMapData()
|
||
-- 加载一个小人
|
||
this.LoadRole(startUV[m_curMapId].u, startUV[m_curMapId].v)
|
||
-- 初始化两个地图标志
|
||
this.LoadMapIcon()
|
||
|
||
end
|
||
|
||
function this:LoadMapData()
|
||
UIManager.camera.clearFlags = CameraClearFlags.Depth
|
||
-- 所有物体的根节点
|
||
this.mapRoot = poolManager:LoadAsset(mapCtrl, PoolManager.AssetType.GameObject)
|
||
this.mapRoot.name = mapCtrl
|
||
this.mapRoot.transform:SetParent(UIManager.uiRoot.transform.parent)
|
||
this.mapRoot.transform.position = Vector3.New(0, 0, -100)
|
||
|
||
TileMapView.fogSize = 2
|
||
local curChapter = FightPointPassManager.GetCurChapterIndex()
|
||
local index = 1
|
||
index = math.floor((curChapter + 1) % 3 + 1)
|
||
m_curMapId = mapIdList[index]
|
||
-- LogPink("#mapIdList:"..#mapIdList.." m_curMapId:"..m_curMapId.." curChapter:"..curChapter.." index:"..index.." State:"..tostring(FightPointPassManager.isOpenNewChapter))
|
||
TileMapView.AwakeInit(this.mapRoot, m_curMapId, nil, Vector2.New(180, 180))
|
||
TileMapView.isShowFog = false
|
||
|
||
|
||
TileMapController.IsShieldDrag = function()
|
||
--当栈中有逻辑,则拖动可以打断镜头跟随
|
||
|
||
return false
|
||
end
|
||
TileMapController.OnClickTile = this.OnClickTile
|
||
TileMapController.Init(this.mapRoot, this.dragCtrl)
|
||
|
||
TileMapView.Init()
|
||
|
||
--TileMapView.SetSpriteBG(mapRes[index])
|
||
|
||
-- 设置镜头的尺寸
|
||
TileMapView.SetMapScale(Screen.height / 1920)
|
||
|
||
-- 设置相机初始化位置
|
||
local camInitPos = InitCamPos[m_curMapId].pos
|
||
TileMapView.SetCameraPos(camInitPos)
|
||
|
||
callList:Clear()
|
||
-- 设置不点击
|
||
this.dragCtrl:SetActive(false)
|
||
|
||
-- 挂机特效
|
||
this.moneyEffect = poolManager:LoadAsset(effectPath, PoolManager.AssetType.GameObject)
|
||
this.moneyEffect.transform:SetParent(this.effectRoot.transform)
|
||
this.moneyEffect.transform.localScale = Vector3.one
|
||
this.moneyEffect.transform.localPosition = Vector3.New(0, 0, 0)
|
||
this.moneyEffect:SetActive(false)
|
||
|
||
|
||
Util.AddParticleSortLayer(this.moneyEffect, m_parent.sortingOrder - m_orginLayer)
|
||
Util.AddParticleSortLayer(this.hitEffect, m_parent.sortingOrder - m_orginLayer)
|
||
Util.AddParticleSortLayer(this.boxEffect, m_parent.sortingOrder - m_orginLayer)
|
||
m_orginLayer = m_parent.sortingOrder
|
||
--this:OnSortingOrderChange(m_parent.sortingOrder)
|
||
this.boxEffect:SetActive(false)
|
||
end
|
||
function this:OnSortingOrderChange(orginLayer)
|
||
if this.moneyEffect then
|
||
--Util.AddParticleSortLayer(this.moneyEffect, orginLayer - m_orginLayer)
|
||
--Util.AddParticleSortLayer(this.hitEffect, orginLayer - m_orginLayer)
|
||
--Util.AddParticleSortLayer(this.boxEffect, orginLayer -m_orginLayer)
|
||
--m_orginLayer = orginLayer
|
||
iconAction:OnSortingOrderChange(m_parent.sortingOrder)
|
||
Util.AddParticleSortLayer(this.moneyEffect, m_parent.sortingOrder - m_orginLayer)
|
||
Util.AddParticleSortLayer(this.hitEffect, m_parent.sortingOrder - m_orginLayer)
|
||
Util.AddParticleSortLayer(this.boxEffect, m_parent.sortingOrder - m_orginLayer)
|
||
m_orginLayer = m_parent.sortingOrder
|
||
end
|
||
end
|
||
function this.GetCurLayer()
|
||
return m_orginLayer
|
||
end
|
||
|
||
function this.LoadMapIcon()
|
||
this.iconList = {}
|
||
FightPointPassManager.isBeginFight = false
|
||
for i = 1, iconNum do
|
||
this.LoadPointIcon(math.random(1, maxIcon), false)
|
||
end
|
||
|
||
PlayUIAnim(this.role, function ()
|
||
if not isPanelClose then
|
||
-- 初始化延迟一秒启动寻路
|
||
this.startTimer = nil
|
||
this.startTimer = Timer.New(function ()
|
||
this.SetRoleHitTarget()
|
||
end, 1)
|
||
this.startTimer:Start()
|
||
end
|
||
end)
|
||
end
|
||
|
||
|
||
function this.LoadRole(u, v)
|
||
this.role = poolManager:LoadAsset(roleRootPath, PoolManager.AssetType.GameObject)
|
||
this.role:SetActive(false)
|
||
Util.GetGameObject(this.role, "root/ui"):GetComponent("Canvas").worldCamera = TileMapView.GetCamera()
|
||
local v3 = TileMapView.GetLiveTilePos(u, v)
|
||
this.role.transform:SetParent(this.mapRoot.transform)
|
||
this.role.transform.localPosition = Vector3(v3.x, v3.y, v3.z - 10)
|
||
this.role.transform.localScale = Vector3.one * 1.5
|
||
|
||
npc = NameManager.roleSex == ROLE_SEX.BOY and npc1 or npc2
|
||
scale = NameManager.roleSex == ROLE_SEX.BOY and 1 or 0.5
|
||
|
||
this.NpcGO = poolManager:LoadLive(npc, Util.GetTransform(this.role, "root/ui/roleRoot"), Vector3.one * scale, Vector3.zero)
|
||
this.NpcGO.name = "npc"
|
||
this.roleCurPos = TileMapView.GetMapData():GetMapData(u, v)
|
||
|
||
this.roleRoot = Util.GetGameObject(this.role, "root/ui/roleRoot")
|
||
SkeletonGraphic = Util.GetGameObject(this.role, "root/ui/roleRoot/npc"):GetComponent("SkeletonGraphic")
|
||
|
||
SkeletonGraphic.AnimationState:SetAnimation(0, "lauch", false)
|
||
SkeletonGraphic.transform.localEulerAngles = Vector3.zero
|
||
this.bLeaderIsIdle = true
|
||
|
||
this.battleEffect = Util.GetGameObject(this.role, "root/ui/quickBattleEffect")
|
||
|
||
-- 临时代码
|
||
this.dialogueRoot = Util.GetGameObject(this.role, "root/ui/Dialogue")
|
||
this.context = Util.GetGameObject(this.role, "root/ui/Dialogue/Text"):GetComponent("Text")
|
||
|
||
-- buff特效
|
||
this.buffEffectRoot = Util.GetGameObject(this.role, "root/ui/roleRoot/effectRoot")
|
||
this.hitEffect:SetActive(false)
|
||
Util.SetParticleScale(this.buffEffectRoot, 2)
|
||
-- 攻击buff
|
||
this.buffAttack = Util.GetGameObject(this.buffEffectRoot, "r_MapEffect_NewEvent_011")
|
||
-- 防御buff
|
||
this.buffDefend = Util.GetGameObject(this.buffEffectRoot, "r_MapEffect_NewEvent_012")
|
||
|
||
-- 隐藏一堆东西
|
||
this.HideSomeTrash()
|
||
this.SetBattleState(false)
|
||
curDir = nil
|
||
|
||
this.role:SetActive(true)
|
||
|
||
|
||
--- 注册组件
|
||
iconAction.InitRegisterComponent(this)
|
||
|
||
end
|
||
|
||
function this.HideSomeTrash()
|
||
Util.GetGameObject(this.role, "root/ui/arrow"):SetActive(false)
|
||
Util.GetGameObject(this.role, "root/ui/pos"):SetActive(false)
|
||
Util.GetGameObject(this.role, "root/ui/blood"):SetActive(false)
|
||
Util.GetGameObject(this.role, "root/ui/optionCancelBtn"):SetActive(false)
|
||
Util.GetGameObject(this.role, "root/ui/roleOption"):SetActive(false)
|
||
this.buffEffectRoot:SetActive(false)
|
||
|
||
for i = 1, 3 do
|
||
this.buffTipList[i]:SetActive(false)
|
||
end
|
||
|
||
end
|
||
|
||
|
||
---============== Point Icon Handle =================================
|
||
--- 生成一个图标, 传入校验权重值rand, 是否使用动画
|
||
function this.LoadPointIcon(rand, useAnim)
|
||
-- 随机一个坐标
|
||
local area = monsterArea[m_curMapId]
|
||
local u = math.random(area.x_pos.min, area.x_pos.max)
|
||
local v = math.random(area.y_pos.min, area.y_pos.max)
|
||
local pos = Map_UV2Pos(u, v)
|
||
|
||
local mapPointId = rand
|
||
|
||
-- 随机出来的位置已经有图标,则再次随机
|
||
if this.iconList[pos] or pos == 1285 or this.IsHaveBitchNear(pos) then
|
||
this.LoadPointIcon(math.random(1, maxIcon))
|
||
else
|
||
local pointView = MapPointView.New(u, v, mapPointId)
|
||
if pointView then
|
||
pointView.go.transform:SetParent(Util.GetTransform(this.mapRoot, "uiObj#"))
|
||
|
||
local targetPos = TileMapView.GetLiveTilePos(u, v) * 100
|
||
-- 完了这玩意还能从天而降
|
||
if useAnim then
|
||
pointView.go:GetComponent("RectTransform").anchoredPosition3D = Vector3.New(targetPos.x, 1000, 0)
|
||
pointView.go:GetComponent("RectTransform"):DOAnchorPos(targetPos, 0.5, false):OnComplete(function ()
|
||
|
||
end)
|
||
else
|
||
pointView.go:GetComponent("RectTransform").anchoredPosition3D = targetPos
|
||
end
|
||
pointView:SetPointAnimation(pointView.iconId, 1)
|
||
pointView.go.transform.localScale = Vector3.one
|
||
|
||
-- 额外尺寸设置
|
||
if pointView.iconId == MapIconType.ICON_GOLD_BOX or pointView.iconId == MapIconType.ICON_NEW_BOX then
|
||
pointView.go.transform.localScale = Vector3.New(1.3, 1.3, 1.3)
|
||
elseif pointView.iconId == MapIconType.ICON_SUPPLY then
|
||
pointView.go.transform.localScale = Vector3.New(0.8, 0.8, 0.8)
|
||
end
|
||
|
||
|
||
pointView:OnShow()
|
||
pointView:ShowAtkNum(0, false)
|
||
pointView:ShowFreshTime(false)
|
||
pointView:ShowDialogue(false)
|
||
this.iconList[pos] = pointView
|
||
end
|
||
end
|
||
end
|
||
|
||
-- 删除一个图标
|
||
function this.DeletePointIcon(pos)
|
||
if this.iconList[pos] then
|
||
this.iconList[pos]:OnRemovePoint()
|
||
this.iconList[pos] = nil
|
||
end
|
||
end
|
||
|
||
-- 检测当前图标附近是否有图标
|
||
function this.IsHaveBitchNear(pos)
|
||
local haveBitch = false
|
||
local targetU, targetV = Map_Pos2UV(pos)
|
||
for i, v in pairs(this.iconList) do
|
||
local u0, v0 = Map_Pos2UV(i)
|
||
if math.abs(u0 - targetU) + math.abs(v0 - targetV) <= 2 then
|
||
haveBitch = true
|
||
break
|
||
end
|
||
end
|
||
|
||
-- 检测附近是否是角色
|
||
if math.abs(this.roleCurPos.u - targetU) + math.abs(this.roleCurPos.v - targetV) <= 1 then
|
||
haveBitch = true
|
||
end
|
||
|
||
return haveBitch
|
||
end
|
||
|
||
-- 震荡波
|
||
function this.ShakeObjOnce(go, isReverse, func, mid_func)
|
||
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 * m_roleFaceDir.x * value, offSet * m_roleFaceDir.y * value)
|
||
|
||
go:GetComponent("RectTransform"):DOAnchorPos(targetPos, 0.15, false):OnComplete(function ()
|
||
if mid_func then mid_func() end
|
||
go:GetComponent("RectTransform"):DOAnchorPos(originPos, 0.15, false):OnComplete(function ()
|
||
if func then func() end
|
||
end)
|
||
end)
|
||
end
|
||
|
||
|
||
-- 获取当前图标的目标值,传入图标的坐标值, 就近原则
|
||
function this.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 = {}
|
||
-- 检查合理性
|
||
local area = monsterArea[m_curMapId]
|
||
for i = 1, 4 do
|
||
if posList[i].x >= area.x_pos.min and posList[i].x <= area.x_pos.max
|
||
and posList[i].y >= area.y_pos.min and posList[i].y <= area.y_pos.max then
|
||
local dis = math.abs(this.roleCurPos.u - posList[i].x) + math.abs(this.roleCurPos.v - posList[i].y)
|
||
local data = {}
|
||
data.dis = dis
|
||
data.axis = posList[i]
|
||
data.index = i
|
||
newList[#newList + 1] = data
|
||
end
|
||
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 this.SelectTargetPos()
|
||
local iconList = {}
|
||
local minDis = 999
|
||
for i, v in pairs(this.iconList) do
|
||
local targetU, targetV = Map_Pos2UV(i)
|
||
-- 计算相对距离
|
||
local dis = math.abs(this.roleCurPos.u - targetU) + math.abs(this.roleCurPos.v - targetV)
|
||
minDis = minDis <= dis and minDis or dis
|
||
local data = {}
|
||
data.dis = dis
|
||
data.x_axis = targetU
|
||
data.pos = i
|
||
iconList[#iconList + 1] = data
|
||
end
|
||
|
||
-- 取出目标值. 相等则要x最小的
|
||
if #iconList > 1 then
|
||
table.sort(iconList, 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
|
||
if #iconList > 1 then
|
||
selectPointPos = iconList[1].pos
|
||
targetPos = this.GetTargetPos(iconList[1].pos)
|
||
end
|
||
return targetPos
|
||
end
|
||
|
||
---检查角色与图标的纵深关系
|
||
function this.IsRoleFront()
|
||
local v0 = this.roleCurPos.v
|
||
local u, v = Map_Pos2UV(selectPointPos)
|
||
return v0 >= v
|
||
end
|
||
|
||
|
||
---====================================================================
|
||
|
||
-- 角色相关
|
||
function this.SetRoleDirAction(u, v, isBack)
|
||
local dU = isBack and this.roleCurPos.u - u or u - this.roleCurPos.u
|
||
local dV = isBack and this.roleCurPos.v - v or v - this.roleCurPos.v
|
||
|
||
if dU > 0 then
|
||
this.SetWalkDir(WALK_DIR.RIGHT)
|
||
elseif dU < 0 then
|
||
this.SetWalkDir(WALK_DIR.LEFT)
|
||
elseif dV < 0 then
|
||
this.SetWalkDir(WALK_DIR.UP)
|
||
elseif dV > 0 then
|
||
this.SetWalkDir(WALK_DIR.DOWN)
|
||
end
|
||
|
||
end
|
||
|
||
function this.SetWalkDir(dir)
|
||
if not curDir or curDir ~= dir then
|
||
curDir = dir
|
||
SkeletonGraphic.transform.localEulerAngles = Vector3.New(0, dir.y, 0)
|
||
SkeletonGraphic.AnimationState:SetAnimation(0, dir.animation, true)
|
||
end
|
||
end
|
||
|
||
-- 角色停止行走时的朝向
|
||
function this.SetRoleDir(rolePos, iconPos)
|
||
local u0, v0 = Map_Pos2UV(rolePos)
|
||
local u, v = Map_Pos2UV(iconPos)
|
||
if v0 == v then
|
||
if u0 > u then
|
||
m_roleFaceDir = Vector2.New(-1, 0)
|
||
--Log("他要朝左左左左左")
|
||
m_faceDir = 3
|
||
else
|
||
m_roleFaceDir = Vector2.New(1, 0)
|
||
--Log("他要朝右右右右")
|
||
m_faceDir = 4
|
||
end
|
||
else
|
||
if v0 > v then
|
||
m_roleFaceDir = Vector2.New(0, 1)
|
||
--Log("他要朝上上上上")
|
||
m_faceDir = 1
|
||
else
|
||
m_roleFaceDir = Vector2.New(0, -1)
|
||
--Log("他要朝下下下下下下")
|
||
m_faceDir = 2
|
||
end
|
||
end
|
||
|
||
end
|
||
|
||
|
||
function this.PlayerIdle()
|
||
this.bLeaderIsIdle = true
|
||
if SkeletonGraphic and SkeletonGraphic.AnimationState then
|
||
SkeletonGraphic.AnimationState:SetAnimation(0, "idle", true)
|
||
SkeletonGraphic.transform.localEulerAngles = Vector3.zero
|
||
end
|
||
curDir = nil
|
||
end
|
||
|
||
function this.PlayerMove()
|
||
this.bLeaderIsIdle = false
|
||
end
|
||
|
||
--- =============== 行动中的表现处理 =====================================================
|
||
|
||
-- 设置角色的斗姿
|
||
function this.SetBattleState(state)
|
||
this.battleEffect:SetActive(state)
|
||
end
|
||
|
||
-- 角色行走结束
|
||
function this.RoleWalkEnd()
|
||
callList:Clear()
|
||
this.PlayerIdle()
|
||
-- 检测方向
|
||
this.SetRoleDir(this.roleCurPos.u * 256 + this.roleCurPos.v, selectPointPos)
|
||
-- 设置角色纵深
|
||
this.SetRoleLayer(this.IsRoleFront())
|
||
-- 检查一下目标位置是个啥
|
||
this.AsideTrigger()
|
||
end
|
||
|
||
-- 检查一下图标类型, 进行战中表现
|
||
function this.AsideTrigger()
|
||
local eventPoint = this.iconList[selectPointPos]
|
||
this.SetIconShow(eventPoint.iconId)
|
||
end
|
||
|
||
|
||
-- 退出战斗状态
|
||
function this.BattleEnd()
|
||
this.SetBattleState(false)
|
||
|
||
if not isPanelClose then
|
||
-- 删点前隐藏那个东西
|
||
if this.iconList[selectPointPos] then
|
||
this.iconList[selectPointPos]:ShowDialogue(false)
|
||
end
|
||
-- 删除图标
|
||
this.DeletePointIcon(selectPointPos)
|
||
local boxState = FightPointPassManager.GetBoxState()
|
||
boxState = boxState == 0 and 1 or boxState
|
||
-- 播放特效
|
||
this.SetEffect(boxState)
|
||
|
||
-- 结束对话
|
||
iconAction.public_EndDialogue()
|
||
selectPointPos = 0
|
||
curDir = nil
|
||
-- 重置一下
|
||
this.SetRoleLayer(true)
|
||
end
|
||
end
|
||
|
||
-- 进入战斗状态
|
||
function this.EnterBattle()
|
||
this.SetBattleState(true)
|
||
end
|
||
|
||
-- 不是战斗的表现
|
||
function this.NotBattleShow()
|
||
this.battleTimer = nil
|
||
this.targetTimer = nil
|
||
|
||
this.battleTimer = Timer.New(function ()
|
||
if not isPanelClose then
|
||
this.BattleEnd()
|
||
this.targetTimer = Timer.New(function ()
|
||
if not isPanelClose then
|
||
this.LoadPointIcon(math.random(1, maxIcon), false)
|
||
this.SetRoleHitTarget()
|
||
end
|
||
end, 0.5)
|
||
this.targetTimer:Start()
|
||
-- 随意一个动画
|
||
SkeletonGraphic.AnimationState:SetAnimation(0, testAnims[math.random(1, 3)], false)
|
||
end
|
||
end, 1)
|
||
this.battleTimer:Start()
|
||
end
|
||
|
||
|
||
-- 设置遇到图标时的表现
|
||
function this.SetIconShow(iconType)
|
||
local point = this.iconList[selectPointPos]
|
||
|
||
if iconType == 8 or iconType == 11 then -- 宝箱
|
||
SkeletonGraphic.AnimationState:SetAnimation(0, "jingya", false)
|
||
iconAction.public_MeGetBaby(iconType, m_faceDir, point, function ()
|
||
this.NotBattleShow()
|
||
end)
|
||
elseif iconType == 7 then -- NPC, 不一样的BB
|
||
SkeletonGraphic.AnimationState:SetAnimation(0, "jingya", false)
|
||
iconAction.public_MeetYourGrandPa(iconType, m_faceDir, point, function ()
|
||
this.NotBattleShow()
|
||
end)
|
||
|
||
elseif iconType == 3 then -- 回血buff
|
||
SkeletonGraphic.AnimationState:SetAnimation(0, "jingya", false)
|
||
iconAction.public_EndDialogue()
|
||
iconAction.public_GiveMeMilk(iconType, point, m_faceDir, selectPointPos, function ()
|
||
this.NotBattleShow()
|
||
end)
|
||
elseif iconType == 14 then -- 攻击buff
|
||
SkeletonGraphic.AnimationState:SetAnimation(0, "jingya", false)
|
||
iconAction.public_GetBuff(iconType, function ()
|
||
this.NotBattleShow()
|
||
end)
|
||
elseif iconType == 15 then -- 防御buff
|
||
SkeletonGraphic.AnimationState:SetAnimation(0, "jingya", false)
|
||
iconAction.public_GetBuff(iconType, function ()
|
||
this.NotBattleShow()
|
||
end)
|
||
|
||
else -- 战斗
|
||
-- 设置战斗状态
|
||
this.EnterBattle()
|
||
iconAction.public_EndDialogue()
|
||
iconAction.public_SetBattleTimes(point, m_roleFaceDir, mapIconConfig[iconType].HurtNum, this.roleCurPos, selectPointPos, function ()
|
||
hitCallBack()
|
||
end)
|
||
|
||
end
|
||
|
||
end
|
||
|
||
function this.SetEffect(boxState)
|
||
local tartPos = boxEffectPos[boxState]
|
||
|
||
this.moneyEffect:GetComponent("RectTransform").anchoredPosition = SetObjPosByUV(selectPointPos)
|
||
Util.ClearTrailRender(this.moneyEffect)
|
||
this.SetBoxEffect(false, Vector3.zero)
|
||
if not FightPointPassManager.isBeginFight then
|
||
this.moneyEffect:SetActive(true)
|
||
end
|
||
this.moneyEffect:GetComponent("RectTransform"):DOAnchorPos(Vector2.New(tartPos.x + 88, tartPos.y + 359), 0.6, false):OnComplete(function ()
|
||
-- 这些该死的延迟动画
|
||
if isPanelClose then return end
|
||
if this.moneyEffect then
|
||
this.moneyEffect:SetActive(false)
|
||
end
|
||
if not FightPointPassManager.isBeginFight then
|
||
this.SetBoxEffect(true, boxState)
|
||
end
|
||
end)
|
||
SoundManager.PlaySound(SoundConfig.Sound_FightArea_Gold)
|
||
end
|
||
|
||
-- 设置宝箱特效
|
||
function this.SetBoxEffect(isShow, state)
|
||
if not isShow then
|
||
if this.boxEffect then
|
||
this.boxEffect:SetActive(false)
|
||
end
|
||
else
|
||
this.boxEffect.transform.localPosition = boxEffectPos[state]
|
||
this.boxEffect:SetActive(true)
|
||
end
|
||
end
|
||
|
||
-- 弹出奖励面板时,如果特效正在飞行,则隐藏特效
|
||
function this.HideEffect()
|
||
|
||
end
|
||
|
||
|
||
|
||
--- ==================== 角色行走 =====================================
|
||
function this.OnClickTile(u, v)
|
||
Log("UIManager.width is -- " .. UIManager.width .. " and Height is " .. UIManager.height)
|
||
local v2 = RectTransformUtility.WorldToScreenPoint(TileMapView.GetCamera(), TileMapView.GetLiveTilePos(u, v))
|
||
v2 = v2 / math.min(Screen.width/1080, Screen.height/1920)
|
||
Log(string.format(Language[10615], u, v))
|
||
Log(string.format(Language[10616], v2.x, v2.y))
|
||
end
|
||
|
||
---设置角色纵深
|
||
---@param isFront 设置是否角色在前
|
||
function this.SetRoleLayer(isFront)
|
||
local z_axis = isFront and -10 or 10
|
||
local v3 = this.role.transform.localPosition
|
||
this.role.transform.localPosition = Vector3(v3.x, v3.y, z_axis)
|
||
end
|
||
|
||
-- 随机一个位置给大爷走走
|
||
function this.SetRoleHitTarget()
|
||
local pos = this.SelectTargetPos()
|
||
this.SetRoleWalk(pos)
|
||
end
|
||
|
||
-- 角色在行走
|
||
function this.OnRoleWalk()
|
||
iconAction.JudgeBuffState(this.roleCurPos.u, this.roleCurPos.v)
|
||
end
|
||
|
||
function this.SetRoleWalk(targetPos)
|
||
local pathList = TileMapView.ShowPath(this.roleCurPos.u, this.roleCurPos.v, targetPos.x, targetPos.y, funcCanPass)
|
||
-- 不显示那啥,暴露痕迹
|
||
TileMapView.ClearPath()
|
||
this.RoleMove(pathList)
|
||
end
|
||
|
||
function this.RoleMove(pathList)
|
||
--把最终回调最先入栈
|
||
callList:Push(function ()
|
||
this.RoleWalkEnd()
|
||
end)
|
||
|
||
if not pathList or #pathList == 0 then
|
||
Log(Language[10617])
|
||
return
|
||
end
|
||
|
||
if isPanelClose then
|
||
return
|
||
end
|
||
|
||
for i=1, #pathList-1 do --最后的点为起点,不处理
|
||
local data = pathList[i]
|
||
local v3 = TileMapView.GetLiveTilePos(data.u, data.v)
|
||
callList:Push(function ()
|
||
this.SetRoleDirAction(data.u, data.v)
|
||
this.roleCurPos = data
|
||
this.OnRoleWalk()
|
||
|
||
local speed = iconAction.GetRoleSpeed()
|
||
if not speed or speed <= 0 then
|
||
speed = 0.7
|
||
end
|
||
this.role.transform:DOLocalMove(Vector3(v3.x, v3.y, v3.z - 10), speed, false):OnStart(function () end):OnUpdate(function() --TODO:测试速度
|
||
if isPanelClose then return end
|
||
this.PlayStepSound()
|
||
local v4 = this.role.transform.localPosition
|
||
v4.z = TileMapView.ViewCameraPos.z
|
||
TileMapView.SetCameraPos(v4)
|
||
end):OnComplete(function ()
|
||
if isPanelClose then return end
|
||
TileMapView.ClearPathTile(data.u, data.v)
|
||
this.StackPop()
|
||
end):SetEase(Ease.Linear)
|
||
end)
|
||
end
|
||
-- 退出第一个栈
|
||
this.StackPop()
|
||
this.PlayerMove()
|
||
end
|
||
|
||
--
|
||
local _PlayTimeStamp = 0
|
||
function this.PlayStepSound()
|
||
local curTimeStamp = GetTimeStamp()
|
||
if curTimeStamp - _PlayTimeStamp >= 0.3 then
|
||
_PlayTimeStamp = curTimeStamp
|
||
|
||
SoundManager.PlaySound(SoundConfig.Sound_FootStep..math.random(1,7))
|
||
end
|
||
end
|
||
|
||
function this.StackPop()
|
||
if callList:Count() > 0 then
|
||
callList:Pop()()
|
||
end
|
||
end
|
||
|
||
-- 停止一切该死的行为
|
||
function this.StopAction()
|
||
callList:Clear()
|
||
FightPointPassManager.isBeginFight = true
|
||
SkeletonGraphic.AnimationState:SetAnimation(0, "idle", true)
|
||
this.moneyEffect:SetActive(false)
|
||
this.hitEffect:SetActive(false)
|
||
iconAction.public_HideEffect()
|
||
|
||
end
|
||
|
||
--- ======================================================================
|
||
function this.OnGameOver()
|
||
-- 主动退出时会清除一下,整个游戏退出时会清除所有,此时界面再主动退出时已经销毁了
|
||
if this.buffEffectRoot then
|
||
Util.SetParticleScale(this.buffEffectRoot, 0.5)
|
||
end
|
||
|
||
if this.mapRoot then -- 避免不是主动退出
|
||
Log(Language[10618])
|
||
poolManager:UnLoadAsset(mapCtrl, this.mapRoot, PoolManager.AssetType.GameObject)
|
||
poolManager:UnLoadAsset(roleRootPath, this.role, PoolManager.AssetType.GameObject)
|
||
poolManager:UnLoadAsset(npc, this.NpcGO, PoolManager.AssetType.GameObject)
|
||
poolManager:UnLoadAsset(effectPath, this.moneyEffect, PoolManager.AssetType.GameObject)
|
||
UIManager.camera.clearFlags = CameraClearFlags.Skybox
|
||
TileMapView.Exit()
|
||
TileMapController.Exit()
|
||
end
|
||
this.mapRoot = nil
|
||
this.role = nil
|
||
this.NpcGO = nil
|
||
this.moneyEffect = nil
|
||
this.buffEffectRoot = nil
|
||
|
||
for i, v in pairs(this.iconList) do
|
||
if v then
|
||
v:Dispose()
|
||
this.iconList[i] = nil
|
||
end
|
||
end
|
||
|
||
end
|
||
|
||
function this:OnClose()
|
||
|
||
end
|
||
|
||
function this:Dispose()
|
||
isPanelClose = true
|
||
FightPointPassManager.enterFightBattle = false
|
||
if this.targetTimer then
|
||
this.targetTimer:Stop()
|
||
end
|
||
if this.startTimer then
|
||
this.startTimer:Stop()
|
||
end
|
||
|
||
if this.idleTimer then
|
||
this.idleTimer:Stop()
|
||
end
|
||
|
||
this.idleTimer = nil
|
||
this.targetTimer = nil
|
||
this.startTimer = nil
|
||
|
||
if callList:Count() > 0 then
|
||
callList:Clear()
|
||
end
|
||
|
||
iconAction.public_DestroyRegisterComponent()
|
||
|
||
|
||
this.OnGameOver()
|
||
end
|
||
|
||
return this |