2013-10-25 1 views
1

У меня есть ведро, в которое я хочу добавить box2d body. не на целых ведрах, а слева, справа и снизу, поэтому я могу бросить мяч в ведро. Вот мой ковш. Я добавил тело box2d на левой и правой стороне моего ковша. как этотДобавление box2d Body на Sprite Cocos2d

enter image description here

Это работает нормально для меня Но когда я добавить тело на дне, чем моя игра разваливается.

Вот мой код для добавления 2 кузовов на ведро с комментарием нижнего тела.

-(b2Body *) createBucket 
    { 
     CCSprite* bucket = [CCSprite spriteWithFile:@"simple-bucket-md.png"]; 
     [self addChild:bucket z:3]; 

     b2Body* b_bucket; 

     //set this to avoid updating this object in the tick schedule 
     bucket.userData = (void *)YES; 

     b2BodyDef bodyDef; 
     bodyDef.type = b2_staticBody; 
     CGPoint startPos = ccp(400,150); 
     bodyDef.position = [self toMeters:startPos]; 
     bodyDef.userData = bucket; 
     bodyDef.gravityScale = 0; 

     b2PolygonShape dynamicBox; 
      //---------------------------------- 
     // THis IS body for Left Side 
      //---------------------------------- 
     int num = 5; 
     b2Vec2 verts[] = { 
      b2Vec2(-29.1f/PTM_RATIO, 25.0f/PTM_RATIO), 
      b2Vec2(-25.4f/PTM_RATIO, -14.9f/PTM_RATIO), 
      b2Vec2(-18.7f/PTM_RATIO, -14.9f/PTM_RATIO), 
      b2Vec2(-21.8f/PTM_RATIO, 26.7f/PTM_RATIO), 
      b2Vec2(-28.9f/PTM_RATIO, 25.1f/PTM_RATIO) 
     }; 

     dynamicBox.Set(verts, num); 

     b2FixtureDef fixtureDef; 
     fixtureDef.shape = &dynamicBox; 
     fixtureDef.friction = 0.7; 
     fixtureDef.density = 10.0f; 
     fixtureDef.restitution = 0.7; 

     b_bucket = world->CreateBody(&bodyDef); 
     b_bucket->CreateFixture(&fixtureDef); 
     //---------------------------------- 
     // THis IS body for Right Side 
     //---------------------------------- 
     int num1 = 5; 
     b2Vec2 verts1[] = { 
      b2Vec2(16.8f/PTM_RATIO, 27.0f/PTM_RATIO), 
      b2Vec2(15.9f/PTM_RATIO, -11.5f/PTM_RATIO), 
      b2Vec2(22.1f/PTM_RATIO, -10.7f/PTM_RATIO), 
      b2Vec2(24.6f/PTM_RATIO, 26.9f/PTM_RATIO), 
      b2Vec2(16.9f/PTM_RATIO, 26.7f/PTM_RATIO) 
     }; 


     dynamicBox.Set(verts1, num1); 
     fixtureDef.shape = &dynamicBox; 
     b_bucket-> CreateFixture(&fixtureDef); 

     //---------------------------------- 
     // THis IS body for Bottom 
     //---------------------------------- 
     /* 
     int num2 = 5; 
     b2Vec2 verts2[] = { 
      b2Vec2(-23.0f/PTM_RATIO, -21.6f/PTM_RATIO), 
      b2Vec2(18.9f/PTM_RATIO, -21.0f/PTM_RATIO), 
      b2Vec2(18.2f/PTM_RATIO, -26.1f/PTM_RATIO), 
      b2Vec2(-22.8f/PTM_RATIO, -25.9f/PTM_RATIO), 
      b2Vec2(-23.0f/PTM_RATIO, -21.7f/PTM_RATIO) 
     }; 
     dynamicBox.Set(verts2, num2); 
     fixtureDef.shape = &dynamicBox; 
     b_bucket-> CreateFixture(&fixtureDef); 
     */ 

     return b_bucket; 
    } 
+0

downvoters. пожалуйста, прокомментируйте, почему у вас есть этот вопрос. Спасибо – Zohaib

+1

Какая линия рушится? Какая ошибка? – ssantos

ответ

2

Ваши вершины по часовой стрелке упорядочены, в то время как они должны быть против часовой стрелки.

Вы должны создать многоугольники с против часовой стрелкой (CCW). Мы должны быть осторожны, потому что понятие CCW относится к правой системе координат с осью z, направленной из плоскости. Это может оказаться по часовой стрелке на экране, в зависимости от ваших условных обозначений системы координат.

Counter clock-wise vertices

Кроме того, для того, чтобы создать 4-х сторон многоугольника (который, кажется, что вы пытаетесь), вам просто нужно 4 вершины. Попробуйте что-то вроде этого.

int num2 = 4; 
b2Vec2 verts2[] = { 
    b2Vec2(-22.8f/PTM_RATIO, -25.9f/PTM_RATIO), 
    b2Vec2(18.2f/PTM_RATIO, -26.1f/PTM_RATIO), 
    b2Vec2(18.9f/PTM_RATIO, -21.0f/PTM_RATIO), 
    b2Vec2(-23.0f/PTM_RATIO, -21.6f/PTM_RATIO)   
}; 
dynamicBox.Set(verts2, num2); 
fixtureDef.shape = &dynamicBox; 
b_bucket-> CreateFixture(&fixtureDef); 

Обратите внимание, что вы также можете удалить пятую вершину боковых тел.

+0

Я использую VertexHelper, но когда я создаю прямоугольник, он дает мне 5 вершин. когда я соединяю последние вершины с первым, он становится 5 вершинами. – Zohaib

+1

, затем не подключайте последний с первым – LearnCocos2D