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