圖所示的複雜地圖可使用瓦片地圖技術,瓦片地圖是用一些小圖片(瓦片)拼接而成,這樣能夠大大地減小內存消耗。如圖所示的瓦片地圖,只須要如圖所示的三個瓦片就能夠了。php
瓦片地圖swift
地圖中的瓦片
瓦片地圖的分類
瓦片地圖能夠有三種分類:直角地圖、斜角地圖和六邊形地圖。
一、直角地圖
直角地圖,如圖所示是使用方形瓦片構建,看上去是垂直向下觀察的鳥瞰圖,構成瓦片地圖的瓦片不必定是正方形,也能夠是長方形瓦片。
二、斜角地圖
斜角地圖,如圖所示是使用菱形瓦片構建。斜角地圖是將視角旋轉到45度,斜角地圖可以使咱們的大腦錯誤地認爲,咱們是在三維遊戲世界中。在早期的電子遊戲中因爲硬件性能所限制,不少遊戲採用斜角地圖模擬三維遊戲。可是如今運行三維遊戲已經不是問題,全部如今咱們通常不推薦使用斜角地圖。
三、六邊形地圖
六邊形地圖,如圖所示是使用六邊形瓦片構建。
直角地圖
斜角地圖
六邊形地圖
瓦片地圖中核心概念
在瓦片地圖中有一些基本的概念須要咱們瞭解一下,這些概念包括:層、瓦片、瓦片地圖座標和全局標識。
一、層
瓦片地圖由地圖層組成,咱們能夠對層進行建立、刪除、隱藏和顯示等操做。
層能夠分爲:普通層和對象層。普通層用來繪製一些地圖基本要素,這些地圖要素基本上是固定的,如圖所示,雲、鳥、樹木、仙人掌和草地等。對象層中能夠圈出一些區域,一個區域就是一個對象,用來設置一些屬性,咱們能夠得到經過代碼得到這些對象屬性。地圖中對象與場景中精靈關聯,如圖所示。
如圖所示,地圖中層是有順序的,所以前面的層會遮擋後面的層,並且層一旦設置爲隱藏,那麼就不能在程序中訪問。
注意 因爲繪圖引擎會對每一層的每個瓦片都進行繪製,在設計層的時候在能知足需求狀況下層數越少越好,層數通常不宜超過4層。
api
瓦片地圖中的層(TODO而後能表現出分層呢?)
二、瓦片
瓦片(tiles)是構成層最小要素,有些人將tiles翻譯爲「瓷磚」,我以爲「瓦片」更加貼切,事實上地圖中的層就是由這些「瓦片」鋪設而成的。地圖中所須要的瓦片被設計到一張大的圖片中,這種文件叫「瓦片集」,如圖所示是David Gervais提供開源免費瓦片集,咱們能夠到http://pousse.rapiere.free.fr/tome/index.htm網站下載更多的瓦片集。瓦片集中的每個瓦片,大小是同樣,瓦片之間能夠有固定的縫隙,在使用的時候地圖設計軟件會將瓦片集分割成小的瓦片。
數組
David Gervais瓦片集
三、瓦片地圖座標
在瓦片地圖中有本身的一套座標,地圖的最小單位是瓦片,一個瓦片佔有一個座標點。不一樣類型的地圖它的座標是不一樣的,圖11-13所示是直角瓦片地圖座標,座標原點在左上角。圖11-14所示是斜角瓦片地圖座標,座標原點在菱形地圖的頂點。
微信
直角瓦片地圖座標
斜角瓦片地圖座標(TODO去掉灰色底色)
四、全局標識
瓦片地圖中的每個瓦片都擁有一個惟一的編號全局標識(Global IDentifier,縮寫GID),用於在地圖中查找某個瓦片。全局標識是從1開始的,若是爲0,則說明瓦片爲空,咱們能夠利用全局標識來判斷某個座標下是否存在瓦片。
Cocos2d-x中瓦片地圖API
爲了訪問瓦片地圖,Cocos2d-x中訪問瓦片地圖API,主要的類有:TMXTiledMap、TMXLayer和TMXObjectGroup等。
一、TMXTiledMap
TMXTiledMap是瓦片地圖類,它的類圖如圖所示,TMXTiledMap派生自Node類,具備Node特色。
函數
TMXTiledMap類圖
TMXTiledMap經常使用的函數以下:
TMXLayer* getLayer(const std::string &layerName)。經過層名得到層對象。
TMXObjectGroup* getObjectGroup(const std::string &groupName)。經過對象層名得到層中對象組集合。
Size& getMapSize()。得到地圖的尺寸,它的單位是瓦片。
Size& getTileSize()。得到瓦片尺寸,它的單位是像素。
示例代碼以下:
TMXObjectGroup* group = _tileMap->getObjectGroup("Objects");
TMXLayer* background = _tileMap->getLayer("Background");
其中_tileMap是瓦片地圖類。
二、TMXLayer
TMXLayer是地圖層類,它的類圖如圖所示,TMXLayer也派生自Node類,也具備Node特色。同時TMXLayer也派生自SpriteBatchNode類,全部TMXLayer對象具備批量渲染的能力,瓦片地圖層就是由大量重複的圖片構成,它們須要渲染提升性能。
性能
TMXLayer類圖
TMXLayer經常使用的函數以下:
std::string& getLayerName()。得到層名。
Size& getLayerSize()。得到層尺寸,它的單位是瓦片。
Size& getMapTileSize()。得到瓦片尺寸,它的單位是像素。
Point getPositionAt(const Point& tileCoordinate) 。經過瓦片座標得到像素座標,瓦片座標y軸方向與像素座標y軸方向相反。
int getTileGIDAt(const Point& tileCoordinate)。經過瓦片座標得到GID值。
三、TMXObjectGroup
TMXObjectGroup是對象層中的對象組集合,它的類圖如圖11-17所示,注意TMXObjectGroup與TMXLayer不一樣,TMXObjectGroup不是派生自Node,不具備Node特性。
網站
TMXObjectGroup類圖
TMXObjectGroup經常使用的函數以下:
Value getProperty(const std::string &propertyName)。經過屬性名得到屬性值。
ValueMap getObject(const std::string &objectName)。經過對象名得到對象信息。
ValueMap getProperties()。得到對象的屬性。
ValueVector getObjects()。得到全部對象。
ValueVector類型的別名是std::vector<Value>,vector是C++的容器類,它可以存聽任意類型的動態數組,std是命名空間。
ValueMap類型的別名是std::unordered_map<std::string, Value>,unordered_map也是C++的容器類,它是一種無序的map類型,map是「鍵-值」對類型。
spa
提示 Value是Cocos2d-x中泛型類,它能夠表示unsigned char、int、float、double、bool、std::string、ValueVector、ValueMap和ValueMapIntKey等數據類型。翻譯
更多內容請關注國內第一本Swift圖書《Swift開發指南》
本書交流討論網站:http://www.51work6.com/swift.php
歡迎加入Swift技術討論羣:362298485
歡迎關注智捷iOS課堂微信公共平臺