在游戏中经常用到地图居中的操作,比如一张大地图,需要做一个小地图来实时显示出玩家在大地图中的位置,这个做法比较常规的做法是对每一张大地图都等比例的来做一张小地图
获取到玩家在大地图中的位置,在根据缩放比例就可以算出来在小地图的位置了
下面这个算法是将玩家的位置始终处于屏幕的中心
初始化:小地图的原点与世界坐标重合,
如果想让小地图中某个点在屏幕居中,只需要用屏幕的中心点坐标去减当前点坐标,当然这个结果不可以超出范围,这个范围就是小地图的尺寸减去屏幕的尺寸
local mapWidth = GetMapWidthInPixel()
local mapHeight = GetMapHeightInPixel()
local worldPos = actor:getPosition()
local worldX = worldPos.x
local worldY = -worldPos.y
local ratioX = self._minimapSize.width / mapWidth
local ratioY = self._minimapSize.height / mapHeight
local function calcMiniMap()
local minimapX = worldX * -ratioX
local minimapY = (mapHeight - worldY) * -ratioY
minimapX = minimapX + self._limitSize.width / 2
minimapY = minimapY + self._limitSize.height / 2
minimapX = cc.clampf(minimapX, 0, -(self._minimapSize.width - self._limitSize.width))
minimapY = cc.clampf(minimapY, 0, -(self._minimapSize.height - self._limitSize.height))
self._quickUI.Image_minimap:setPosition({x = minimapX, y = minimapY})
self._quickUI.Node_path:setPosition(self._quickUI.Image_minimap:getPosition())
adjustPos(self._quickUI.Image_minimap)
adjustPos(self._quickUI.Node_path)
end
地图加载策略
地图结构:
由许多固定大小的格子组成,小个子的尺寸:(titleWidth,titleHeight)
假设横有m个格子,竖有n个格子,则一共有m*n个格子组成
地图位置:(mapX,mapY)—大小范围—>[(0,0),(m-1,n-1)]
世界坐标系的位置
wPositionx = titleWidthmapX
wPositiony = -titleHeightmapY(这个值的正负需要视具体情况而定)
地图填充:
一张大的地图由n个固定大小的格子组成
titles:地皮,每一张地皮的纹理大小与小格子大小要一模一样
smtitles:层级介于obj和地皮之间的东西
objs:建筑,建筑虽是一张大图,但也都是由小格子拼凑而成,所以其纹理也都被拆分成一个个小格子纹理
玩家的移动:
玩家位置始终处于地图小格子的正中心
地图加载:
地图是庞大的,地图的位置是不变的,移动的是相机
每一次只加载在视野中的地图小格子