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.”。好吧,我设法用指针和使用运动体而不是静态体修复了它。但我也会尝试一下棱柱关节。