如何使用标签访问CCPhysicsSprite的b2body

时间:2013-09-04 12:25:44

标签: cocos2d-iphone physics box2d-iphone

我正在制作一个平台游戏,我有一个角色在不同的平台上跳跃,直到他到达关卡的末尾。 一种平台是漂浮在水面上的树木。原木沿着潮水缓慢上下移动。 每个平台实际上都是一个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体并改变身体的位置吗?

1 个答案:

答案 0 :(得分:0)

首先,精灵跟随身体,而不是反过来。当你通过setTransform重新定位b2Body时,你必须非常小心,因为你可以找到一些非常奇怪的行为。碰撞没有以适当的方式进行,所以如果移动的身体与其他东西相交,可能会发生一些疯狂的事情。

为什么使用序列在水面上移动身体。你最好使用一个棱柱形接头来推动它,并在轨道末端放置一个传感器,它将使接头的电机回复,使其向另一个方向移动。让物理引擎处理运动。这样你就可以让系统以预期的方式工作,精灵会自动更新它在身体上的位置。

编辑:我还建议使用visual box2d编辑器。您使用Cocos2d作为引擎,因此很少有人可以选择。我个人推荐&#34;真正有用的Box2D编辑器&#34;或&#34; R.U.B.E。&#34;简而言之。