1

iPad、iPhone、iPhone Retina で cocos2d/box2d ゲームを動作させようとしています。私の問題は、フィクスチャとボディが Retina シミュレーターで一致しないことです。下のスクリーンショットをクリックして説明してください (新しいスタックオーバーフロー メンバーとして、ここにスクリーンショットを投稿することはできません)。

スクリーンショット

(形状の違いは無視してください。4 つの角を揃えたいと思います) ここ数日間、これについてかなりの調査を行ってきましたが、最も近いものは次のとおりです。

リンク

しかし、 PTM_RATIO と CC_CONTENT_SCALE_FACTOR() で提供されているソリューションは、私の場合はうまくいかないようです。ファイルからスプライトに画像をロードしないという事実に関係していると思います。この問題のほとんどの解決策は、Retina ディスプレイ用に -hd イメージ ファイルをロードすることに基づいていますが、ゲームでファイルを使用したくありません。私は基本的に実行時にポリゴンを自分で描画したいのですが、

私のコードは次のようになります。

-(CCSprite*)addSprite
{
    CGSize contextsize = CGSizeMake(200, 200); 
    UIGraphicsBeginImageContext(contextsize);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextFlush(context);
    CGContextSetAllowsAntialiasing(context, true);
    CGContextTranslateCTM(context, 0, contextsize.height);
    CGContextScaleCTM(context, 1.0, -1.0);
    CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
    CGFloat components[] = {0.0, 0.0, 1.0, 1.0};
    CGColorRef color = CGColorCreate(colorspace, components);
    CGContextSetStrokeColorWithColor(context, color);

    UIBezierPath* aPath;

    aPath = [UIBezierPath bezierPathWithArcCenter:CGPointMake(100, 100)
                                           radius:100
                                       startAngle:0 
                                         endAngle:1.57 
                                        clockwise:YES];
    [aPath addArcWithCenter:CGPointMake(100, 100) 
                     radius:50
                 startAngle:1.57
                   endAngle:0
                  clockwise:NO];

    [aPath stroke];

    CGContextStrokePath(context);
    CGColorSpaceRelease(colorspace);
    CGColorRelease(color);

    UIImage *graphImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    CCTexture2D *tex = [[[CCTexture2D alloc] initWithImage:graphImage] autorelease];
    CCSprite *sprite = [CCSprite spriteWithTexture:tex];
    return sprite;
}

-(void) addFixture:(CCSprite *)fixsprite
{
    b2Vec2 arcdots[] = {
        b2Vec2(50.0f / PTM_RATIO, 0.0f / PTM_RATIO),
        b2Vec2(100.0f / PTM_RATIO, 0.0f / PTM_RATIO),
        b2Vec2(0.0f / PTM_RATIO, 100.0f / PTM_RATIO),
        b2Vec2(0.0f / PTM_RATIO, 50.0f / PTM_RATIO)
};

    b2PolygonShape p_shape;
    b2FixtureDef fixtureDef;

    b2BodyDef bodyDef;
    bodyDef.type = b2_kinematicBody;

    bodyDef.position.Set(100/PTM_RATIO, 100/PTM_RATIO);
    bodyDef.userData = fixsprite;
    b2Body *body = world->CreateBody(&bodyDef);

    p_shape.Set(arcdots, 4);
    fixtureDef.shape = &p_shape;    
    fixtureDef.density = 1.0f;
    fixtureDef.friction = 0.3f;
    body->CreateFixture(&fixtureDef);
}   

そして、これらの関数をメイン ルーチンから次のように呼び出します。

CCSprite *sprite2 = [self addSprite];
sprite2.position = ccp(0, 0);
[self addChild:sprite2 z:0];        
[self addFixture:sprite2];

デリゲート ファイルで次の行をコメント解除します。

if( ! [director enableRetinaDisplay:YES] )
    CCLOG(@"Retina Display Not supported");

さらに情報が必要な場合はお知らせください。そして、優しくしてください、私はこれを学び始めたばかりです。御時間ありがとうございます。

4

1 に答える 1

0

特に明記しない限り、cocos2d (およびほとんどの UIKit) のすべての座標は、ピクセルではなくポイントで指定されます。Retina ディスプレイ デバイスでは、依然として 480x320 ポイント (960x640 ピクセル) のポイント解像度があります。

それから、実際のピクセルで計算する場合は、CC_CONTENT_SCALE_FACTOR で乗算または除算します。ポイント座標を扱う場合は、何もしません。独自のポリゴンをレンダリングしているので、実際のピクセル座標を使用するかどうかはわかっていると思います。OpenGL を直接使用する場合は、ピクセル座標を操作することになります。

コンテンツのレンダリングに cocos2d を使用しない場合、Retina ディスプレイ モードを有効にしても効果があるかどうかはわかりません。

最後に、よくある誤解は、Box2D ワールドがポイント座標を使用しており、ピクセルに変換する必要がある、またはその逆を行う必要があるというものです。どちらも当てはまりません。Box2D の世界は、特定の座標系をまったく意識していません。PTM_RATIO の使用は、Box2D 座標が Box2D エンジンの妥当な範囲内にあることを確認するためだけに行われます。これは、サイズ/直径が 1 メートルのオブジェクトで最適に機能し、ほとんどのオブジェクトは直径が 0.1 から 10 メートルの範囲である必要があるためです。

于 2012-07-10T13:27:07.657 に答える