cocos2d-iphone バージョン 2.0 にアップグレードした後、オブジェクトが描画される座標に問題があります。私の知る限り、すべてのテンプレートを正しくアップグレードしましたが、まだ問題があります。たとえば、「Learning Cocos2D」という本 (box2D の第 10 章) では、最初に createGround と createBoxAtLocation を行う単純なメソッドをいくつか実装しました。最初のメソッドは init から呼び出され、次のようになります。
- (void)createGround {
CGSize winSize = [[CCDirector sharedDirector] winSize];
// Set up the Box2D coordinates that correspond to the four corners of the ground boundary
float32 margin = 10.0f;
b2Vec2 lowerLeft = b2Vec2(margin/PTM_RATIO, margin/PTM_RATIO);
b2Vec2 lowerRight = b2Vec2((winSize.width-margin)/PTM_RATIO, margin/PTM_RATIO);
b2Vec2 upperRight = b2Vec2((winSize.width-margin)/PTM_RATIO,
(winSize.height-margin)/PTM_RATIO);
b2Vec2 upperLeft = b2Vec2(margin/PTM_RATIO,
(winSize.height-margin)/PTM_RATIO);
// Define the static container body, which will provide the collisions at screen borders.
b2BodyDef screenBorderDef;
screenBorderDef.position.Set(0, 0);
b2Body* screenBorderBody = world->CreateBody(&screenBorderDef);
b2EdgeShape screenBorderShape;
// Create fixtures for the four borders (the border shape is re-used)
screenBorderShape.Set(lowerLeft, lowerRight);
screenBorderBody->CreateFixture(&screenBorderShape, 0);
screenBorderShape.Set(lowerRight, upperRight);
screenBorderBody->CreateFixture(&screenBorderShape, 0);
screenBorderShape.Set(upperRight, upperLeft);
screenBorderBody->CreateFixture(&screenBorderShape, 0);
screenBorderShape.Set(upperLeft, lowerLeft);
screenBorderBody->CreateFixture(&screenBorderShape, 0);
}
これは、画面の端に 10 ポイントのマージンを持った緑色の境界線を描くことになっています。ただし、下と左端の緑の境界しか見えません。上端と右端は、それぞれ画面の高さと幅の 2 倍で描画されます。
同じ Box2D の例では、ユーザーが画面に触れた時点でボックスが描画されます。ユーザーが画面にタッチすると、タッチの位置を指定して createBoxAtLocation メソッドが呼び出されます。タッチ位置の座標は cocos2d ポイント座標であり、予想される範囲内にあります。以下は createBoxAtLocation メソッドです。
- (void)createBoxAtLocation:(CGPoint)location
withSize:(CGSize)size
{
// First create a body
b2BodyDef bodyDef;
bodyDef.type = b2_dynamicBody; // This box is a dynamic body (movement handled by box2d)
bodyDef.position = b2Vec2(location.x/PTM_RATIO, // convert the point location to meters location
location.y/PTM_RATIO);
bodyDef.allowSleep = false;
b2Body *body = world->CreateBody(&bodyDef);
// Now create one or more fixtures to add to the body.
// To do this, you must first create a shape. In this case, we are creating a square box
b2PolygonShape shape;
shape.SetAsBox(size.width/2/PTM_RATIO, size.height/2/PTM_RATIO); // SetAsBox takes half dimensions as parameters
b2FixtureDef fixtureDef;
fixtureDef.shape = &shape;
fixtureDef.density = 1.0; // set density. The higher the number, the heavier it is
body->CreateFixture(&fixtureDef);
}
たとえば、タッチ位置がポイント座標 193, 190.5 (iPhone Retina ディスプレイ上) であった場合、メソッド createBoxAtLocation は、location.x = 193 および location.y であっても、ポイント座標 386, 381 にボックスを描画します。 = 190.5。PTM_RATIO が 50 であるため、bodyDef.position の box2d 座標は 3.86、3.81 であることに注意してください。
また、シミュレーターを実行し、ハードウェアとして iPhone (Retina 以外) を選択すると、ボックスが適切な場所に作成され、createGround が画面空間内に適切な境界を生成するとも言えます。また、コードはすべてのデバイスの適切なサイズの画面を認識していると言えます (たとえば、cocos2d は iphone の場合は cocos2d: surface size: 480x320 を出力し、iphone 3.5 retina の場合は cocos2d: surface size: 960x640 を出力します)。最後に、デバッガーを実行し、描画ルーチンを掘り下げました。私が理解している限り、適切な box2d 座標は描画ルーチンによって認識されています。しかし、ボックスは Retina ディスプレイの 2 倍の座標で表示されるだけです。
createGround の問題と createBoxAtLocation の問題は同じだと思います。これには簡単な解決策があると確信していますが、それを理解することはできません。助言がありますか?