2013-06-27 1 views
0

Я хочу переместить один объект над другим объектом без отскока при столкновении.Как переместить один объект над другим объектом без отскока в box2d в iphone?

В Простой у меня есть один шар (тело), ​​и у меня есть одно прямоугольное изображение линии (тело), ​​изображение - наклон 45 градусов.

Падение мяча с максимальной скорости составляет 20, когда мяч коснется изображения склона (Статическое тело), ​​он будет всегда отскакивать и продолжать работать.

Когда мяч попадает на изображение линии, он не будет отскакивать и замедлять скорость в зависимости от столкновения и остановки мяча в конце. Точно так же, как это происходит в реальном мире, когда мяч сталкивается с чем-то, скорость шара замедляется и поворачивается в соответствии с столкновением, а затем останавливается из-за уменьшения скорости столкновения.

Я делаю это, но не могу добиться результата, чего хочу.

-(id) init 
{ 
if((self=[super init])) { 

    CGSize winSize = [CCDirector sharedDirector].winSize; 
    // Create a world 
    b2Vec2 gravity = b2Vec2(0.0f, 0.0f); 
    _world = new b2World(gravity); 


    ///////////////////////// Ball /////////////////////////////// 

    // Create sprite and add it to the layer 
    CCSprite *ball = [CCSprite spriteWithFile:@"ball.png"]; 
    ball.position = ccp(100, 200); 
    ball.tag = 1; 
    [self addChild:ball]; 

    // Create ball body 
    b2BodyDef ballBodyDef; 
    ballBodyDef.type = b2_dynamicBody; 
    ballBodyDef.position.Set(127/PTM_RATIO, 210/PTM_RATIO); 
    ballBodyDef.userData = ball; 
    ballBody = _world->CreateBody(&ballBodyDef);  // b2Body * ballBody 

    // Create circle shape 
    b2CircleShape circle; 
    circle.m_radius = 26.0/PTM_RATIO; 

    // Create shape definition and add to body 
    b2FixtureDef ballShapeDef; 
    ballShapeDef.shape = &circle; 
    ballShapeDef.density = 15.0f; 
    ballShapeDef.friction = 2.f; 
    ballShapeDef.restitution = 0.0f; 
    _ballFixture = ballBody->CreateFixture(&ballShapeDef); 




    b2Vec2 force = b2Vec2(73, -52); 
    ballBody->ApplyLinearImpulse(force, ballBodyDef.position); 

    //ballBody->SetLinearVelocity(b2Vec2(10,0)); // try 
    // ballBody->SetAngularVelocity(0);   // try 


    ///////////////////////// Ball /////////////////////////////// 







    // Create paddle and add it to the layer 
    CCSprite *paddle = [CCSprite spriteWithFile:@"paddle.png"]; 
    paddle.position = ccp(winSize.width/2, 50); 
    [self addChild:paddle]; 

    // Create paddle body 
    b2BodyDef paddleBodyDef; 
    paddleBodyDef.type = b2_staticBody;   //b2_staticBody, b2_dynamicBody 
    paddleBodyDef.position.Set(winSize.width/2/PTM_RATIO, 50/PTM_RATIO); 
    paddleBodyDef.userData = paddle; 
    paddleBodyDef.angle = 75; 
    _paddleBody = _world->CreateBody(&paddleBodyDef); 

    // Create paddle shape 
    b2PolygonShape paddleShape; 
    paddleShape.SetAsBox(paddle.contentSize.width/PTM_RATIO/2, paddle.contentSize.height/PTM_RATIO/2); 

    // Create shape definition and add to body 
    b2FixtureDef paddleShapeDef; 
    paddleShapeDef.shape = &paddleShape; 
    paddleShapeDef.density = 25.0f; 
    paddleShapeDef.friction = 1.1f; 
    paddleShapeDef.restitution = 0.1f; 
    _paddleFixture = _paddleBody->CreateFixture(&paddleShapeDef); 






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


    [self schedule:@selector(tick:)]; 
    self.touchEnabled = YES; 
} 



- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 

if (_mouseJoint != NULL) return; 

UITouch *myTouch = [touches anyObject]; 
CGPoint location = [myTouch locationInView:[myTouch view]]; 
location = [[CCDirector sharedDirector] convertToGL:location]; 
b2Vec2 locationWorld = b2Vec2(location.x/PTM_RATIO, location.y/PTM_RATIO); 

if (_paddleFixture->TestPoint(locationWorld)) { 

    b2MouseJointDef md; 

    md.bodyA = _groundBody; 
    md.bodyB = _paddleBody; 
    md.target = locationWorld; 
    md.collideConnected = true; 
    md.maxForce = 1000.0f * _paddleBody->GetMass(); 

    _mouseJoint = (b2MouseJoint *)_world->CreateJoint(&md); 
    _paddleBody->SetAwake(true); 
} 

// [self kick];

} 

-(void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 

if (_mouseJoint == NULL) return; 

UITouch *myTouch = [touches anyObject]; 
CGPoint location = [myTouch locationInView:[myTouch view]]; 
location = [[CCDirector sharedDirector] convertToGL:location]; 
b2Vec2 locationWorld = b2Vec2(location.x/PTM_RATIO, location.y/PTM_RATIO); 

_mouseJoint->SetTarget(locationWorld); 





} 
+0

дают 0 реституцию грести. – Renaissance

+0

все еще подпрыгивает сэр. –

+0

http://www.4shared.com/account/home.jsp#dir=XfHFTJBV –

ответ

0

Хорошо, поэтому у вас есть безумный очень маленький mistak, проблема с гравитацией.

изменить его

b2Vec2 gravity = b2Vec2(0.0f, -10.0f); 
+0

где я могу изменить эту строку перед миром? перед миром он не работает. Мяч не идет в ногу. мяч вниз к полу сразу. –

+0

Извините, я не понял, что вы говорите? – Renaissance

+0

Да, сейчас он работает. Благодаря aloot. Большое спасибо ... Могу я задать вам еще один вопрос? –

 Смежные вопросы

  • Нет связанных вопросов^_^