0

我一直在为 iPhone 开发 cocos2d 应用程序。我一直在我的 iPhone 5 上测试它。一切看起来都很棒,但是当我在 3.5 英寸模拟器 iPhone 上测试它时,一些按钮丢失了,一些标签放错了位置。

我想知道为什么会这样?我原以为一切都通过 cocos2d 网格定位,然后将其转换为像素,因此无论屏幕大小如何,布局看起来都应该相同。

我认为问题的部分原因可能是当我设置菜单项的位置时,(0,0) 将它放在屏幕的中心。我不知道这是为什么。

关于发生了什么的任何建议?

左边是 iPhone 5,左边是模拟器(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];

这是另一个带有滑块的示例:(iPhone 5 左) 在此处输入图像描述

这是滑块的代码:

    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 的长边上有许多像素,这与以前的所有型号都不同。用于在场景中放置对象的坐标系是点,其中 1 pt 在配备 Retina 显示器的设备上等于 2 px。

您确实使用了winSizeCCDirector. 这确实可以帮助您计算相对位置,例如,以便像我在代码的某些地方看到的那样沿水平居中,例如 for label. 在、 和相关属性的帮助下anchorPoint,您一个人负责定位您的对象。winSize

具体示例:您放置goBack在 -260 pt 的相对位置。请注意,menu默认情况下,您在屏幕上居中。在 iPhone 4S 和之前的所有型号中,这意味着绝对位置为 480 pt / 2 - 260 pt = -20 pt。毫不奇怪,按钮不在屏幕上。您将不得不进行winSize.height相应的测试和调整。

于 2013-01-27T02:57:53.033 回答
0

我遇到了同样的问题,现在我在以下链接中使用来自 GitHub 的 UIDevice Extension 库来识别设备。这有点矫枉过正,除非您使用已识别设备中的其他项目,而不仅仅是屏幕尺寸,但认为您可能能够使用它,因为我往往会遇到更多设备类型的需求。

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

于 2013-01-30T10:44:43.577 回答