简体   繁体   English

在Cocos2D iPhone中将动态B2body固定在地面上

[英]Fixing dynamic b2body on groundbody in cocos2d iphone

I have started working with rope physics.Somehow i have created ropes using Revolute joints . 我已经开始研究绳索物理。以某种方式,我使用Revolute关节创建了绳索。 I have implemented one rope attached with one circle shaped b2body ,now i want to fix my one end of rope on top of the screen but i have used dynamic body so i am having difficulties to fix it on top of the screen.I really need help on this , i stuck with this from last couple of days . 我已经实现了一根绳子与一个圆形b2body相连,现在我想将一根绳子的一端固定在屏幕顶部,但是我使用了动态物体,因此我很难将其固定在屏幕顶部。我确实需要在这方面有所帮助,最近几天我坚持下来。

This is my dynamic body : 这是我充满活力的身体:

b2BodyDef bodyDef;
bodyDef.type = b2_dynamicBody;
b2Vec2 startPos = [self toMeters:ccp(s.width/2 ,s.height)];
bodyDef.position = startPos;
b2FixtureDef fixtureDef;
fixtureDef.density = 0.1;
b2PolygonShape polygonShape;
polygonShape.SetAsBox(linkWidth,linkHeight);
fixtureDef.shape = &polygonShape;

joints : 关节:

 b2Body* mylink = world->CreateBody( &bodyDef1 );
 mylink->CreateFixture( &fixtureDef1 );

 b2RevoluteJointDef revoluteJointDef;
 revoluteJointDef.bodyA = mylink;        
 revoluteJointDef.bodyB = link;

revoluteJointDef.localAnchorA.Set( 0,  linkHeight);
revoluteJointDef.localAnchorB.Set( 0, -linkHeight);

Ropes bodies : 绳索体:

for (int i = 0; i < 10; i++) { 对于(int i = 0; i <10; i ++){

    b2Body* newLink = world->CreateBody( &bodyDef );
    newLink->CreateFixture( &fixtureDef );
    PhysicsSprite* segmentSprite = [PhysicsSprite spriteWithFile:@"rope_seg_new2.png"];
    [self addChild:segmentSprite];
    [segmentSprite setPhysicsBody:link];

    revoluteJointDef.bodyA = link;
    revoluteJointDef.bodyB = newLink;
    world->CreateJoint( &revoluteJointDef );

    link = newLink;  //prepare for next iteration
}

finally i joint my circle shaped dynamic body this way : 最终我以这种方式连接了我的圆形动态身体:

PhysicsSprite* circleBodySprite = [PhysicsSprite spriteWithFile:@"medal1.png"];

[self addChild:circleBodySprite z:1];

b2CircleShape circleShape;
circleShape.m_radius = circleBodySprite.contentSize.width/2 / PTM_RATIO;
fixtureDef.shape  = &circleShape;
fixtureDef.density =0.5;   
b2Body* chainBase =world->CreateBody( &bodyDef );
chainBase->CreateFixture( &fixtureDef );
[circleBodySprite setPhysicsBody:chainBase];
balloon = chainBase;


//another revolute joint to connect the chain(of ropes ) to the circle 

revoluteJointDef.bodyA = link;        //the last added link of the chain
revoluteJointDef.bodyB = chainBase;

//the regular position for chain link joints, as above

revoluteJointDef.localAnchorA.Set(0,linkWidth);

//a little in from the edge of the circle

revoluteJointDef.localAnchorB.Set(0,linkWidth);

world->CreateJoint( &revoluteJointDef );

//toMeters called here // toMeters在这里打电话

-(b2Vec2) toMeters:(CGPoint)point { return b2Vec2(point.x / PTM_RATIO, point.y / PTM_RATIO); -(b2Vec2)至米:(CGPoint)point {返回b2Vec2(point.x / PTM_RATIO,point.y / PTM_RATIO);

} }

please help .. 请帮忙 ..

// Restrict paddle along the x axis
b2PrismaticJointDef jointDef;
b2Vec2 worldAxis(1.0f, 0.0f);
jointDef.collideConnected = true;
jointDef.Initialize(_paddleBody, _groundBody, 
_paddleBody->GetWorldCenter(), worldAxis);
_world->CreateJoint(&jointDef);

This code has been taken from raywenderlich's website where he tell how to make a box2d breakout game.here is the link http://www.raywenderlich.com/28604/how-to-create-a-breakout-game-with-box2d-and-cocos2d-2-x-tutorial-part-1 . 此代码取自raywenderlich的网站,他在该网站上讲述了如何制作box2d突破游戏。此处为链接http://www.raywenderlich.com/28604/how-to-create-a-breakout-game-with-box2d -and-cocos2d-2-x-tutorial-part-1

Now i wan't fully able to understand what you wanted to do but i think this might help. 现在我无法完全理解您想要做什么,但是我认为这可能会有所帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM