我正在开发一种自上而下风格的游戏,用户可以一次控制多个角色。这些角色可以向任何方向移动。使用Box2d进行碰撞检测时,角色可以碰到静态物体(墙壁,建筑物)。用户可以通过在屏幕上拖动手指来移动相机。这将移动CCLayer和我添加到图层的任何包含CCSprite对象。
这工作得很好,但后来我意识到移动图层和精灵并没有移动它们附着的Box2d体。尸体继续沿原始投射移动。我一直在寻找答案,但似乎没有人有这个问题导致我相信我的方法可能会被取消。
我考虑过移动相机而不是图层,但经过大量的谷歌搜索后,似乎大多数人都不喜欢这个想法。那么有人有任何建议吗?
答案 0 :(得分:0)
我的方法有些偏差。我没有使用Box2D进行碰撞检测以外的任何操作,因此我不应该使用它来在屏幕上移动我的精灵。我更新了我的代码,让cocos2d处理我精灵的位置,然后根据精灵的位置更新了box2d的身体位置。
这是我发现有用的教程: http://www.raywenderlich.com/606/how-to-use-box2d-for-just-collision-detection-with-cocos2d-iphone
该教程解释了如何根据cocos2d sprite的位置更新正文位置。另外,由于我在移动图层,我不得不对教程代码进行一些修改。这是:
CCSprite *sprite = (CCSprite*)b->GetUserData();
CGPoint pos = [gameLayer convertToWorldSpace:[sprite position]];
b2Vec2 b2Position = b2Vec2(pos.x/PTM_RATIO, pos.y/PTM_RATIO);
float32 b2Angle = -1 * CC_DEGREES_TO_RADIANS(sprite.rotation);
b->SetTransform(b2Position, b2Angle);
方法convertToWorldSpace:(CGPoint)point
获取精灵的位置,并根据您在屏幕上移动CCLayer位置的方式将其位置转换为世界空间。
我希望其他人觉得这很有帮助!