граница мира в cocos2d для iphone

#iphone #cocos2d-iphone #box2d

#iPhone #cocos2d-iphone #box2d

Вопрос:

я установил для мира моей игры (cocos2d- b2world) границы, подобные этой :

 -(void)worldEdge
{
    CGSize winSize = [CCDirector sharedDirector].winSize;
    b2BodyDef groundBodyDef;
    groundBodyDef.position.Set(0,0);
    b2Body *groundBody = world->CreateBody(amp;groundBodyDef);
    b2PolygonShape groundBox;
    b2FixtureDef boxShapeDef;
    boxShapeDef.shape = amp;groundBox;
    groundBox.SetAsEdge(b2Vec2(0,0), b2Vec2(winSize.width/PTM_RATIO, 0));
    groundBody->CreateFixture(amp;boxShapeDef);
    groundBox.SetAsEdge(b2Vec2(0,0), b2Vec2(0, winSize.height/PTM_RATIO));
    groundBody->CreateFixture(amp;boxShapeDef);
    groundBox.SetAsEdge(b2Vec2(0, winSize.height 100/PTM_RATIO), b2Vec2(winSize.width 100/PTM_RATIO, winSize.height 100/PTM_RATIO));
    groundBody->CreateFixture(amp;boxShapeDef);
    groundBox.SetAsEdge(b2Vec2(winSize.width 100/PTM_RATIO, winSize.height 100/PTM_RATIO), b2Vec2(winSize.width/PTM_RATIO, 0));
    groundBody->CreateFixture(amp;boxShapeDef);
}
  

мой iphone находится в портретном режиме, и каким-то образом у меня нет краев сверху, но на земле у меня есть, и с левой стороны у меня есть, но с правой стороны у меня нет.

кажется, я чего-то не понимаю в краях мира, может ли кто-нибудь помочь мне изменить это так, чтобы внизу было «без края», но справа было ребро?

большое спасибо .

Ответ №1:

В cocos2d ccp (0,0) размещен в нижнем левом углу.

  -(void)worldEdge
{
CGSize winSize = [CCDirector sharedDirector].winSize;
b2BodyDef groundBodyDef;
groundBodyDef.position.Set(0,0);
b2Body *groundBody = world->CreateBody(amp;groundBodyDef);
b2PolygonShape groundBox;
b2FixtureDef boxShapeDef;
boxShapeDef.shape = amp;groundBox;
groundBox.SetAsEdge(b2Vec2(0,winSize.height/PTM_RATIO), b2Vec2(winSize.width/PTM_RATIO, winSize.height/PTM_RATIO));//for Top edge
groundBody->CreateFixture(amp;boxShapeDef);
groundBox.SetAsEdge(b2Vec2(0,0), b2Vec2(0, winSize.height/PTM_RATIO));//for Left edge
groundBody->CreateFixture(amp;boxShapeDef);
groundBox.SetAsEdge(b2Vec2(winSize.width/PTM_RATIO, 0), b2Vec2(winSize.width/PTM_RATIO, winSize.height/PTM_RATIO));//for Right
groundBody->CreateFixture(amp;boxShapeDef);

groundBody->CreateFixture(amp;boxShapeDef);
}
  

Комментарии:

1. Для совместимости с сетчаткой вам следует вызвать winSizeInPixels

Ответ №2:

я понял. как описано в приведенном выше ответе, вот как я это делаю:

 // bottom edge
groundBox.SetAsEdge(b2Vec2(0,0), b2Vec2(width,0));
groundBody->CreateFixture(amp;groundBox);

// top edge
groundBox.SetAsEdge(b2Vec2(0,height), b2Vec2(width,height));
groundBody->CreateFixture(amp;groundBox);

// left edge
groundBox.SetAsEdge(b2Vec2(0,height), b2Vec2(0,0));
groundBody->CreateFixture(amp;groundBox);

// right edge
groundBox.SetAsEdge(b2Vec2(width,height), b2Vec2(width,0));
groundBody->CreateFixture(amp;groundBox);
  

когда на каждом ребре у нас есть: (от точки к точке), когда каждая точка является вектором.