瓦片地图(Tiled Map)系列文章:

承接上一篇文章,再来聊聊一些coding方面的tips:

TileMapAtlas、FastTMX和TMXTiledMap的选择

我们看到cocos2d-x提供了三个和TiledMap相关的类:TileMapAtlas、FastTMX和TMXTiledMap,那么应该采用哪个类呢?

首先,TileMapAtlas官方不建议使用。

剩下的两个C++类FastTMX和TMXTiledMap,分别绑定到lua的ccexp.TMXTiledMap和cc.TMXTiledMap。采用FastTMX的GL verts(顶点数)较少,可惜暂时不支持staggered类型。所以,staggered类型的Tiled Map只能用TMXTiledMap,其它类型的Tiled Map建议采用FastTMX。

-- NOTE: FastTMX doesn't support staggered tmx

-- ccexp.TMXTiledMap is faster, but the grid will not be displayed normally

local map = cc.TMXTiledMap:create("xxx.tmx")

如何判断tile坐标超出地图区域

FastTMX和TMXTiledMap提供了一个方法getMapSize(),需要注意的是这个函数和cocos2d-x其他getXXXSize的函数不同,返回的大小不是以像素值为单位,而是2D地图在两个维度的tile数目。

local function isTileInMap(map, tileCoord)

-- NOTE: mapSize is measured in tile number

local mapSize = map:getMapSize()

return (tileCoord.x >= 0)

and (tileCoord.x < mapSize.width)

and (tileCoord.y >= 0)

and (tileCoord.y < mapSize.height)

end

如何获取tile的标记

上一篇文章提到,对于不能放置在地图上禁止被编辑的区域,可以在相应的Tile做上标记。例如,我在Tiled Map里创建了一个叫"meta"的图层:

在TileSet Properties里设置一个标记"Collidable",表示禁止被编辑:

接下来就是用这个TileSet来刷图啦!

那么我们如何在代码中获取这个标记呢?FastTMX和TMXTiledMap提供了一个方法getPropertiesForGID(GID)来获取GID所对应的tile的属性。

那么新的问题又来了,GID这个索引又如何获取呢?还有另一个函数getTileGIDAt(),传入的参数就是上次所讲的tile坐标啦!

现在你应该明白之前本渣为何要在那套坐标系下解决判断区域相交的问题了吧?

local function isValidTile(map, tileCoord)

local metaLayer = map:getLayer("meta")

local flags = 0

local GID, flags = metaLayer:getTileGIDAt(tileCoord, flags)

if not GID or GID <= 0 then

return true

end

local property = map:getPropertiesForGID(GID)

if property and property["Collidable"] then

return false

else

return true

end

end

关于tile的坐标

上回提到Staggered Tiled Map的坐标系,其实这套坐标还和你的配置有关。本渣采用的配置是:

如果改变上述参数,那么你所得到的坐标也会不同,你不妨多试试啦~

另外,即使上述参数不变,但如果你需要由某一点的坐标求出它所在tile的坐标的话,还需要注意Tiled Map的Y轴tile数目(之所以是Y轴,是因为上面Staggered Axis设置为Y)的奇偶性。这里也不解释了,直接上图最直观:

'Y轴有奇数个tile(图中是五个),这里tile个数是这么算的:从最底端的tile沿斜线算与它有一条公共边的tile、一直算到最顶端的tile,例如从坐标(0, 4)(0, 3)(1, 2)(1, 1)到没有显示的(2, 0)'

Y轴有偶数个tile(图中是六个)

更多Tiled Map Properties配置

Tile Layer Format最好选择压缩的格式,这样生成的tmx文件比较小。

关于遮挡关系的排序函数

上一篇文章还提到建筑及装饰物之间的遮挡关系处理,本渣制定了一套规则来对建筑及装饰物做排序。需要注意的是,lua的table.sort要求排序函数是stable的,所以最好给每个要被比较的对象(这里就是建筑或装饰物)一个独一无二的id,对于两者“相等”这种情况就定义为比较id大小即可。

以下给出示例的伪代码,其中building就是被封装过的建筑或装饰物对象:

local function getLineOfBuildingRegion(building)

return {

left = building:getRegionLeftPos(),

right = building:getRegionRightPos(),

}

end

local function getDistX(line)

return line.right.x - line.left.x

end

local function getLowerPoint(line)

if line.left.y < line.right.y then

return line.left

else

return line.right

end

end

local function getHigherPoint(line)

if line.left.y > line.right.y then

return line.left

else

return line.right

end

end

local function isPointEqual(posA, posB)

return posA.x == posB.x and posA.y == posB.y

end

local function isLineEqual(lineA, lineB)

return isPointEqual(lineA.left, lineB.left) and isPointEqual(lineA.right, lineB.right)

end

local function getSlope(line)

return (line.right.y - line.left.y) / (line.right.x - line.left.x)

end

local function isLineParallel(lineA, lineB)

return getSlope(lineA) == getSlope(lineB)

end

local function isLowerThanLine(point, line)

local y = getSlope(line) * (point.x - line.left.x) + line.left.y

if point.y == y then

return y > getLowerPoint(line).y

else

return point.y < y

end

end

local function updateBuildingsZOrder(buildings)

table.sort(buildings, function(a, b)

if not isValidBuilding(a) then

return false

elseif not isValidBuilding(b) then

return true

end

local lineA = getLineOfBuildingRegion(a)

local lineB = getLineOfBuildingRegion(b)

if getDistX(lineA) > getDistX(lineB) then

return isLowerThanLine(getLowerPoint(lineB), lineA)

elseif getDistX(lineA) == getDistX(lineB) then

if isLineEqual(lineA, lineB) then

return a.id < b.id

elseif isLineParallel(lineA, lineB) then

if getLowerPoint(lineA).y == getLowerPoint(lineB).y then

return a.id < b.id

else

return getLowerPoint(lineA).y > getLowerPoint(lineB).y

end

else

if getLowerPoint(lineA).y > getLowerPoint(lineB).y then

return isLowerThanLine(getLowerPoint(lineB), lineA)

elseif getLowerPoint(lineA).y == getLowerPoint(lineB).y then

if getHigherPoint(lineA).y > getHigherPoint(lineB).y then

return isLowerThanLine(getLowerPoint(lineB), lineA)

elseif getHigherPoint(lineA).y == getHigherPoint(lineB).y then

return a.id < b.id

else

return not isLowerThanLine(getLowerPoint(lineA), lineB)

end

else

return not isLowerThanLine(getLowerPoint(lineA), lineB)

end

end

else

return not isLowerThanLine(getLowerPoint(lineA), lineB)

end

end)

for i, building in ipairs(buildings) do

building:setLocalZOrder(i)

end

end

Android访问瓦片地图 费流量,瓦片地图注意事项相关推荐

  1. Android访问瓦片地图 费流量,瓦片地图服务在线资源访问总结

    在线资源包括:天地图.谷歌地图.BingMap.OSM.Mapbox等 以下url中: Z-瓦片层级,一般支持0-18级,越大代表越清晰: X-瓦片列号,从西向东(0->360),依次0,1,2 ...

  2. WebGIS——OpenLayers 3 地图叠加自定义卫星/航拍/手绘地图(任意瓦片图)

    使用OpenLayers 3 第一步 首先创建Html文件的结构,在body中放入一个Div作为地图显示的容器,调整其宽度高度使其全屏显示 html页结构如下,其中id为map的div为显示地图的容器 ...

  3. MapBox离线地图+python获取瓦片数据

    工作中需要使用离线地图. 使用工具:MapBox离线地图+python获取瓦片数据 前端页面: <!DOCTYPE html> <html> <head><m ...

  4. WebGIS 瓦片地图引擎实现之——地图瓦片加载计算原理介绍

    1. 背景 1.1 地图瓦片之前 在地图瓦片技术使用之前,用户使用在线地图,一般都是客户端把将要显示的地理范围传送到服务端,服务器端将地理范围内的地理数据都查询出来,然后在服务端按照预先定义的专题地图 ...

  5. 高德地图覆盖自定义瓦片图

    前提:前端数据展示大屏需要展示一张1G左右的水库周边全景图(原计划20G,实际1G左右就已经够用了),此文章只作为本人项目工作经验总结.1G直接加载的话对浏览器的压力太大,而且需要缩放和拖拽,所以借鉴 ...

  6. 瓦片地图面面观之瓦片组织

    瓦片组织 通过<瓦片地图面面观>一中图1瓦片网格的辅助,可直观感受到谷歌地图在第一级(缩放级别)的瓦片行列排列方式.可见谷歌地图第一级由四张瓦片构成了整个世界地图. 我们将瓦片地图中,瓦片 ...

  7. OGC标准WMTS服务概念与地图商的瓦片编号流派-web地图切片加载

    还不知道地图栅格化切片等相关GIS原理的,推荐阅读<webGIS底图栅格化与实时数据合成处理原理,地图API设计,xyz加载> OGC概念 OGC全称--开放地理空间信息联盟(Open G ...

  8. LeafletJS 简单使用3(超图使用问题解决) - 继1/2出现的问题及解决(超图更换地图地址之后瓦片空白问题解决)

    目录 1. 新的需求 2. 问题 3. 解决:初始化地图时添加一些参数 4. 地图厂商给发的添加参数demo 查看地图参数 1. 新的需求 现有地图放大后,最大层级不足以展示详细街道细信息,需要更换地 ...

  9. python下载谷歌地图瓦片_使用 Python 合并地图瓦片

    前文提到了合并瓦片图,而瓦片图应用比较多的则是瓦片地图.对地图本就感兴趣的我,也想试试合并互联网地图的某个范围内的地图图层. 随着技术的发展,国内的地图服务商相继将地图瓦片更新为矢量瓦片[1],这下想 ...

最新文章

  1. java gettickcount_linux上的GetTickCount函数
  2. JAVA设计模式(09):结构型-代理模式(Proxy)
  3. 错误:“Cannot load JDBC driver class ‘com.mysql.jdbc.Driver”的解决方法
  4. 一起学习android图片四舍五入图片集资源 (28)
  5. Android华容道之一步一步实现-序言
  6. Logstash同步mysql一对多数据到ES(踩坑日记系列)
  7. Ubuntu Sudo 无法解析的主机
  8. 网站部署后Parser Error Message: Could not load type 的解决方案
  9. 【Python】sys库介绍
  10. [Python] 生成迭代器 iter() 函数
  11. 【渝粤题库】陕西师范大学210009幼儿园健康教育作业(高起专)
  12. 10年老技术员教你免费的、完整的把 PDF 转换为 Word
  13. cad插件_【CAD插件】家具绘图神器
  14. 【牛客网】滴滴出行2017秋招测试岗笔试真题汇总
  15. 一文带你读懂 Java Agent 内存马
  16. php设计模式 参考地址
  17. Python实现邮箱自动群发工资条
  18. 微信小程序--优购商城项目(8)
  19. System.Web.Caching.Cache
  20. 波段选择方法综述:Hyperspectral Band Selection A review

热门文章

  1. Foundation HTML5 Canvas中的2处错误
  2. matlab代码重改python代码,对应函数
  3. 英文论文中i.e.,e.g.,etc.的正确用法
  4. 基于脆弱水印的图像篡改检测实现
  5. 深度学习目标检测(YoloV5)项目——从0开始到项目落地部署
  6. PCL点云库学习(1):环境配置(Ubuntu16.04+QT5+VTK8.0)
  7. 2017计算机等级考试题,2017年计算机二级考试题库及答案
  8. css4个伪元素,CSS_CSS3中的content属性使用示例,CSS中主要的伪元素有四个:befo - phpStudy...
  9. pythongoogle.probuf.timestamp_数据通信格式:Google Protobuf
  10. 开工的欲望 | AI Studio上线新功能,用你的模型生成在线预测服务