470 lines
16 KiB
Lua
470 lines
16 KiB
Lua
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 monsterArea = {
|
||
[5005] = {
|
||
x_pos = {min = 8, max = 28},
|
||
y_pos = {min = 8, max = 14},
|
||
},
|
||
[4002] = {
|
||
x_pos = {min = 8, max = 24},
|
||
y_pos = {min = 9, max = 23},
|
||
},
|
||
[4001] = {
|
||
x_pos = {min = 8, max = 24},
|
||
y_pos = {min = 9, max = 23},
|
||
},
|
||
[4004] = {
|
||
x_pos = {min = 8, max = 24},
|
||
y_pos = {min = 9, max = 23},
|
||
},
|
||
[5002] = {
|
||
x_pos = {min = 9, max = 32},
|
||
y_pos = {min = 8, max = 16},
|
||
},
|
||
[5003] = {
|
||
x_pos = {min = 8, max = 28},
|
||
y_pos = {min = 8, max = 14},
|
||
},
|
||
[5004] = {
|
||
x_pos = {min = 8, max = 27},
|
||
y_pos = {min = 8, max = 15},
|
||
},
|
||
}
|
||
|
||
--自己角色的出生点
|
||
local startUV = {
|
||
[5005] = {u = 15, v = 10},
|
||
[4001] = {u = 15, v = 15},
|
||
[4002] = {u = 15, v = 15},
|
||
[4004] = {u = 15, v = 15},
|
||
[5002] = {u = 15, v = 15},
|
||
[5003] = {u = 15, v = 10},
|
||
[5004] = {u = 15, v = 10},
|
||
}
|
||
|
||
-- 允许出现的事件点的图标数量
|
||
local iconNum = 20
|
||
-- 地图图标的上限值
|
||
local maxIcon = 9
|
||
|
||
local mapCtrl = "MapCtrl"
|
||
local effectPath = "c_xy_0012_skeff_slidesk_ballistic"
|
||
local m_orginLayer = 0
|
||
local m_parent
|
||
this.isClose = false
|
||
--root FightPointPassMainPanel.gameObject FightPointPassMainPanel脚本
|
||
function this:InitComponent(root, parent)
|
||
m_orginLayer = 0
|
||
m_parent = parent
|
||
-- 地图点击拖动
|
||
this.root = root
|
||
this.dragCtrl = Util.GetGameObject(root, "Ctrl")
|
||
this.effectRoot = Util.GetGameObject(root, "effectRoot")
|
||
this.buffTip = Util.GetGameObject(this.effectRoot, "money")
|
||
this.playerViews = {}
|
||
end
|
||
|
||
function this:AddListener()
|
||
Game.GlobalEvent:AddEvent(GameEvent.Explore.UpdateSingleFormation,this.Refresh)
|
||
end
|
||
|
||
function this:RemoveListener()
|
||
Game.GlobalEvent:RemoveEvent(GameEvent.Explore.UpdateSingleFormation,this.Refresh)
|
||
end
|
||
|
||
function this.Refresh(teamId)
|
||
if not this.playerViews[teamId] then
|
||
return
|
||
end
|
||
this.playerViews[teamId]:RefreshHp()
|
||
if ExploreManager.FormationData[teamId].state < 1 then
|
||
this.playerViews[teamId]:RefreshIsSelf(false)
|
||
SubUIManager.Close(this.playerViews[teamId])
|
||
this.playerViews[teamId] = nil
|
||
if this.playerViews[0].data.formationId == teamId then
|
||
this.playerViews[0] = nil
|
||
end
|
||
end
|
||
if not this.playerViews[0] then
|
||
for k,v in pairs(this.playerViews) do
|
||
if v.data.formationId > 3100 then
|
||
this.playerViews[0] = v
|
||
this.playerViews[v.data.formationId]:RefreshIsSelf(true)
|
||
this.playerViews[0] = this.playerViews[v.data.formationId]
|
||
break
|
||
end
|
||
end
|
||
if this.playerViews[0] then
|
||
-- 设置相机初始化位置
|
||
local v4 = this.playerViews[0].transform.localPosition
|
||
v4.z = -50
|
||
TileMapView.SetCameraPos(v4)
|
||
end
|
||
end
|
||
end
|
||
|
||
function this:Init()
|
||
this.isClose = false
|
||
this.isCanUseIconList = 0
|
||
-- 初始化加载地图块数据
|
||
this:LoadMapData()
|
||
-- 加载一个小人
|
||
NetManager.ExplorerMapPlayerInfoRequest(m_parent.mapData.mapId,function(msg)
|
||
local NPCList = ExploreManager.InitMapUserInfosData(msg,m_parent.mapData.mapId)
|
||
local area = monsterArea[m_parent.mapData.exploreMapId]
|
||
local suv = startUV[m_parent.mapData.exploreMapId]
|
||
for k,v in pairs(NPCList) do
|
||
local index1 = math.random(area.x_pos.min,suv.u - 3)
|
||
local index2 = math.random(suv.u + 3,area.x_pos.max)
|
||
local index3 = math.random(1,2)
|
||
local index4 = math.random(area.y_pos.min,area.y_pos.max)
|
||
this.playerViews[v.formationId] = SubUIManager.Open(SubUIConfig.SingleExplorePlayerView,this.mapRoot.transform,this)
|
||
this.playerViews[v.formationId]:SetData((index3 == 1 and index1 or index2),index4,v)
|
||
if v.formationId > 3100 then
|
||
if not this.playerViews[0] then
|
||
this.playerViews[v.formationId]:RefreshIsSelf(true)
|
||
this.playerViews[0] = this.playerViews[v.formationId]
|
||
else
|
||
this.playerViews[v.formationId]:RefreshIsSelf(false)
|
||
end
|
||
else
|
||
this.playerViews[v.formationId]:RefreshIsSelf(false)
|
||
end
|
||
|
||
this.playerViews[v.formationId]:Run()
|
||
this.playerViews[v.formationId]:RefreshHp(v.formationId)
|
||
end
|
||
-- 设置相机初始化位置
|
||
local v4 = this.playerViews[0].transform.localPosition
|
||
v4.z = -50
|
||
TileMapView.SetCameraPos(v4)
|
||
-- 初始化两个地图标志
|
||
this.LoadMapIcon()
|
||
--this.SetPlayerViewWalk()
|
||
end)
|
||
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
|
||
TileMapView.AwakeInit(this.mapRoot, m_parent.mapData.exploreMapId, 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.SetMapScale(Screen.height / 1920)
|
||
|
||
-- 设置不点击
|
||
this.dragCtrl:SetActive(false)
|
||
m_orginLayer = m_parent.sortingOrder
|
||
end
|
||
|
||
--加载图标icon
|
||
function this.LoadMapIcon()
|
||
this.iconList = {}
|
||
this.selectIconList = {}
|
||
--FightPointPassManager.isBeginFight = false
|
||
for i = 1, iconNum do
|
||
this.LoadPointIcon(false)
|
||
end
|
||
end
|
||
|
||
this.isCanUseIconList = 0
|
||
function this.RequestIconList()
|
||
if this.isCanUseIconList == 0 then
|
||
this.isCanUseIconList = 1
|
||
return this.iconList
|
||
end
|
||
return nil
|
||
end
|
||
|
||
function this.ReleaseIconList()
|
||
this.isCanUseIconList = 0
|
||
end
|
||
|
||
function this.AsideTriggerJudge(data,isSelf,_userData)
|
||
local isGetIconList = false
|
||
local iconList = this.iconList
|
||
if not this.threads then
|
||
this.threads = {}
|
||
end
|
||
if this.threads[_userData.data.formationId] then
|
||
coroutine.stop(this.threads[_userData.data.formationId])
|
||
this.threads[_userData.data.formationId] = nil
|
||
end
|
||
this.threads[_userData.data.formationId] = coroutine.start(function()
|
||
while(not isGetIconList) do
|
||
if this.isClose and this.isClose == true then
|
||
coroutine.stop(this.threads[_userData.data.formationId])
|
||
this.threads[_userData.data.formationId] = nil
|
||
this.ReleaseIconList()
|
||
coroutine.yield()
|
||
end
|
||
--Log("没有得到访问权")
|
||
iconList = this.RequestIconList()
|
||
if iconList and LengthOfTable(iconList) > 0 then
|
||
isGetIconList = true
|
||
else
|
||
--Log("等待中")
|
||
coroutine.wait(0.1)
|
||
end
|
||
end
|
||
--Log("得到了访问权")
|
||
|
||
-- for k,v in pairs(iconList) do
|
||
-- --Log("iconList k:"..tostring(k))
|
||
-- end
|
||
|
||
local selfPos = Map_UV2Pos(data.u, data.v)
|
||
--Log("selfPos:"..tostring(selfPos))
|
||
local posList = {}
|
||
posList[1] = Map_UV2Pos(data.u - 1, data.v)
|
||
posList[2] = Map_UV2Pos(data.u + 1, data.v)
|
||
posList[3] = Map_UV2Pos(data.u, data.v - 1)
|
||
posList[4] = Map_UV2Pos(data.u, data.v + 1)
|
||
for k,pos in pairs(posList) do
|
||
--Log("posList pos:"..tostring(pos))
|
||
if iconList[pos] and this.HasSelectIconList(pos,_userData.data.formationId) then
|
||
this.RemoveSelectIconList(_userData.eventPointPos)
|
||
this.AddSelectIconList(pos,_userData.data.formationId)
|
||
--Log("发送了消息")
|
||
Game.GlobalEvent:DispatchEvent(GameEvent.GuaJi.getEvent,{goData = _userData, event = iconList[pos], pos = pos})
|
||
coroutine.stop(this.threads[_userData.data.formationId])
|
||
this.threads[_userData.data.formationId] = nil
|
||
this.ReleaseIconList()
|
||
coroutine.yield()
|
||
end
|
||
end
|
||
--Log("周围没有事件")
|
||
if this.threads[_userData.data.formationId] then
|
||
coroutine.stop( this.threads[_userData.data.formationId])
|
||
this.threads[_userData.data.formationId] = nil
|
||
end
|
||
this.ReleaseIconList()
|
||
coroutine.yield()
|
||
end)
|
||
end
|
||
|
||
function this.HasSelectIconList(pos,uid)
|
||
if this.selectIconList[pos] and this.selectIconList[pos] ~= uid then
|
||
return false
|
||
else
|
||
return true
|
||
end
|
||
end
|
||
|
||
function this.AddSelectIconList(pos,uid)
|
||
this.selectIconList[pos] = uid
|
||
end
|
||
|
||
function this.RemoveSelectIconList(pos)
|
||
if this.selectIconList[pos] then
|
||
this.selectIconList[pos] = nil
|
||
end
|
||
end
|
||
|
||
--- 生成一个图标, 传入校验权重值rand, 是否使用动画
|
||
function this.LoadPointIcon(useAnim)
|
||
if LengthOfTable(this.iconList) >= iconNum then
|
||
return
|
||
end
|
||
-- 随机一个坐标
|
||
local area = monsterArea[m_parent.mapData.exploreMapId]
|
||
--Log("area.x_pos.min:"..tostring(area.x_pos.min).." area.x_pos.max:"..tostring(area.x_pos.max))
|
||
local u = math.random(area.x_pos.min, area.x_pos.max)
|
||
--Log("area.y_pos.min:"..tostring(area.y_pos.min).." area.y_pos.max:"..tostring(area.y_pos.max))
|
||
local v = math.random(area.y_pos.min, area.y_pos.max)
|
||
--Log("u:"..tostring(u).." v:"..tostring(v))
|
||
local pos = Map_UV2Pos(u, v)
|
||
|
||
local mapPointId = math.random(1,maxIcon)
|
||
-- 随机出来的位置已经有图标,则再次随机
|
||
if this.iconList[pos] or pos == 1285 or this.IsHaveBitchNear(pos) then
|
||
this.LoadPointIcon()
|
||
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
|
||
this.RemoveSelectIconList(pos)
|
||
end
|
||
end
|
||
end
|
||
|
||
---------------------------------------------------------------------------------------------设置特效层级
|
||
function this:OnSortingOrderChange(orginLayer)
|
||
if this.moneyEffect then
|
||
for k,v in pairs(this.playerViews) do
|
||
v:OnSortingOrderChange(m_parent.sortingOrder)
|
||
end
|
||
m_orginLayer = m_parent.sortingOrder
|
||
end
|
||
end
|
||
function this.GetCurLayer()
|
||
return m_orginLayer
|
||
end
|
||
-------------------------------------------------------------------------------------------------------------
|
||
|
||
---============== Point Icon Handle =================================
|
||
|
||
-- 删除一个图标
|
||
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
|
||
return haveBitch
|
||
end
|
||
|
||
--- =============== 行动中的表现处理 =====================================================
|
||
|
||
-- 退出战斗状态
|
||
function this.BattleEnd(selectPointPos,isSelf)
|
||
--Log("战斗结束回调")
|
||
-- 删点前隐藏那个东西
|
||
if this.iconList[selectPointPos] then
|
||
this.iconList[selectPointPos]:ShowDialogue(false)
|
||
end
|
||
-- 删除图标
|
||
this.DeletePointIcon(selectPointPos)
|
||
this.RemoveSelectIconList(selectPointPos)
|
||
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("当前点击坐标(%s, %s)", u, v))
|
||
--Log(string.format("转换后的屏幕坐标是(%s, %s)", v2.x, v2.y))
|
||
end
|
||
|
||
|
||
-- 停止一切该死的行为
|
||
function this.StopAction()
|
||
for k,v in pairs(this.playerViews) do
|
||
v:StopAction()
|
||
end
|
||
if this.moneyEffect then
|
||
this.moneyEffect.gameObject:SetActive(false)
|
||
end
|
||
if this.threads then
|
||
for k,v in pairs(this.threads) do
|
||
coroutine.stop(v)
|
||
this.threads[k] = nil
|
||
end
|
||
end
|
||
this.threads = {}
|
||
this.ReleaseIconList()
|
||
this.isClose = true
|
||
end
|
||
|
||
--- ======================================================================
|
||
function this.OnGameOver()
|
||
-- Log("OnGameOver")
|
||
for i, v in pairs(this.playerViews) do
|
||
if v then
|
||
SubUIManager.Close(v)
|
||
end
|
||
end
|
||
this.playerViews = {}
|
||
for i, v in pairs(this.iconList) do
|
||
if v then
|
||
v:Dispose()
|
||
this.iconList[i] = nil
|
||
end
|
||
end
|
||
if this.mapRoot then -- 避免不是主动退出
|
||
-- Log("注销一次地图资源")
|
||
poolManager:UnLoadAsset(mapCtrl, this.mapRoot, 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.moneyEffect = nil
|
||
end
|
||
|
||
function this:OnClose()
|
||
this:RemoveListener()
|
||
-- Log("关闭挂机:OnClose")
|
||
if this.startTimer then
|
||
this.startTimer:Stop()
|
||
end
|
||
this.startTimer = nil
|
||
this.StopAction()
|
||
this.OnGameOver()
|
||
end
|
||
|
||
function this:Dispose()
|
||
if this.startTimer then
|
||
this.startTimer:Stop()
|
||
end
|
||
this.startTimer = nil
|
||
this.StopAction()
|
||
this.OnGameOver()
|
||
end
|
||
|
||
return this |