0

だから私は私の小さなプロジェクトの完成にかなり近づいており、私のアプリが iPhone 3 および 4 と互換性があることを確認しようとしています...しかし、これは本当に私を困惑させています. しばらく前に hm50 によって投稿されたオープン ソースの CCPickerview コードを使用しています (http://www.cocos2d-iphone.org/forum/topic/10160)。iPhone 4 ではうまく機能しますが、iPhone 3 シミュレーターではまったく機能しません。問題は実装のどこかにあると思います。画像に -hd タグを誤って残すと、何が起こっているのかがわかります。非網膜モードでは、画像がきれいに半分にカットされているように見えますが、その理由を特定できるほど専門家であるとは言えません。

-(void)makePages {
    CCSprite *overlay = [CCSprite spriteWithFile:@"overlay-hd.png"];
    CGSize s = CGSizeMake(overlay.contentSize.width, overlay.contentSize.height);
    self.contentSize = s;

    CCLayerColor *backLayer = [CCLayerColor layerWithColor:(ccColor4B){248,250,251,255} width:self.contentSize.width height:self.contentSize.height];
    backLayer.position = ccp(-self.contentSize.width/2, -self.contentSize.height/2);
    [self addChild:backLayer];

    self.baseLayer = [CCLayerColor layerWithColor:(ccColor4B){150,150,150,0} width:s.width height:imgSize.height * numPages];

    for (int i=0; i < [arrayPages count]; i++) {
        CCNode* n = [arrayPages objectAtIndex:i];
        n.position = ccp(s.width/2, s.height/2 + i * (imgSize.height + padding)); 
        [baseLayer addChild:n];
    }

    baseLayer.position = ccp(-s.width/2, -s.height/2 - s.height * currentPage);
    [self addChild:baseLayer];

    overlay.position = ccp(0, 0);
    //overlay.opacity = 0;
    [self addChild:overlay];

    rect = CGRectMake(self.position.x - s.width/2, self.position.y - s.height/2, s.width, s.height);

    [self moveToPagePosition];
}

- (void) visit 
{
    if (!self.visible)
        return;

    glPushMatrix();

    glEnable(GL_SCISSOR_TEST);

    CGSize size = [[CCDirector sharedDirector] winSize];
    CGRect scissorRect = rect;

    ccDeviceOrientation orientation = [[CCDirector sharedDirector] deviceOrientation];
    switch (orientation) 
    {
        case kCCDeviceOrientationPortrait:
            break;
        case kCCDeviceOrientationPortraitUpsideDown:
            scissorRect.origin.x = size.width-scissorRect.size.width-scissorRect.origin.x;
            scissorRect.origin.y = size.height-scissorRect.size.height-scissorRect.origin.y;
            break;
        case kCCDeviceOrientationLandscapeLeft:
        {
            float tmp = scissorRect.origin.x;
            scissorRect.origin.x = scissorRect.origin.y;
            scissorRect.origin.y = size.width-scissorRect.size.width-tmp;
            tmp = scissorRect.size.width;
            scissorRect.size.width = scissorRect.size.height;
            scissorRect.size.height = tmp;
        }
            break;
        case kCCDeviceOrientationLandscapeRight:
        {
            float tmp = scissorRect.origin.y;
            scissorRect.origin.y = scissorRect.origin.x;
            scissorRect.origin.x = size.height-scissorRect.size.height-tmp;
            tmp = scissorRect.size.width;
            scissorRect.size.width = scissorRect.size.height;
            scissorRect.size.height = tmp;
        }
            break;
    }

    glScissor(scissorRect.origin.x*2, scissorRect.origin.y*2,
              scissorRect.size.width*2, scissorRect.size.height*2);

    [super visit];

    glDisable(GL_SCISSOR_TEST);
    glPopMatrix();
}

スクリーンショット

スクロールを右に移動すると、より多くのものが表示されますが、実際にはそこに表示したくありません。優秀な Objective-C の達人で、これを手伝ってくれる人はいますか?

編集:

さらに調査した結果、問題は間違いなく次のとおりです。

rect = CGRectMake(self.position.x - s.width/2, self.position.y - s.height/2, s.width, s.height);

私がそれを作るなら

rect = CGRectMake(self.position.x - s.width*2.05, self.position.y - s.height/1.48, self.contentSize.width*1.3, self.contentSize.height*.48);

それはうまく機能します...しかし、このソリューションは非常にエレガントではないと思います。オーバーレイ画像のサイズに基づいている必要があります。ここで何が間違っているのかわかりません。

4

2 に答える 2

1

私もCCPickerViewを作成しました。これは、githubで見つけることができます。https://github.com/fidgetware/CCPickerView。低解像度と高解像度の両方の画像で機能します。

于 2012-06-12T21:56:26.950 に答える
1

古いデバイスでは倍解像度の画像が使用されていると思いますが、これは本来のサイズの 2 倍になります。

-scaleウィンドウの画面のプロパティを確認する(または を使用する[UIScreen mainScreen]) 必要があり、それに基づいて正しい (Retina かどうか) 画像を選択する必要があります。

于 2012-06-08T13:12:17.060 に答える