291 lines
8.6 KiB
Lua
291 lines
8.6 KiB
Lua
require("Modules/Map/Logic/TileMapView")
|
||
|
||
--在地块表现数据类之上派生一层控制类
|
||
TileMapController = {}
|
||
local this = TileMapController
|
||
--保存触碰点,做双点缩放和单点移动判定
|
||
local _touch1, _touch2
|
||
-- 移动后产生的缓动效果
|
||
local _moveTween
|
||
--缩放的中心点
|
||
local _scalePoint = Vector2.zero
|
||
--事件系统
|
||
local _trigger
|
||
--缓动到目标的缩放大小
|
||
local _targetScale
|
||
--区分点击/拖动
|
||
local _isClicked
|
||
|
||
--委托实现
|
||
this.OnMove = nil
|
||
this.OnMoveEnd = nil
|
||
this.OnDispose = nil
|
||
this.OnShowTile = nil
|
||
this.OnClickTile = nil
|
||
this.OnLongClickTile = nil
|
||
this.OnScale = nil
|
||
this.OnLongClickShowPath = nil
|
||
--是否屏蔽拖动
|
||
this.IsShieldDrag = nil
|
||
|
||
--监听长按事件
|
||
local timePressStarted
|
||
local bLongPressTriggered
|
||
local timePressData
|
||
local longClickMapU
|
||
local longClickMapV
|
||
local update = function()
|
||
if _isClicked then
|
||
if Time.realtimeSinceStartup - timePressStarted > 0.4 then
|
||
if not bLongPressTriggered then
|
||
local uv = TileMapView.GetLiveTileInScreenPos(Input.mousePosition)
|
||
if longClickMapU ~= uv[1] or longClickMapV ~= uv[2] then
|
||
longClickMapU = uv[1]
|
||
longClickMapV = uv[2]
|
||
if this.OnLongClickShowPath then
|
||
--this.OnLongClickShowPath(uv[1], uv[2])
|
||
end
|
||
end
|
||
bLongPressTriggered = true
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
function this.Init(CtrlGO, go)
|
||
_trigger = Util.GetEventTriggerListener(go)
|
||
if _trigger then
|
||
_trigger.onPointerDown = _trigger.onPointerDown + this.OnPointerDown
|
||
_trigger.onPointerUp = _trigger.onPointerUp + this.OnPointerUp
|
||
_trigger.onScroll = _trigger.onScroll + this.OnScrollMouse
|
||
_trigger.onBeginDrag = _trigger.onBeginDrag + this.OnBeginDarg
|
||
_trigger.onDrag = _trigger.onDrag + this.OnDrag
|
||
_trigger.onEndDrag = _trigger.onEndDrag + this.OnEndDrag
|
||
end
|
||
|
||
_moveTween = CtrlGO:GetComponent(typeof(UITweenSpring))
|
||
if not _moveTween then
|
||
_moveTween = CtrlGO:AddComponent(typeof(UITweenSpring))
|
||
end
|
||
_moveTween.enabled = false
|
||
_moveTween.OnUpdate = this.SetPosition
|
||
_moveTween.OnMoveEnd = this.OnMapTweenEnd
|
||
_moveTween.MomentumAmount = 0.5
|
||
_moveTween.Strength = 50
|
||
|
||
UpdateBeat:Add(update, this)
|
||
this.SetScale(TileMapView.GetMapScale())
|
||
_touch1, _touch2 = nil, nil
|
||
end
|
||
|
||
function this.Exit()
|
||
if _trigger then
|
||
_trigger.onPointerDown = _trigger.onPointerDown - this.OnPointerDown
|
||
_trigger.onPointerUp = _trigger.onPointerUp - this.OnPointerUp
|
||
_trigger.onScroll = _trigger.onScroll - this.OnScrollMouse
|
||
_trigger.onBeginDrag = _trigger.onBeginDrag - this.OnBeginDarg
|
||
_trigger.onDrag = _trigger.onDrag - this.OnDrag
|
||
_trigger.onEndDrag = _trigger.onEndDrag - this.OnEndDrag
|
||
end
|
||
_moveTween = nil
|
||
|
||
this.OnMove = nil
|
||
this.OnMoveEnd = nil
|
||
this.OnDispose = nil
|
||
this.OnShowTile = nil
|
||
this.OnClickTile = nil
|
||
this.OnScale = nil
|
||
|
||
this.IsShieldDrag = nil
|
||
UpdateBeat:Remove(update, self)
|
||
end
|
||
|
||
function this.SetEnable(enabled)
|
||
_trigger.enabled = enabled
|
||
_touch1, _touch2 = nil, nil
|
||
end
|
||
|
||
function this.OnMapTweenEnd()
|
||
this.SetPosition2(Vector3.zero, true)
|
||
end
|
||
|
||
function this.OnPointerDown(Pointgo, data)
|
||
data:Use()
|
||
if not _touch1 then
|
||
_touch1 = data
|
||
elseif not _touch2 and _touch1 ~= data then --当切出unity应用时,第一次点击将接收不到OnPointerUp事件
|
||
_touch2 = data
|
||
end
|
||
if _touch1 and _touch2 then
|
||
_moveTween.enabled = false
|
||
end
|
||
|
||
local b = (_touch1 and not _touch2) or (_touch2 and not _touch1)
|
||
if b then
|
||
timePressStarted = Time.realtimeSinceStartup
|
||
timePressData = data
|
||
bLongPressTriggered = false
|
||
end
|
||
_isClicked = b
|
||
end
|
||
|
||
function this.OnPointerUp(Pointgo, data)
|
||
data:Use()
|
||
if _touch1 == data then
|
||
_touch1 = nil
|
||
elseif _touch2 == data then
|
||
_touch2 = nil
|
||
end
|
||
if not _touch1 and not _touch2 then
|
||
if bLongPressTriggered then
|
||
if this.OnLongClickTile then
|
||
this.OnLongClickTile()
|
||
end
|
||
else
|
||
if _isClicked then
|
||
if this.OnClickTile then
|
||
local uv, fuv = TileMapView.GetLiveTileInScreenPos(data.position)
|
||
this.OnClickTile(uv[1], uv[2], fuv)
|
||
end
|
||
end
|
||
end
|
||
end
|
||
_isClicked = false
|
||
end
|
||
|
||
function this.OnBeginDarg(Pointgo, data)
|
||
if (_touch1 and not _touch2) or (_touch2 and not _touch1) then
|
||
if _touch1 == data then
|
||
_moveTween.enabled = true
|
||
_moveTween.Momentum = Vector3.zero
|
||
_moveTween.IsUseCallBack = false
|
||
end
|
||
_isClicked = false
|
||
end
|
||
data:Use()
|
||
end
|
||
|
||
function this.OnDrag(Pointgo, data)
|
||
if _touch1 or _touch2 then
|
||
if _touch1 and _touch2 then --双点缩放
|
||
local distance = Vector2.Distance(_touch1.position, _touch2.position)
|
||
local distance1 = Vector2.Distance(_touch1.pressPosition, _touch2.pressPosition)
|
||
if distance1 <= 0 then
|
||
return
|
||
end
|
||
|
||
_scalePoint = Vector2.Lerp(_touch1.position, _touch2.position, 0.5)
|
||
local scale = TileMapView.GetMapScale() - (distance1 - distance) / Screen.width / 10
|
||
this.SetScale(scale)
|
||
else --单点移动
|
||
if bLongPressTriggered then
|
||
local uv = TileMapView.GetLiveTileInScreenPos(data.position)
|
||
if longClickMapU ~= uv[1] or longClickMapV ~= uv[2] then
|
||
longClickMapU = uv[1]
|
||
longClickMapV = uv[2]
|
||
if this.OnLongClickShowPath then
|
||
this.OnLongClickShowPath(uv[1], uv[2])
|
||
end
|
||
end
|
||
else
|
||
if this.IsShieldDrag() then return end
|
||
_moveTween:LerpMomentum(data.delta)
|
||
this.SetPosition(data.delta)
|
||
end
|
||
end
|
||
end
|
||
data:Use()
|
||
end
|
||
|
||
function this.OnEndDrag(Pointgo, data)
|
||
if not _touch1 and not _touch2 then --移动增加缓动效果
|
||
if this.IsShieldDrag() then return end
|
||
this.SetPosition2(data.delta, true)
|
||
_moveTween.IsUseCallBack = true
|
||
elseif _touch1 and not _touch2 then --限定缩放范围
|
||
_targetScale = TileMapView.GetMapScale()
|
||
end
|
||
data:Use()
|
||
end
|
||
|
||
function this.OnScrollMouse(Pointgo, data)
|
||
_scalePoint = data.position
|
||
this.SetScale(TileMapView.GetMapScale() + data.scrollDelta.y / TileMapView.PIXELS_PER_UNIT)
|
||
end
|
||
|
||
function this.SetPosition(delta)
|
||
this.SetPosition2(delta, false)
|
||
end
|
||
|
||
function this.SetPosition2(delta, invokeCall)
|
||
TileMapView.CameraMove(Vector2.New(math.floor(delta.x), math.floor(delta.y)))
|
||
TileMapView.UpdateBaseData()
|
||
|
||
if this.OnMove then
|
||
this.OnMove(TileMapView.IndexU, TileMapView.IndexV)
|
||
end
|
||
|
||
if invokeCall and this.OnMoveEnd then
|
||
this.OnMoveEnd(TileMapView.IndexU, TileMapView.IndexV)
|
||
end
|
||
end
|
||
|
||
function this.SetCameraPosition(diamond, isWorldPos, invokeCall)
|
||
if isWorldPos then
|
||
Util.SetPosition(TileMapView.ViewCameraTran, diamond.x, diamond.y, TileMapView.ViewCameraPos.z)
|
||
TileMapView.SetCameraPos(TileMapView.ViewCameraPos)
|
||
else
|
||
TileMapView.SetCameraPos(Vector3.New( diamond.x, diamond.y, TileMapView.ViewCameraPos.z))
|
||
end
|
||
TileMapView.UpdateBaseData()
|
||
TileMapView.UpdateFunc()
|
||
if this.OnMove then
|
||
this.OnMove(TileMapView.IndexU, TileMapView.IndexV)
|
||
end
|
||
if invokeCall and this.OnMoveEnd then
|
||
this.OnMoveEnd(TileMapView.IndexU, TileMapView.IndexV)
|
||
end
|
||
end
|
||
|
||
function this.DrawTile(tileGo, u, v, type)
|
||
TileMapView.DrawTile(tileGo, u, v, type)
|
||
if this.OnShowTile then
|
||
this.OnShowTile(u, v, type)
|
||
end
|
||
end
|
||
|
||
function this.SetScale(scale)
|
||
TileMapView.CameraScale(_scalePoint, scale)
|
||
|
||
if this.OnScale then
|
||
this.OnScale(scale)
|
||
end
|
||
end
|
||
|
||
function this.OnDestroy()
|
||
if this.OnDispose then
|
||
this.OnDispose()
|
||
end
|
||
end
|
||
|
||
--定位到指定UV
|
||
function this.LocateToUV(u, v)
|
||
_moveTween.enabled = false
|
||
_moveTween.Momentum = Vector3.zero
|
||
this.SetCameraPosition(TileMapView.ScreenPos2MapPos(Vector2.New(u, v)), false, true)
|
||
end
|
||
|
||
--点击地图
|
||
function this.OnClickMapTile(screenPos)
|
||
local uv = TileMapView.GetLiveTileInScreenPos(screenPos)
|
||
if bLongPressTriggered then
|
||
--Log("触发长按事件")
|
||
if this.OnLongClickTile then
|
||
this.OnLongClickTile()
|
||
end
|
||
else
|
||
if this.OnClickTile then
|
||
this.OnClickTile(uv[1], uv[2])
|
||
end
|
||
end
|
||
end |