Cocos2d iphone 如何使用标记访问CCPhysicsPrite的b2body

Cocos2d iphone 如何使用标记访问CCPhysicsPrite的b2body,cocos2d-iphone,physics,box2d-iphone,Cocos2d Iphone,Physics,Box2d Iphone,我在做一个平台游戏,我有一个角色在不同的平台上跳跃,直到他达到关卡的终点。 一种平台是漂浮在水面上的圆木。原木沿着潮水缓慢地上下移动。 每个平台实际上是一个实体。以下是我如何定义平台: b2Body *platformbody; b2BodyDef platforbodydef; b2FixtureDef platformfixdef; b2PolygonShape dynamicBox;

我在做一个平台游戏,我有一个角色在不同的平台上跳跃,直到他达到关卡的终点。 一种平台是漂浮在水面上的圆木。原木沿着潮水缓慢地上下移动。 每个平台实际上是一个实体。以下是我如何定义平台:

                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*平台体;
b2BodyDef平台用于BodyDef;
b2FixtureDef平台FixtureDef;
B2polygonshapedynamicbox;
动态框设置框(0.5f,0.5f);
platforbodydef.type=b2_静止体;
platforbodydef.position.Set(BlockPlatX[i][j],BlockPlatY[i][j]);
platformbody=world->CreateBody(&platformbodydef);
platformfixdef.shape=&dynamicBox;
platformsprite=[CCPhysicsPrite spriteWithFile:@“TreeLog.png”];
dynamicBox.SetAsBox(platformsprite.texture.contentSize.width/PTM_RATIO/2,platformsprite.texture.contentSize.height/PTM_RATIO/2);
平台固定定义摩擦=1;
平台固定定义密度=1;
platformfixdef.Restoration=0;
platformbody->CreateFixture(&platformfixdef);
if(platforbodydef.position.y
我使用循环,所以我创建了不止一个这样的平台

但问题是,当精灵运行动作序列时,与之相关的身体位置不会改变,这显然会导致很多问题。
我是否可以使用标签访问精灵的b2body并更改body的位置?

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

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


编辑:我还建议使用VisualBox2D编辑器。您正在使用Cocos2d作为引擎,因此可供选择的内容非常少。我个人会推荐“非常有用的Box2D编辑器”或简称“R.U.B.E.”。

好吧,我设法用指针和使用运动体而不是静态体修复了它。但我也会尝试一下棱柱关节。