Смещение спрайтов от тел box2D на устройстве отображения сетчатки - PullRequest
0 голосов
/ 12 сентября 2011

Я делаю свою первую игру с cocos2d и box2d и обнаружил нечто довольно странное. У меня есть несколько тел box2D, летающих вокруг, когда я включаю отладочную отрисовку, я вижу, что на моем устройстве отображения сетчатки тела box2d расположены как на устройстве 480x320, то есть в левом нижнем квадранте экрана, но спрайты в правильном положении.

Например, тело, которое должно быть в (720 320), будет иметь свой спрайт, расположенный в этой позиции, а тело box2D, нарисованное в (360 160).

Взаимодействие происходит, только смещение, так что все работает нормально ...

Когда я тестирую игру на устройстве с дисплеем 480x320, все выровнено правильно. Очевидно, что-то не хватает в переводе с устройства, не отображающего сетчатку, на устройство, отображающее сетчатку, но я не могу работать это из.

Пример метода, который создает тело:

-(void)addArrow{

    CGSize winSize = [CCDirector sharedDirector].winSize;
    arrow = [CCSprite spriteWithFile:[gameSettings objectAtIndex:0]];
    arrow.position = ccp(bowBar.position.x,bowBar.position.y);
    arrow.tag = 1;


    // Create ball body 
    b2BodyDef arrowBodyDef;
    arrowBodyDef.type = b2_dynamicBody;
    arrowBodyDef.position.Set(arrowPoint.x/PTM_RATIO, arrowPoint.y/PTM_RATIO);
    arrowBodyDef.userData = arrow;
    b2Body * arrowBody = world->CreateBody(&arrowBodyDef);
    arrowBody->SetTransform(arrowBody->GetPosition(),-  CC_DEGREES_TO_RADIANS(bowBar.rotation));
    b2PolygonShape rectangle;
    rectangle.SetAsBox(arrow.contentSize.width/PTM_RATIO/2,    arrow.contentSize.height/PTM_RATIO/2);


    b2FixtureDef rectangleShapeDef;
    rectangleShapeDef.shape = &rectangle;
    rectangleShapeDef.density = 150.0f;
    rectangleShapeDef.friction = 1.0f;
    rectangleShapeDef.restitution = 0.0f;
    arrowFixture = arrowBody->CreateFixture(&rectangleShapeDef);

    [self addChild:arrow z:15]



}

Ответы [ 2 ]

1 голос
/ 23 марта 2012

Также помните, что вам, возможно, придется изменить везде, где вы используете макрос PTM_RATIO, чтобы включить CC_CONTENT_SCALE_FACTOR (). Примерно так:

 b2Vec2(point.x / PTM_RATIO, point.y / PTM_RATIO)

может потребоваться перейти к этому:

b2Vec2(pixel.x / PTM_RATIO * CC_CONTENT_SCALE_FACTOR(), pixel.y / PTM_RATIO * CC_CONTENT_SCALE_FACTOR())
0 голосов
/ 12 сентября 2011

Это просто отладочная дро, это неправильно. Вы можете выстроить это так:

 glPushMatrix();
 glScalef(CC_CONTENT_SCALE_FACTOR(), CC_CONTENT_SCALE_FACTOR(), 1);
 world->DrawDebugData();
 glPopMatrix();
...