0

我正在开发一个平台游戏,我有一个在不同平台上跳跃的角色,直到他到达关卡的尽头。一种平台是漂浮在水面上的原木。原木随着水流慢慢地上下移动。每个平台实际上都是一个 b2body。这是我定义平台的方式:

                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 的位置并没有改变,这显然会导致很多问题。无论如何我可以使用它的标签访问精灵的 b2body 并改变身体的位置吗?

4

1 回答 1

0

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

为什么要使用序列在水上移动身体。最好使用棱柱形接头将其沿轨道推动,并在轨道末端放置一个传感器,该传感器将反转接头的电机以将其向另一个方向移动。让物理引擎处理运动。通过这种方式,您可以让系统按照预期的方式工作,并且精灵会自动将其位置更新到身体。

编辑:我还建议使用可视 box2d 编辑器。您使用的是 Cocos2d 作为引擎,因此可供选择的很少。我个人会推荐“真正有用的 Box2D 编辑器”或简而言之“RUBE”。

于 2013-09-05T14:21:27.200 回答