#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);
когда на каждом ребре у нас есть: (от точки к точке), когда каждая точка является вектором.