上一篇地址:http://www.cocoachina.com/bbs/read.php?tid=196685
- Collision detected
碰撞检测
自从我们的精灵能够四处移动后,你一定非常激动。同样也有一些奇怪的事情发生。你大概也已经注意到了。精灵可以穿越任意地点。所以我们接下来就要让它变得更真实。

Through the house
回到瓦片地图编辑器。按下“新图块”菜单并打开新的接下来使用的素材。右击红色的那个,并为之设定新的属性。(注意大小写。不然会出问题。)

现在建造一个新的层,然后取名为“blockage01”。(或者其他你喜欢的名字,只要你能记住就行)在地图上涂上这些红色的矩形块以此标记那些我们的精灵不能移动的区域。

现在,你也许已经知道我们接下来要做什么了!我们编程让程序检测到红色矩形块并获取到它的属性——“Blockage”属性为真。(注意是“true”还是“True”,这是由关联的)使这些区域能被通过或不能。
回到VS。这次我确信你知道应该在哪里精确地放置这些代码。
加在‘HelloWorldScene.h’里面
cocos2d::TMXLayer *_blockage;加在‘HelloWorldScene.cpp’里面<pre class="brush:cpp; toolbar: true; auto-links: false;">_blockage = _tileMap->layerNamed("Blockage01");但是这次我么你要设置这些红色瓦片为不可见。
_blockage->setVisible(false);添加一个新的方法来计算瓦片的坐标<pre class="brush:cpp; toolbar: true; auto-links: false;">class HelloWorld : public cocos2d::Layer { public:cocos2d::Point tileCoordForPosition(cocos2d::Point position);
} ``` In the ‘HelloWorldScene.cpp’: <pre class="brush:cpp; toolbar: true; auto-links: false;">Point HelloWorld::tileCoordForPosition(Point position) { int x = position.x / _tileMap->getTileSize().width; int y = ((_tileMap->getMapSize().height * _tileMap->getTileSize().height) - position.y) / _tileMap->getTileSize().height; return Point(x, y); } ``` 原始坐标在画面的左上角。所以你可能对上面的数学公式有点困惑。 <img title = '004.png' src='http://cdn.cocimg.com/bbs/attachment/Fid_41/41_298631_1b6f267e3c8751c.png' > The original coordinate 我们替换掉原本在“void HelloWorldPlayerPosition(Point position)”的代码<pre class="brush:cpp; toolbar: true; auto-links: false;">void HelloWorld::setPlayerPosition(Point position) { Point tileCoord = this->tileCoordForPosition(position); int tileGid = _blockage->getTileGIDAt(tileCoord); if (tileGid) { auto properties = _tileMap->getPropertiesForGID(tileGid).asValueMap(); if (!properties.empty()) { auto collision = properties"Blockage”].asString(); if ("True" == collision) { return; } } } _player->setPosition(position); } ``` 我们把精灵的坐标转换为瓦片的坐标。然后使用方法“getTileGIDAt”获得特定位置GID坐标,然后用GID检查瓦片的属性并决定是否能够穿过。(我们之后将添加更多的功能进“void HelloWorld::setPlayerPosition(Point position)’”) 试试运行你的游戏。这次精灵就不会穿过那些你已经堵塞了的区域。并且红色的瓦片不会显示毕竟我们将其设置为了不可见。 <img title = '005.png' src='http://cdn.cocimg.com/bbs/attachment/Fid_41/41_298631_595e7e517996feb.png' > Blockage 打开一个新的瓦片地图材料,并在瓦片地图编辑器中创建一个新的层(我给他这个层命名为‘前景层01’)然后在前景层01上做点农活。。。使用我们之前已经见过的绿色瓦片,在障碍层01上将它们涂绿。(是的。是障碍层01,不是我们之前创建的前景层01)。 <img title = '006.png' src='http://cdn.cocimg.com/bbs/attachment/Fid_41/41_298631_7a97434fc03e0e7.png' > New tile map Create a new layer <img title = '007.png' src='http://cdn.cocimg.com/bbs/attachment/Fid_41/41_298631_68fda2390a0987d.png' > 在‘HelloWorldScene.h’:里面 <pre class="brush:cpp; toolbar: true; auto-links: false;">cocos2d::TMXLayer *_foreground; ``` 在‘HelloWorldScene.cpp’里面<pre class="brush:cpp; toolbar: true; auto-links: false;">_foreground = _tileMap->getLayer("Foreground01"); ``` 添加这些代码进‘void HelloWorld::setPlayerPosition(Point position)’ <pre class="brush:cpp; toolbar: true; auto-links: false;">auto collectable = properties"Collectable"].asString(); if ("True" == collectable) { _blockage->removeTileAt(tileCoord); _foreground->removeTileAt(tileCoord); _player->setPosition(position); } ``` 我们的精灵是一只真正的食草动物。 <img title = '008.png' src='http://cdn.cocimg.com/bbs/attachment/Fid_41/41_298631_69b2146a204dbdc.png' > Herbivore 未完待续~(一日一更) 下一篇地址:http://www.cocoachina.com/bbs/read.php?tid=197159&page=1&toread=1#tpc


