0

私はiPhone用のcocos2dアプリを開発しています。私はiPhone5だけでテストしてきましたが、すべてが見栄えがしますが、3.5インチシミュレーターiPhoneでテストすると、一部のボタンが表示されなくなり、一部のラベルが間違って配置されます。

なぜこれが起こるのだろうか?すべてがcocos2dグリッドを介して配置され、それがピクセルに変換されると思っていたので、画面サイズに関係なく、レイアウトは同じに見えるはずです。

メニュー項目の位置を設定すると、(0,0)が画面中央に配置されることが原因の可能性もあると思います。なぜなのかわかりません。

何が起こっているのかについて何かアドバイスはありますか?

左側にiPhone5、左側にシミュレーター(3.5インチ)。

ここに画像の説明を入力してください

この画面のコードは次のとおりです。

    CCSprite *title = [CCSprite spriteWithSpriteFrameName:@"highscoresTitle.png"];
    [self addChild:title];
    title.position = ccp([CCDirector sharedDirector].winSize.width/2, [CCDirector sharedDirector].winSize.height-title.contentSize.height-15);
    background.position = ccp([CCDirector sharedDirector].winSize.width/2, [CCDirector sharedDirector].winSize.height/2);
    play = [CCMenuItemSprite itemWithNormalSprite:[CCSprite spriteWithSpriteFrameName:@"playNew.png"] selectedSprite:[CCSprite spriteWithSpriteFrameName:@"playNew.png"] target:self selector:@selector(playScene:)];
    play.position = ccp(0, -200);

    CCLabelTTF *backLabel = [CCLabelTTF labelWithString:@"BACK" fontName:@"RBNo2-Light-Alternative" fontSize:25];
    CCMenuItemLabel *goBack = [CCMenuItemLabel itemWithLabel:backLabel target:self selector:@selector(back:)];
    goBack.position = ccp(0, -260);

    CCMenuItemSprite *gameicon = [CCMenuItemSprite itemWithNormalSprite:[CCSprite spriteWithSpriteFrameName:@"gameCenter.png"] selectedSprite:[CCSprite spriteWithSpriteFrameName:@"gameCenter.png"] target:self selector:@selector(gameIcon:)];
    gameicon.position = ccp(0, -150);

    CCMenu *menu = [CCMenu menuWithItems:play,goBack, gameicon, nil];
    [self addChild:menu z:0]; 

    for(int i = 0; i<5 && i<length; i++){

        NSString *temp = [NSString stringWithFormat:@"%d: %d", i+1,[[highscores objectAtIndex:i]intValue]];
        CCLabelTTF *label = [CCLabelTTF labelWithString:temp fontName:@"RBNo2-Light-Alternative" fontSize:20];
        label.position = ccp([CCDirector sharedDirector].winSize.width/2, 350-i*30);
        label.visible = YES;
        [self addChild:label z:100 tag:1];

    }

    NSString *temp = [NSString stringWithFormat:@"Last Score: %d", newHighscore];
    CCLabelTTF *label = [CCLabelTTF labelWithString:temp fontName:@"RBNo2-Light-Alternative" fontSize:20];
    label.position = ccp([CCDirector sharedDirector].winSize.width/2, 415);
    label.visible = YES;
    [self addChild:label z:100 tag:1];

スライダーを使った別の例を次に示します:(iPhone5左) ここに画像の説明を入力してください

そして、これがスライダーのコードです:

    sliderCtl = [[UISlider alloc]initWithFrame:CGRectMake(100, 460, 200, 0)];
    //[sliderCtl.layer setAffineTransform:CGAffineTransformMakeRotation(3.141/2)];
    [sliderCtl addTarget:self action:@selector(sliderAction:) forControlEvents:UIControlEventValueChanged];

    sliderCtl.backgroundColor = [UIColor clearColor];
    sliderCtl.value = 1.0;

    [[[[CCDirector sharedDirector] openGLView] window] addSubview:sliderCtl];

    sliderEff = [[UISlider alloc]initWithFrame:CGRectMake(100, 402, 200, 0)];

    [sliderEff addTarget:self action:@selector(effectsSlider:) forControlEvents:UIControlEventValueChanged];

    sliderEff.backgroundColor = [UIColor clearColor];
    sliderEff.value = 1.0;

    [[[[CCDirector sharedDirector] openGLView] window] addSubview:sliderEff];

どうもありがとう。

4

2 に答える 2

2

ほとんどの場合、この答えはあなたを失望させるでしょう。iPhone 5の長辺には、以前のすべてのモデルとは異なるピクセル数があります。シーンにオブジェクトを配置するために使用する座標系はポイントです。Retinaディスプレイを搭載したデバイスでは、1ポイントは2ピクセルに相当します。

winSizeによって提供されるものを利用しますCCDirector。これは確かに、相対位置を計算するのに役立ちます。たとえば、コードの一部の場所で見られるように、水平方向に沿って中央に配置する場合などですlabelanchorPoint、、winSizeおよび関連するプロパティの助けを借りて、あなただけがオブジェクトの配置に責任を負います。

具体例goBack-260ポイントの相対位置に配置します。menuデフォルトでは、画面の中央に配置されていることに注意してください。iPhone 4Sおよび以前のすべてのモデルでは、これは480 pt / 2-260 pt =-20ptの絶対位置を意味します。ボタンが画面外にあるのも当然です。テストしwinSize.height、それに応じて調整する必要があります。

于 2013-01-27T02:57:53.033 に答える
0

同じ問題が発生し、次のリンクにあるGitHubのUIDeviceExtensionライブラリを使用してデバイスを識別しています。画面サイズだけでなく、特定されたデバイスから他のアイテムを使用しない限り、これは少しやり過ぎですが、デバイスタイプによって常により多くのニーズに遭遇する傾向があるため、使用できる可能性があると考えました。

https://github.com/erica/uidevice-extension

于 2013-01-30T10:44:43.577 に答える