在上一篇里基本上已经实现了人物的行走,但是,人物的行走需要一定的规划,而不是漫游在地图之上。
这个规划就是碰撞检测。
上一篇里,我们用了titled这个编辑器来编辑地图。这个编辑器把地图分了不同的层,所以我们可以根据不同的层的名字来做为碰撞检测的条件。
/// <summary> /// 根据目的位置判断是否碰撞类型 /// </summary> /// <param name="p"></param> /// <returns></returns> public int checkCollision(CCPoint p) { //tmxMap.MapSize.width和tmxMap.MapSize.height是定义在tmx地图上的坐标,而不是UI界面上的坐标 //即是(2,3)=(120,180) if (p.x < 0 || p.x > tmxMap.MapSize.width || p.x < 0 || p.y > tmxMap.MapSize.height) return (int)Dtype.KWall; int titleGid = tmxMap.layerNamed("floor").tileGIDAt(p); if (titleGid != 0) return (int)Dtype.TNone; return (int)Dtype.KWall; }
代码如上,由于检测的是floor层,所以tmxMap.layerNamed("floor").tileGIDAt(p);返回的值只有两种情况。当检测到非零,则表明在floor层这里有“地图块”,说明可以行走,反之亦反。
接下来,介绍cocos2d-x for xna 的信息提示:
首先,显示信息也是一个“精灵”。所以我们可以理解为,我们把显示信息这个动作(CCAction)交给一个“精灵”(CCLabelTTF)去执行。
所以,代码的构建如下:
1.显示信息的位置:CCPoint
2.信息精灵:CCLabelTTF
3.动作:CCAction
CCPoint tagPoint=new CCPoint(startPosition.x+0,startPosition.y+60); CCLabelTTF tipLabel = CCLabelTTF.labelWithString(tip, "Arial", 10); tipLabel.position = tagPoint; addChild(tipLabel, 2, 1); CCAction action = CCSequence.actions( CCMoveBy.actionWithDuration(0.5f, new CCPoint(0, 60)), CCDelayTime.actionWithDuration(0.5f), CCFadeOut.actionWithDuration(0.2f), CCCallFuncN.actionWithTarget(this, onShowTipDone) ); tipLabel.runAction(action);