[Bugfix]Cocos2d-x TileMap getTileAt() 导致瓷砖显示异常

存在 bug 的版本

Quick-Cocos2dx-Community 3.6 Beta2 及以下版本。
Cocos2d-x 3.x 所有版本。

bug 将在 Quick-Cocos2dx-Community 3.6 release 中修正。

bug 描述

TiledMap中存在旋转或翻转的瓷砖,在初次加载的时候显示正常。一旦掉用getTileAt()之后,对应的瓷砖将丢失旋转或翻转属性,界面显示混乱。

测试代码如下:

display.newColorLayer(cc.c4b(255, 255, 255, 255)):addTo(self)

local map = cc.TMXTiledMap:create("level.tmx")
self:addChild(map)--显示地图在屏幕上

local contentLayer = map:getLayer("content")
local size = map:getMapSize()
for i = 0, size.width - 1 do
    for j = 0, size.height - 1 do
        local tile = contentLayer:getTileAt(cc.p(i,j))
    end
end

测试用的 TiledMap 文件下载

正常显示截图:

before.png

getTileAt()之后的错乱截图:

after.png

解决方案

修改cocos/2d/CCTMXLayer.cppgetTileAt方法的实现。

patch 信息如下:

diff --git a/cocos/2d/CCTMXLayer.cpp b/cocos/2d/CCTMXLayer.cpp
index 74c157b..6e7137d 100644
--- a/cocos/2d/CCTMXLayer.cpp
+++ b/cocos/2d/CCTMXLayer.cpp
@@ -324,10 +324,7 @@ Sprite * TMXLayer::getTileAt(const Vec2& pos)
 
             tile = Sprite::createWithTexture(this->getTexture(), rect);
             tile->setBatchNode(this);
-            tile->setPosition(getPositionAt(pos));
-            tile->setPositionZ((float)getVertexZForPos(pos));
-            tile->setAnchorPoint(Vec2::ZERO);
-            tile->setOpacity(_opacity);
+            setupTileSprite(tile, pos, _tiles[z]);
 
             ssize_t indexForZ = atlasIndexForExistantZ(z);
             this->addSpriteWithoutQuad(tile, static_cast<int>(indexForZ), z);

commit 信息:e5e5534e6c5f83ad550d43118271c903185553c6

标签: lua

?>