我正在制作一个平台游戏,我有一个角色在不同的平台上跳跃,直到他到达关卡的末尾。 一种平台是漂浮在水面上的树木。原木沿着潮水缓慢上下移动。 每个平台实际上都是一个b2体。这是我如何定义一个平台:
b2Body *platformbody;
b2BodyDef platforbodydef;
b2FixtureDef platformfixdef;
b2PolygonShape dynamicBox;
dynamicBox.SetAsBox(0.5f, 0.5f);
platforbodydef.type=b2_staticBody;
platforbodydef.position.Set(BlockPlatX[i][j], BlockPlatY[i][j]);
platformbody= world->CreateBody(&platforbodydef);
platformfixdef.shape=&dynamicBox;
platformsprite=[CCPhysicsSprite spriteWithFile:@"TreeLog.png"];
dynamicBox.SetAsBox(platformsprite.texture.contentSize.width/PTM_RATIO/2,platformsprite.texture.contentSize.height/PTM_RATIO/2);
platformfixdef.friction=1;
platformfixdef.density=1;
platformfixdef.restitution=0;
platformbody->CreateFixture(&platformfixdef);
if(platforbodydef.position.y < watersprite.contentSize.height/2)
{
platforbodydef.position.Set(prevPlatX + 300, watersprite.contentSize.height/2 + 10);
CGPoint point=CGPointMake(platforbodydef.position.x,watersprite.contentSize.height/2);
CCMoveTo *waterMove=[CCMoveTo actionWithDuration:3 position:point];
point=CGPointMake(platforbodydef.position.x,watersprite.contentSize.height/2+ 10);
CCMoveTo *waterMoveBack=[CCMoveTo actionWithDuration:3 position:point];
CCSequence* sequence = [CCSequence actions:waterMove,waterMoveBack, nil];
CCRepeatForever* repeat = [CCRepeatForever actionWithAction:sequence];
[platformsprite runAction:repeat];
}
[platformsprite setPTMRatio:PTM_RATIO];
[platformsprite setB2Body:platformbody];
[platformsprite setPosition:CGPointMake(platforbodydef.position.x, platforbodydef.position.y)];
[self addChild:platformsprite z:4 tag: 10000 + i*100 + j];
我正在使用循环,因此我创建了多个这样的平台。
但问题是当精灵运行动作序列时,与其关联的b2body的位置不会改变,这显然会导致很多问题。 无论如何我可以使用它的标签访问精灵的b2体并改变身体的位置吗?
答案 0 :(得分:0)
首先,精灵跟随身体,而不是反过来。当你通过setTransform重新定位b2Body时,你必须非常小心,因为你可以找到一些非常奇怪的行为。碰撞没有以适当的方式进行,所以如果移动的身体与其他东西相交,可能会发生一些疯狂的事情。
为什么使用序列在水面上移动身体。你最好使用一个棱柱形接头来推动它,并在轨道末端放置一个传感器,它将使接头的电机回复,使其向另一个方向移动。让物理引擎处理运动。这样你就可以让系统以预期的方式工作,精灵会自动更新它在身体上的位置。
编辑:我还建议使用visual box2d编辑器。您使用Cocos2d作为引擎,因此很少有人可以选择。我个人推荐&#34;真正有用的Box2D编辑器&#34;或&#34; R.U.B.E。&#34;简而言之。