我一直在为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];
非常感谢。
答案 0 :(得分:2)
最有可能的是,这个答案会令你失望。 iPhone 5沿其长边有许多像素,与以前的所有型号都不同。用于在场景中放置对象的坐标系是点,其中1 pt等于具有Retina显示的设备上的2 px。
您确实使用winSize
提供给您的CCDirector
。这确实可以帮助您计算相对位置,例如,为了在我的代码的某些位置看到它的水平方向居中,例如为label
。在anchorPoint
,winSize
和相关属性的帮助下,您自己负责定位对象。
具体示例:您将goBack
置于-260 pt的相对位置。请注意,默认情况下,您的menu
会在屏幕中居中。在iPhone 4S和之前的每个型号上,这意味着绝对位置为480 pt / 2 - 260 pt = -20 pt。毫无疑问,按钮在屏幕外。您必须测试winSize.height
并进行相应调整。
答案 1 :(得分:0)
我遇到了同样的问题,现在正在使用GitHub的UIDevice扩展库,在以下链接中识别设备。这有点矫枉过正,除非您使用已识别设备中的其他项目,除了屏幕尺寸,但认为您可以使用它,因为我倾向于总是遇到设备类型的更多需求。