2021-04-20 13:58:00 +08:00
|
|
|
|
require("Modules/Map/Logic/TileMapData")
|
2020-05-09 13:31:21 +08:00
|
|
|
|
|
|
|
|
|
local MapConst = {
|
|
|
|
|
tileWidth = 128,
|
|
|
|
|
tileHeight = 128,
|
|
|
|
|
bgWidth = 1024,
|
|
|
|
|
bgHeight = 1024,
|
|
|
|
|
boxEffect = "UI_effect_TanSuo_BianKuang",
|
|
|
|
|
choosedMask = "r_map_bushu_001",
|
|
|
|
|
darkMask = "r_map_newMask",
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TileMapView = {}
|
|
|
|
|
local this = TileMapView
|
|
|
|
|
-- 是否显示迷雾
|
|
|
|
|
this.isShowFog = false
|
|
|
|
|
|
|
|
|
|
this.PIXELS_PER_UNIT = 100 --设置sprite的pixelsPerUnit值
|
|
|
|
|
|
|
|
|
|
this.IndexU = 0
|
|
|
|
|
this.IndexV = 0
|
|
|
|
|
this.fogSize = 0
|
|
|
|
|
|
|
|
|
|
this.ViewCameraTran = nil
|
|
|
|
|
this.ViewCameraPos = Vector3.zero
|
|
|
|
|
this.OnInit = nil --初始化完成后的回调
|
|
|
|
|
|
|
|
|
|
local transform
|
|
|
|
|
|
|
|
|
|
local ViewCamera
|
|
|
|
|
|
|
|
|
|
local _mapData
|
|
|
|
|
|
|
|
|
|
local _mapScale = 1
|
|
|
|
|
local _minScale
|
|
|
|
|
local _fogSpritesCache
|
|
|
|
|
local _fogMasksCache
|
|
|
|
|
local _fogMasks2Cache
|
|
|
|
|
|
|
|
|
|
local _uBuff
|
|
|
|
|
local _vBuff
|
|
|
|
|
local _uScale
|
|
|
|
|
local _vScale
|
|
|
|
|
local _defaultTileSize = Vector2.New(MapConst.tileWidth, MapConst.tileHeight)
|
|
|
|
|
local _defaultBGSize = Vector2.New(MapConst.bgWidth / this.PIXELS_PER_UNIT, MapConst.bgHeight / this.PIXELS_PER_UNIT)
|
|
|
|
|
local _tileSize
|
|
|
|
|
|
|
|
|
|
local _tileLivePool
|
|
|
|
|
local _tileClearPool
|
2023-12-22 15:36:03 +08:00
|
|
|
|
---chanllengeMapConfig的size字段
|
2020-05-09 13:31:21 +08:00
|
|
|
|
local _tileUMaxNum
|
|
|
|
|
local _tileVMaxNum
|
|
|
|
|
|
|
|
|
|
local EffectGroup
|
|
|
|
|
local _bgEffect
|
|
|
|
|
local EffectGroup2
|
|
|
|
|
local uiRoot
|
|
|
|
|
|
|
|
|
|
local _tilesGroup
|
|
|
|
|
local _tileBGsGroup
|
|
|
|
|
local _bg
|
|
|
|
|
|
|
|
|
|
local IsAwaked
|
|
|
|
|
local IsInit
|
|
|
|
|
|
|
|
|
|
local _screenWidth = Screen.width
|
|
|
|
|
local _screenHeight = Screen.height
|
|
|
|
|
|
|
|
|
|
local _offsetAngle = 0 --偏移角度 取值范围(-45f,45f)
|
|
|
|
|
local _offsetAngleValue = math.cos(math.rad(_offsetAngle))
|
|
|
|
|
local _offsetScale --计算地块缓存个数的参数
|
|
|
|
|
|
|
|
|
|
local _fogOffset
|
|
|
|
|
local _bgW
|
|
|
|
|
local _bgH
|
|
|
|
|
local _mapConfig = ConfigManager.GetConfig(ConfigName.ChallengeMapConfig)
|
|
|
|
|
local _mapId
|
|
|
|
|
local _spriteBG
|
|
|
|
|
|
|
|
|
|
local _lastViewCameraPos
|
|
|
|
|
|
|
|
|
|
local lastU, lastV
|
|
|
|
|
|
|
|
|
|
function this.AwakeInit(go, mapId, wakeCells, tileV2)
|
2021-04-21 13:12:04 +08:00
|
|
|
|
this.spLoader = SpriteLoader.New()
|
2020-05-09 13:31:21 +08:00
|
|
|
|
transform = go.transform
|
|
|
|
|
_mapId = mapId
|
|
|
|
|
wakeCells = wakeCells or {}
|
|
|
|
|
_defaultTileSize = tileV2 or Vector2.New(MapConst.tileWidth, MapConst.tileHeight)
|
|
|
|
|
|
|
|
|
|
IsInit = false
|
|
|
|
|
IsAwaked = false
|
|
|
|
|
|
|
|
|
|
this.ViewCameraTran = transform:Find("CameraPos#")
|
|
|
|
|
local vcrt = this.ViewCameraTran:Find("Camera")
|
|
|
|
|
if vcrt then
|
|
|
|
|
ViewCamera = vcrt:GetComponent("Camera")
|
|
|
|
|
end
|
|
|
|
|
_spriteBG = transform:Find("BG#/spriteBG"):GetComponent(typeof(UnityEngine.SpriteRenderer))
|
|
|
|
|
|
|
|
|
|
ViewCamera.orthographic = true
|
|
|
|
|
|
|
|
|
|
this.SetCameraPos(Vector3.New(this.ViewCameraTran.localPosition.x, this.ViewCameraTran.localPosition.y, -50))
|
|
|
|
|
_tileLivePool = {}
|
|
|
|
|
_tileClearPool = {}
|
|
|
|
|
|
|
|
|
|
IsAwaked = true
|
|
|
|
|
|
|
|
|
|
local x = _screenWidth / _screenHeight
|
|
|
|
|
local n
|
|
|
|
|
if x >= 1 then
|
|
|
|
|
n = math.sin(math.rad(_offsetAngle)) * x + math.cos(math.rad(_offsetAngle))
|
|
|
|
|
else
|
|
|
|
|
n = math.sin(math.rad(_offsetAngle)) / x + math.cos(math.rad(_offsetAngle))
|
|
|
|
|
end
|
|
|
|
|
_offsetScale = n * n * _offsetAngleValue
|
|
|
|
|
|
|
|
|
|
this.RefreshBuffSize()
|
|
|
|
|
|
|
|
|
|
--加载地图图块数据
|
2021-07-01 21:07:53 +08:00
|
|
|
|
-- Log("_mapId:".._mapId)
|
2021-05-27 17:34:59 +08:00
|
|
|
|
if not _mapConfig[_mapId] then
|
|
|
|
|
LogError("表里面没有地图id:".._mapId)
|
|
|
|
|
_mapId = 4001
|
|
|
|
|
end
|
2020-05-09 13:31:21 +08:00
|
|
|
|
local maxU, maxV = _mapConfig[_mapId].Size[1], _mapConfig[_mapId].Size[2]
|
|
|
|
|
_mapData = TileMapData.New(maxU, maxV)
|
|
|
|
|
|
|
|
|
|
_tileUMaxNum = _mapData.uLen
|
|
|
|
|
_tileVMaxNum = _mapData.vLen
|
|
|
|
|
|
|
|
|
|
local u, v
|
2020-09-02 13:35:29 +08:00
|
|
|
|
-- LogRed("这里是根据已经走过的cell设置地图,waleCells数量:"..#wakeCells)
|
2020-05-09 13:31:21 +08:00
|
|
|
|
for i=1, #wakeCells do
|
|
|
|
|
u, v = Map_Pos2UV(wakeCells[i])
|
|
|
|
|
_mapData:UpdateFogArea(u, v, this.fogSize)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
for j=1, _mapData.vLen do
|
|
|
|
|
for i=1, _mapData.uLen do
|
|
|
|
|
_mapData:GetMapData(i, j).nearVal = 1
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
_tileSize = Vector2.New(_defaultTileSize.x / this.PIXELS_PER_UNIT, _defaultTileSize.y / this.PIXELS_PER_UNIT)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function this.SetSpriteBG(sprite)
|
2021-04-21 13:12:04 +08:00
|
|
|
|
_spriteBG.sprite = this.spLoader:LoadSprite(sprite)
|
2020-05-09 13:31:21 +08:00
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function this.Exit()
|
2021-04-21 22:45:37 +08:00
|
|
|
|
this.spLoader:Destroy()
|
2021-04-22 11:20:16 +08:00
|
|
|
|
_fogSpritesCache = nil
|
2020-05-09 13:31:21 +08:00
|
|
|
|
_tileLivePool = nil
|
|
|
|
|
_tileClearPool = nil
|
|
|
|
|
ViewCamera = nil
|
|
|
|
|
_bg = nil
|
|
|
|
|
_tilesGroup = nil
|
|
|
|
|
_tileBGsGroup = nil
|
|
|
|
|
if _spriteBG then
|
|
|
|
|
_spriteBG.sprite = nil
|
|
|
|
|
_spriteBG = nil
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function this.GetMapData()
|
|
|
|
|
return _mapData
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function this.GetMapScale()
|
|
|
|
|
return _mapScale
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function this.GetMapMinScale()
|
|
|
|
|
return _minScale
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function this.GetUIPos(v3)
|
|
|
|
|
return ViewCamera:WorldToScreenPoint(v3) - Vector3.New(_screenWidth/2,_screenHeight/2,0)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function this.SetMapScale(val)
|
|
|
|
|
if ViewCamera then
|
|
|
|
|
_mapScale = val
|
|
|
|
|
ViewCamera.orthographicSize = _screenHeight / this.PIXELS_PER_UNIT / 2 / _mapScale
|
|
|
|
|
this.RefreshBuffSize()
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function this.RefreshBuffSize()
|
|
|
|
|
_uScale = _screenWidth / _defaultTileSize.x / _mapScale / 2 * _offsetScale
|
|
|
|
|
_vScale = _screenHeight / _defaultTileSize.y / _mapScale / 2 * _offsetScale
|
|
|
|
|
_uBuff = math.ceil(_uScale)
|
|
|
|
|
_vBuff = math.ceil(_vScale)
|
|
|
|
|
this.UpdateBaseData()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function this.SetCameraPos(v3)
|
|
|
|
|
this.ViewCameraPos = v3
|
|
|
|
|
Util.SetLocalPosition(this.ViewCameraTran, v3.x, v3.y, v3.z)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function this.GetCamera()
|
|
|
|
|
return ViewCamera
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function this.CameraMove(deltaPos)
|
|
|
|
|
if ViewCamera then
|
|
|
|
|
this.SetCameraPos(this.ViewCameraPos + ViewCamera:ScreenToWorldPoint(Vector3.New(_screenWidth / 2 - deltaPos.x, _screenHeight / 2 - deltaPos.y, 0))
|
|
|
|
|
- ViewCamera.transform.position)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function this.CameraTween(u, v, duration, onEnd)
|
|
|
|
|
if ViewCamera then
|
|
|
|
|
local v3 = this.GetLiveTilePos(u, v)
|
|
|
|
|
v3.z = this.ViewCameraPos.z
|
|
|
|
|
local tmpV3 = this.ViewCameraPos
|
|
|
|
|
local isEnd = false
|
|
|
|
|
DoTween.To(DG.Tweening.Core.DOGetter_UnityEngine_Vector3( function () return this.ViewCameraPos end),
|
|
|
|
|
DG.Tweening.Core.DOSetter_UnityEngine_Vector3(function (v3)
|
|
|
|
|
if isEnd then return end
|
|
|
|
|
this.SetCameraPos(v3)
|
|
|
|
|
this.UpdateBaseData()
|
|
|
|
|
if tmpV3 ~= this.ViewCameraPos then
|
|
|
|
|
tmpV3 = this.ViewCameraPos
|
|
|
|
|
else --当镜头没有动时,立刻结束并返回回调
|
|
|
|
|
isEnd = true
|
|
|
|
|
if onEnd then onEnd() end
|
|
|
|
|
end
|
|
|
|
|
end), v3, duration):SetEase(Ease.Linear):OnComplete(function ()
|
|
|
|
|
if not isEnd then
|
|
|
|
|
if onEnd then onEnd() end
|
|
|
|
|
end
|
|
|
|
|
end )
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function this.CameraScale(screenPoint, scale)
|
|
|
|
|
if ViewCamera and _mapScale ~= scale then
|
|
|
|
|
this.SetMapScale(math.clamp(scale, _minScale, 2))
|
|
|
|
|
local mousePos = ViewCamera:ScreenToWorldPoint(Vector3.New(screenPoint.x, screenPoint.y, 0))
|
|
|
|
|
local mousePos2 = ViewCamera:ScreenToWorldPoint(Vector3.New(screenPoint.x, screenPoint.y, 0))
|
|
|
|
|
this.SetCameraPos(this.ViewCameraPos - (mousePos2 - mousePos))
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function this.IsOutArea(u, v)
|
2023-12-22 15:36:03 +08:00
|
|
|
|
if u<1 then
|
|
|
|
|
LogError("Out1")
|
|
|
|
|
elseif v<1 then
|
|
|
|
|
LogError("Out2")
|
|
|
|
|
elseif u>_tileUMaxNum then
|
|
|
|
|
LogError("Out3")
|
|
|
|
|
elseif v>_tileVMaxNum then
|
|
|
|
|
LogError("Out4")
|
|
|
|
|
end
|
2020-05-09 13:31:21 +08:00
|
|
|
|
return u < 1 or v < 1 or u > _tileUMaxNum or v > _tileVMaxNum
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function this.GetLiveTileInScreenPos(insPos)
|
|
|
|
|
if ViewCamera then
|
|
|
|
|
local logicPos = this.MapPos2ScreenPos(ViewCamera:ScreenToWorldPoint(insPos) - transform.position)
|
|
|
|
|
local arr = { math.round(logicPos.x), -math.round(logicPos.y) }
|
|
|
|
|
return arr, logicPos
|
|
|
|
|
end
|
|
|
|
|
return nil
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function this.GetLiveTile(u, v)
|
|
|
|
|
local key = Map_UV2Pos(u, v)
|
|
|
|
|
if _tileLivePool[key] then
|
|
|
|
|
return _tileLivePool[key].tileGo
|
|
|
|
|
end
|
|
|
|
|
return nil
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function this.GetLiveTilePos(u, v)
|
|
|
|
|
return this.DrawTilePos(u, v)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function this.GetTileData(u, v)
|
|
|
|
|
if this.IsOutArea(u, v) then
|
|
|
|
|
return nil
|
|
|
|
|
end
|
|
|
|
|
return _mapData:GetMapData(u, v)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function this.UpdateWarFog(u, v, fogSize)
|
|
|
|
|
_mapData:UpdateFogArea(u, v, fogSize)
|
|
|
|
|
for j = math.max(1, this.IndexV - _vBuff), math.min(this.IndexV + _vBuff, _tileVMaxNum) do
|
|
|
|
|
for i = math.max(1, this.IndexU - _uBuff), math.min(this.IndexU + _uBuff, _tileUMaxNum) do
|
|
|
|
|
if this.CheckDraw(u, v) and _tileLivePool[Map_UV2Pos(i, j)] then
|
|
|
|
|
local tileGoList = _tileLivePool[Map_UV2Pos(i, j)]
|
|
|
|
|
local data = this.GetTileData(i, j)
|
|
|
|
|
|
|
|
|
|
if math.abs(i-u) + math.abs(j-v) <= fogSize then
|
|
|
|
|
data.nearVal = 0
|
|
|
|
|
else
|
|
|
|
|
data.nearVal = 1
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if data.isOpen and not tileGoList.isOpen then
|
|
|
|
|
local pos = Map_UV2Pos(i, j)
|
|
|
|
|
local delayTime = 0
|
|
|
|
|
if lastU == u then
|
|
|
|
|
delayTime = math.abs(i-u) * 0.1
|
|
|
|
|
else
|
|
|
|
|
delayTime = math.abs(j-v) * 0.1
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
Timer.New(function ()
|
|
|
|
|
if not _tileLivePool or not _tileLivePool[pos] then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
if this.isShowFog then
|
|
|
|
|
local go = poolManager:LoadAsset(MapConst.boxEffect, PoolManager.AssetType.GameObject)
|
|
|
|
|
local transform = go.transform
|
|
|
|
|
transform:SetParent(_bg)
|
|
|
|
|
transform.position = tileGoList.tileGoTran.position
|
|
|
|
|
transform.localScale = Vector3.New(_defaultTileSize.x / MapConst.tileWidth, _defaultTileSize.y / MapConst.tileHeight, 1)
|
|
|
|
|
|
|
|
|
|
Timer.New(function ()
|
2021-06-10 20:16:44 +08:00
|
|
|
|
if not _tileLivePool or not _tileLivePool[pos] then
|
|
|
|
|
return
|
|
|
|
|
end
|
2020-05-09 13:31:21 +08:00
|
|
|
|
if _tileLivePool[pos] then
|
|
|
|
|
local u, v = Map_Pos2UV(pos)
|
|
|
|
|
this.DrawTileBG(_tileLivePool[pos], this.GetTileData(u, v))
|
|
|
|
|
end
|
|
|
|
|
poolManager:UnLoadAsset(MapConst.boxEffect, go, PoolManager.AssetType.GameObject)
|
|
|
|
|
end, 0.3):Start()
|
|
|
|
|
end
|
|
|
|
|
end, delayTime):Start()
|
|
|
|
|
|
|
|
|
|
-- 不显示迷雾直接刷新
|
|
|
|
|
if not this.isShowFog then
|
|
|
|
|
if _tileLivePool[pos] then
|
|
|
|
|
local u, v = Map_Pos2UV(pos)
|
|
|
|
|
this.DrawTileBG(_tileLivePool[pos], this.GetTileData(u, v))
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
this.DrawTileBG(tileGoList, data)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
lastU, lastV = u, v
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local pathCache = {}
|
|
|
|
|
function this.ShowPath(u, v, targetU, targetV, funcCanPass)
|
|
|
|
|
this.ClearPath()
|
2021-04-15 15:51:24 +08:00
|
|
|
|
if this.IsOutArea(targetU, targetV) then
|
2023-12-22 15:36:03 +08:00
|
|
|
|
LogError("超出边界"..u.."and"..v.."targetU"..targetU.."targetV"..targetV)
|
2021-04-15 15:51:24 +08:00
|
|
|
|
return
|
|
|
|
|
end
|
2020-05-09 13:31:21 +08:00
|
|
|
|
local list = _mapData:FindPath(_mapData:GetMapData(u, v), _mapData:GetMapData(targetU, targetV), funcCanPass)
|
|
|
|
|
if list == nil or #list <= 1 then
|
|
|
|
|
return nil
|
|
|
|
|
end
|
|
|
|
|
local data
|
|
|
|
|
for i=1, #list do
|
|
|
|
|
list[i].val = 1
|
|
|
|
|
local pos = Map_UV2Pos(list[i].u, list[i].v)
|
|
|
|
|
table.insert(pathCache, pos)
|
|
|
|
|
data = _tileLivePool[pos]
|
|
|
|
|
if data then
|
|
|
|
|
this.DrawTileSprite(data, list[i])
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
return list
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function this.ClearPathTile(u, v)
|
|
|
|
|
local data
|
|
|
|
|
for i=1, #pathCache do
|
|
|
|
|
if pathCache[i] == Map_UV2Pos(u, v) then
|
|
|
|
|
data = this.GetTileData(u, v)
|
|
|
|
|
data.val = 0
|
|
|
|
|
if _tileLivePool[pathCache[i]] then
|
|
|
|
|
this.DrawTileSprite(_tileLivePool[pathCache[i]], data)
|
|
|
|
|
end
|
|
|
|
|
table.remove(pathCache, i)
|
|
|
|
|
break
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function this.ClearPath()
|
|
|
|
|
local data
|
|
|
|
|
local u, v
|
|
|
|
|
for i=1, #pathCache do
|
|
|
|
|
u, v = Map_Pos2UV(pathCache[i])
|
|
|
|
|
data = this.GetTileData(u, v)
|
|
|
|
|
data.val = 0
|
|
|
|
|
if _tileLivePool and _tileLivePool[pathCache[i]] then
|
|
|
|
|
this.DrawTileSprite(_tileLivePool[pathCache[i]], data)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
pathCache = {}
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function this.CreateNewTileGO()
|
|
|
|
|
local tileGoList = {}
|
|
|
|
|
local tileGo = GameObject("tileItem#")
|
|
|
|
|
tileGo.transform:SetParent(_tilesGroup, false)
|
|
|
|
|
tileGo.transform.localPosition = Vector3.New(0,0,-5)
|
|
|
|
|
tileGo.transform.localScale = Vector3.New(_defaultTileSize.x / MapConst.tileWidth, _defaultTileSize.y / MapConst.tileHeight, 1)
|
|
|
|
|
|
|
|
|
|
--local tile = GameObject("tile#")
|
|
|
|
|
local tileSR = tileGo:AddComponent(typeof(UnityEngine.SpriteRenderer))
|
|
|
|
|
--tile.transform:SetParent(tileGo.transform, false)
|
|
|
|
|
--tile.transform.localPosition = Vector3.New(0,0,-5)
|
|
|
|
|
--tile.transform.localScale = Vector3.one
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
local tilebg = GameObject("tilebg#")
|
|
|
|
|
local tilebgSR = tilebg:AddComponent(typeof(UnityEngine.SpriteRenderer))
|
|
|
|
|
tilebg.transform:SetParent(_tileBGsGroup, false)
|
|
|
|
|
tilebg.transform.localPosition = Vector3.New(0,0,-2)
|
|
|
|
|
tilebg.transform.localScale = Vector3.one
|
|
|
|
|
--tilebg:SetActive(false)
|
|
|
|
|
|
|
|
|
|
--local tilebgTmp = GameObject("tilebgTmp#")
|
|
|
|
|
--local tilebgTmpSR = tilebgTmp:AddComponent(typeof(UnityEngine.SpriteRenderer))
|
|
|
|
|
--tilebgTmp.transform:SetParent(tileGo.transform, false)
|
|
|
|
|
--tilebgTmp.transform.localPosition = Vector3.New(0,0,-1)
|
|
|
|
|
--tilebgTmp.transform.localScale = Vector3.one
|
|
|
|
|
|
|
|
|
|
tileGoList.tileGo = tileGo
|
|
|
|
|
tileGoList.tileGoTran = tileGo.transform
|
|
|
|
|
|
|
|
|
|
tileGoList.tileSR = tileSR
|
|
|
|
|
tileGoList.tileSRTran = tilebg.transform
|
|
|
|
|
tileGoList.tilebgSR = tilebgSR
|
|
|
|
|
--tileGoList.tilebgTmpSR = tilebgTmpSR
|
|
|
|
|
|
|
|
|
|
return tileGoList
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function this.Draw(u, v, data)
|
|
|
|
|
local tileGoList
|
|
|
|
|
local uv = Map_UV2Pos(u, v)
|
|
|
|
|
if #_tileClearPool > 0 then
|
|
|
|
|
for k, v in pairs(_tileClearPool) do
|
|
|
|
|
if v.tileUV == uv then
|
|
|
|
|
tileGoList = v
|
|
|
|
|
table.remove(_tileClearPool, k)
|
|
|
|
|
break
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
if not tileGoList then
|
|
|
|
|
if not _tileClearPool[1] then
|
|
|
|
|
tileGoList = this.CreateNewTileGO()
|
|
|
|
|
else
|
|
|
|
|
tileGoList = _tileClearPool[1]
|
|
|
|
|
table.remove(_tileClearPool,1)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
tileGoList = this.CreateNewTileGO()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if tileGoList.tileUV ~= uv then
|
|
|
|
|
tileGoList.tileUV = uv
|
|
|
|
|
tileGoList.tileU = u
|
|
|
|
|
tileGoList.tileV = v
|
|
|
|
|
|
|
|
|
|
local v3 = this.DrawTilePos(u, v)
|
|
|
|
|
Util.SetLocalPosition(tileGoList.tileGoTran, v3.x, v3.y, v3.z)
|
|
|
|
|
Util.SetLocalPosition(tileGoList.tileSRTran, v3.x, v3.y, v3.z)
|
|
|
|
|
end
|
|
|
|
|
_tileLivePool[uv] = tileGoList
|
|
|
|
|
this.DrawTileBG(tileGoList, data)
|
|
|
|
|
this.DrawTileSprite(tileGoList, data)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--矩形排列算法(以左上角为原点建立u,v坐标)
|
|
|
|
|
function this.DrawTilePos(u, v)
|
2021-04-27 18:16:46 +08:00
|
|
|
|
-- print(_offsetAngle)
|
|
|
|
|
-- print(_offsetAngleValue)
|
|
|
|
|
-- print(_tileSize.x, _tileSize.y)
|
2020-05-09 13:31:21 +08:00
|
|
|
|
return Quaternion.Euler(0,0, _offsetAngle) * Vector3.New(u * _tileSize.x, v * -_tileSize.y, 0) * _offsetAngleValue
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function this.DrawBGPos(u, v)
|
|
|
|
|
return Quaternion.Euler(0,0, _offsetAngle) * Vector3.New(u * _defaultBGSize.x, v * -_defaultBGSize.y, 0) * _offsetAngleValue
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function this.DrawTileSprite(tileGoList, data)
|
|
|
|
|
if not data then return false end
|
|
|
|
|
if tileGoList.tileSpriteType ~= data.val then
|
|
|
|
|
tileGoList.tileSpriteType = data.val
|
2021-04-21 13:12:04 +08:00
|
|
|
|
tileGoList.tileSR.sprite = data.val == 1 and this.spLoader:LoadSprite(MapConst.choosedMask) or nil
|
2020-05-09 13:31:21 +08:00
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function uvMask(u, v)
|
|
|
|
|
u = u % 16 == 0 and 16 or u % 16
|
|
|
|
|
v = v % 16 == 0 and 16 or v % 16
|
|
|
|
|
return u + (v-1) * 16
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function this.DrawTileBG(tileGoList, data)
|
|
|
|
|
if not data then return end
|
|
|
|
|
if this.isShowFog then
|
|
|
|
|
tileGoList.tilebgSR.sprite = _fogSpritesCache[uvMask(tileGoList.tileU, tileGoList.tileV)]
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if data.isOpen then
|
|
|
|
|
local n = 0
|
|
|
|
|
local checkNear = function(u, v, add)
|
|
|
|
|
if this.IsOutArea(u, v) then return end
|
|
|
|
|
if not _mapData:GetMapData(u, v).isOpen then
|
|
|
|
|
n = n + add
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
checkNear(tileGoList.tileU, tileGoList.tileV+1, 4)
|
|
|
|
|
checkNear(tileGoList.tileU+1, tileGoList.tileV, 2)
|
|
|
|
|
checkNear(tileGoList.tileU, tileGoList.tileV-1, 1)
|
|
|
|
|
checkNear(tileGoList.tileU-1, tileGoList.tileV, 8)
|
|
|
|
|
if this.isShowFog then
|
|
|
|
|
tileGoList.tilebgSR.sprite = _fogMasksCache[n]
|
|
|
|
|
if n == 0 then
|
|
|
|
|
checkNear(tileGoList.tileU-1, tileGoList.tileV+1, 1)
|
|
|
|
|
checkNear(tileGoList.tileU+1, tileGoList.tileV+1, 2)
|
|
|
|
|
checkNear(tileGoList.tileU-1, tileGoList.tileV-1, 8)
|
|
|
|
|
checkNear(tileGoList.tileU+1, tileGoList.tileV-1, 4)
|
|
|
|
|
|
|
|
|
|
tileGoList.tilebgSR.sprite = _fogMasks2Cache[n]
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
tileGoList.isOpen = data.isOpen
|
2021-04-21 13:12:04 +08:00
|
|
|
|
--tileGoList.tilebgTmpSR.sprite = data.nearVal == 1 and this.spLoader:LoadSprite(MapConst.darkMask) or nil
|
2020-05-09 13:31:21 +08:00
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function this.Init()
|
|
|
|
|
if not IsAwaked then return end
|
|
|
|
|
--没有载入Info
|
|
|
|
|
if _defaultTileSize == Vector2.zero then return end
|
|
|
|
|
|
|
|
|
|
if not _fogSpritesCache then
|
|
|
|
|
_fogMasksCache = {}
|
|
|
|
|
_fogMasks2Cache = {}
|
|
|
|
|
_fogSpritesCache = {}
|
|
|
|
|
|
|
|
|
|
for i = 1, 256 do
|
2021-04-21 13:12:04 +08:00
|
|
|
|
_fogSpritesCache[i] = this.spLoader:LoadSprite("mask____"..i)
|
2020-05-09 13:31:21 +08:00
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
for i = 1, 15 do
|
2021-04-21 13:12:04 +08:00
|
|
|
|
_fogMasksCache[i] = this.spLoader:LoadSprite("shadow_"..i)
|
2020-05-09 13:31:21 +08:00
|
|
|
|
end
|
|
|
|
|
for i = 1, 15 do
|
2021-04-21 13:12:04 +08:00
|
|
|
|
_fogMasks2Cache[i] = this.spLoader:LoadSprite("shadow_angle_"..i)
|
2020-05-09 13:31:21 +08:00
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--加载背景图
|
|
|
|
|
if not _bg then
|
|
|
|
|
_bg = transform:Find("BG#")
|
|
|
|
|
_bg:SetParent(transform, false)
|
2023-12-22 15:36:03 +08:00
|
|
|
|
--sample 1080 /100/2=54
|
2020-05-09 13:31:21 +08:00
|
|
|
|
_bgW = _mapConfig[_mapId].TileSize[1] / this.PIXELS_PER_UNIT / 2
|
2023-12-22 15:36:03 +08:00
|
|
|
|
--sample 1920 /100/2=96
|
2020-05-09 13:31:21 +08:00
|
|
|
|
_bgH = _mapConfig[_mapId].TileSize[2] / this.PIXELS_PER_UNIT / 2
|
|
|
|
|
|
|
|
|
|
local offsetX = math.ceil((_mapConfig[_mapId].TileSize[1]-_mapData.uLen*_defaultTileSize.x)/_defaultTileSize.x/2)
|
|
|
|
|
local offsetY = math.ceil((_mapConfig[_mapId].TileSize[2]-_mapData.vLen*_defaultTileSize.y)/_defaultTileSize.y/2)
|
2021-07-01 21:07:53 +08:00
|
|
|
|
-- Log("offsetX:"..offsetX)
|
|
|
|
|
-- Log("offsetY:"..offsetY)
|
2020-05-09 13:31:21 +08:00
|
|
|
|
_fogOffset = Vector2.New(offsetX, offsetY)
|
|
|
|
|
|
|
|
|
|
_minScale = math.max(_screenHeight, _screenWidth) / math.min(_mapConfig[_mapId].TileSize[1], _mapConfig[_mapId].TileSize[2])
|
|
|
|
|
this.SetMapScale(math.max(1080/1280, _minScale))
|
|
|
|
|
|
|
|
|
|
local count = 0
|
|
|
|
|
local childCount = _bg.childCount
|
|
|
|
|
|
|
|
|
|
for i=1, childCount-1 do
|
|
|
|
|
local go = _bg:GetChild(i)
|
|
|
|
|
local sr = go.gameObject:GetComponent(typeof(UnityEngine.SpriteRenderer))
|
|
|
|
|
if not sr then
|
|
|
|
|
sr = go.gameObject:AddComponent(typeof(UnityEngine.SpriteRenderer))
|
|
|
|
|
end
|
|
|
|
|
sr.sprite = nil
|
|
|
|
|
end
|
|
|
|
|
for j=1, _mapConfig[_mapId].BGSize[2] do
|
|
|
|
|
for i=1, _mapConfig[_mapId].BGSize[1] do
|
|
|
|
|
count = count + 1
|
|
|
|
|
local go = _bg:Find(string.format("BGItem#%d_%d",i, j))
|
|
|
|
|
if not go then
|
|
|
|
|
go = GameObject(string.format("BGItem#%d_%d",i, j)).transform
|
|
|
|
|
go:SetParent(_bg, false)
|
|
|
|
|
go.localScale = Vector3.one
|
|
|
|
|
end
|
|
|
|
|
go.localPosition = this.DrawBGPos(i, j) + Vector3.New(-_bgW - _defaultBGSize.x / 2, _bgH + _defaultBGSize.y / 2, 0)
|
|
|
|
|
local sr = go.gameObject:GetComponent(typeof(UnityEngine.SpriteRenderer))
|
|
|
|
|
if not sr then
|
|
|
|
|
sr = go.gameObject:AddComponent(typeof(UnityEngine.SpriteRenderer))
|
|
|
|
|
end
|
2021-04-21 13:12:04 +08:00
|
|
|
|
sr.sprite = this.spLoader:LoadSprite(_mapConfig[_mapId].BGPath.."_"..count)
|
2020-05-09 13:31:21 +08:00
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
local v2 = this.ScreenPos2MapPos(Vector2.New(_tileUMaxNum / 2 + 0.5, _tileVMaxNum / 2 + 0.5))
|
|
|
|
|
local offsetX = _mapConfig[_mapId].Offset[1]
|
|
|
|
|
local offsetY = _mapConfig[_mapId].Offset[2]
|
|
|
|
|
--local offsetX = 0
|
|
|
|
|
--local offsetY = 0
|
|
|
|
|
_bg.localPosition = Vector3.New(v2.x + offsetX / this.PIXELS_PER_UNIT, v2.y + offsetY / this.PIXELS_PER_UNIT, 1)
|
|
|
|
|
_bg.localScale = Vector3.one
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
ViewCamera.orthographicSize = _screenHeight / this.PIXELS_PER_UNIT / 2 / _mapScale
|
|
|
|
|
|
|
|
|
|
if not IsInit then
|
|
|
|
|
if _mapData then
|
|
|
|
|
this.DrawTiles()
|
|
|
|
|
IsInit = true
|
|
|
|
|
this.OnInitComplete()
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
this.UpdateBaseData()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function this.UpdateFunc()
|
|
|
|
|
--防止运行时,rotation被更改
|
|
|
|
|
transform.rotation = Quaternion.identity
|
|
|
|
|
|
|
|
|
|
if IsInit then
|
|
|
|
|
this.ClearTiles()
|
|
|
|
|
this.DrawTiles()
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function this.IsUpdatePos()
|
|
|
|
|
return _lastViewCameraPos ~= this.ViewCameraPos
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function this.UpdateBaseData()
|
|
|
|
|
if IsInit then
|
|
|
|
|
--计算相机位置 边界检查
|
|
|
|
|
this.BoundsCheck()
|
|
|
|
|
if _lastViewCameraPos == this.ViewCameraPos then return end
|
|
|
|
|
_lastViewCameraPos = this.ViewCameraPos
|
|
|
|
|
--计算index
|
|
|
|
|
local logicPos = this.MapPos2ScreenPos(Vector2.New(this.ViewCameraPos.x, this.ViewCameraPos.y))
|
|
|
|
|
local lastIndexU = this.IndexU
|
|
|
|
|
local lastIndexV = this.IndexV
|
|
|
|
|
|
|
|
|
|
--边界显示检查
|
|
|
|
|
this.IndexU = math.clamp(math.round(logicPos.x), 1, _tileUMaxNum)
|
|
|
|
|
this.IndexV = math.clamp(-math.round(logicPos.y), 1, _tileVMaxNum)
|
|
|
|
|
|
|
|
|
|
if lastIndexU and lastIndexV then
|
|
|
|
|
if lastIndexU ~= this.IndexU or lastIndexV ~= this.IndexV then
|
|
|
|
|
this.UpdateFunc()
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function this.ClearTiles()
|
|
|
|
|
local u, v
|
|
|
|
|
for k, go in pairs(_tileLivePool) do
|
|
|
|
|
u, v = Map_Pos2UV(k)
|
|
|
|
|
if go then
|
|
|
|
|
if not this.CheckDraw(u, v) or u < this.IndexU - _uBuff or u > this.IndexU + _uBuff or v < this.IndexV - _vBuff or v > this.IndexV + _vBuff then
|
|
|
|
|
_tileLivePool[k] = nil
|
|
|
|
|
table.insert(_tileClearPool, go)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function this.DrawTiles()
|
|
|
|
|
if not _tilesGroup then
|
|
|
|
|
_tilesGroup = transform:Find("tilesGroup#")
|
|
|
|
|
_tileBGsGroup = transform:Find("tileBGsGroup#")
|
|
|
|
|
EffectGroup = transform:Find("effectGroup#")
|
|
|
|
|
_bgEffect = EffectGroup:Find("effect")
|
|
|
|
|
_bgEffect.localPosition = Vector3.New(_tileSize.x * _tileUMaxNum / 2, -_tileSize.y * _tileVMaxNum / 2, 0)
|
|
|
|
|
EffectGroup2 = transform:Find("effectGroup2#")
|
|
|
|
|
uiRoot = transform:Find("uiObj#")
|
|
|
|
|
uiRoot.gameObject:GetComponent("Canvas").worldCamera = ViewCamera
|
|
|
|
|
uiRoot.gameObject:GetComponent("RectTransform").sizeDelta = Vector2.New(_mapConfig[_mapId].TileSize[1], _mapConfig[_mapId].TileSize[2])
|
2023-12-22 15:36:03 +08:00
|
|
|
|
uiRoot.gameObject:SetActive(true)
|
2020-05-09 13:31:21 +08:00
|
|
|
|
|
|
|
|
|
while _tilesGroup.childCount > 0 do
|
|
|
|
|
GameObject.DestroyImmediate(_tilesGroup:GetChild(0).gameObject)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
while _tileBGsGroup.childCount > 0 do
|
|
|
|
|
GameObject.DestroyImmediate(_tileBGsGroup:GetChild(0).gameObject)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
for v = math.max(1, this.IndexV - _vBuff), math.min(this.IndexV + _vBuff, _tileVMaxNum) do
|
|
|
|
|
for u = math.max(1, this.IndexU - _uBuff), math.min(this.IndexU + _uBuff, _tileUMaxNum) do
|
|
|
|
|
if this.CheckDraw(u, v) and not _tileLivePool[Map_UV2Pos(u, v)] then
|
|
|
|
|
this.Draw(u, v, this.GetTileData(u, v))
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function this.CheckDraw(u, v)
|
|
|
|
|
if _offsetAngle == 0 then return true end
|
|
|
|
|
|
|
|
|
|
local v3 = this.ScreenPos2MapPos(Vector2.New(u, v))
|
|
|
|
|
local v32 = this.ScreenPos2MapPos(Vector2.New(this.IndexU, this.IndexV))
|
|
|
|
|
|
|
|
|
|
local checkWidth = (_screenWidth / this.PIXELS_PER_UNIT / _mapScale + _tileSize.x * 2) / 2
|
|
|
|
|
local checkHeight = (_screenHeight / this.PIXELS_PER_UNIT / _mapScale + _tileSize.y * 2) / 2
|
|
|
|
|
|
|
|
|
|
return math.abs(v3.x - v32.x) < checkWidth and math.abs(v3.y - v32.y) < checkHeight
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function this.BoundsCheck()
|
|
|
|
|
local v3 = this.ViewCameraPos
|
|
|
|
|
v3.x = math.clamp(v3.x, _bg.localPosition.x - _bgW + _uScale * _tileSize.x,
|
|
|
|
|
_bg.localPosition.x + _bgW - _uScale * _tileSize.x)
|
|
|
|
|
v3.y = math.clamp(v3.y, _bg.localPosition.y - _bgH + _vScale * _tileSize.y,
|
|
|
|
|
_bg.localPosition.y + _bgH - _vScale * _tileSize.y)
|
|
|
|
|
this.SetCameraPos(v3)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function this.IsOutBounds(v3)
|
|
|
|
|
return v3.x < _bg.localPosition.x - _bgW + _uScale * _tileSize.x or
|
|
|
|
|
v3.x > _bg.localPosition.x + _bgW - _uScale * _tileSize.x or
|
|
|
|
|
v3.y < _bg.localPosition.y - _bgH + _vScale * _tileSize.y or
|
|
|
|
|
v3.y > _bg.localPosition.y + _bgH - _vScale * _tileSize.y
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function this.MapPos2ScreenPos(v2)
|
|
|
|
|
local v3 = Quaternion.Euler(0,0, _offsetAngle) * Vector3.New(v2.x, v2.y, 0)
|
|
|
|
|
return Vector2.New(v3.x / _tileSize.x, v3.y / _tileSize.y) / _offsetAngleValue
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function this.ScreenPos2MapPos(v2)
|
|
|
|
|
local v3 = Quaternion.Euler(0,0, _offsetAngle) * Vector3.New(v2.x * _tileSize.x, v2.y * -_tileSize.y, 0) * _offsetAngleValue
|
|
|
|
|
return Vector2.New(v3.x, v3.y)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function this.OnInitComplete()
|
|
|
|
|
if this.OnInit then
|
|
|
|
|
this.OnInit()
|
|
|
|
|
end
|
2020-06-23 18:36:24 +08:00
|
|
|
|
end
|