在xcode中处理不同的屏幕尺寸
我有一款最初为iPhone 6开发的iPhone游戏,当它在iPhone 5上运行时效果很好,但是在iPhone 4上玩游戏时,双方都被拉长了。 而且我从左边和右边产生的节点在屏幕上产生,而不是像在iPhone 6和5上那样在屏幕上产生。(请不要说这是重复的,因为我一直在寻找几周处理不同的iPhone)
我有箭头从y轴上随机产生的左侧和右侧进入。 他们离开屏幕,然后在屏幕上缓慢移动,而不是在屏幕上快速移动,但在iPhone 4上,屏幕上产生箭头。 这是其中一个箭头的代码
-(void) leftArrow { int randomY = arc4random() % (675 - 175); int yPoint = randomY + 175; leftArrow = [SKSpriteNode spriteNodeWithImageNamed:@"arrow"]; leftArrow.size = CGSizeMake(leftArrow.size.width/1.2, self.frame.size.height/22); leftArrow.position = CGPointMake(CGRectGetMidX(self.frame) - 230, yPoint); leftArrow.zPosition = 50; leftArrow.alpha = 1; SKAction* action1 = [SKAction moveToX:leftArrow.position.x + 30 duration:0.5]; SKAction* wait = [SKAction waitForDuration:0.75]; SKAction* action2 = [SKAction moveToX:leftArrow.position.x + 470 duration:1.5]; SKAction* sequence = [SKAction sequence:@[action1,wait,action2,destroy]]; [self addChild:leftArrow]; if (deadDown == 1 || deadUp == 1 || didIntersect == true) { [leftArrow runAction:destroy]; } else { [leftArrow runAction:sequence completion:^{ if (ii != 1) { if (didIntersect != true) { score++; if (score == 100) { backgroundScore.fontSize = 300; backgroundScore.position = CGPointMake(backgroundScore.position.x, backgroundScore.position.y + 30); } strFromInt = [NSString stringWithFormat:@"%d",score]; backgroundScore.text = strFromInt; } } }]; } }
我也用我的didmovetoview函数
self.scaleMode = SKSceneScaleModeAspectFill;
主要问题是处理与您的图像资产和屏幕对象坐标有关的各种屏幕尺寸。
我的解决scheme是编写你的代码,就好像你正在编写iPhone 6 plus。 使您的所有图像@ 3x大小和您的屏幕布局坐标为iPhone 6屏幕大小。
只需要一些代码,我就可以得到iPhone 6 plus,6,5和4屏幕尺寸的统一布局。 我已经包括每个人的屏幕截图。 字符图像是300×300。 2个button图像是100×100。
static const float kIphone6PlusScaleFactorX = 1.0; static const float kIphone6PlusScaleFactorY = 1.0; static const float kIphone6ScaleFactorX = 0.9; static const float kIphone6ScaleFactorY = 0.9; static const float kIphone5ScaleFactorX = 0.772; static const float kIphone5ScaleFactorY = 0.772; static const float kIphone4ScaleFactorX = 0.772; static const float kIphone4ScaleFactorY = 0.652; #import "GameScene.h" @implementation GameScene { float scaleFactorX; float scaleFactorY; SKSpriteNode *node0; SKSpriteNode *node1; SKSpriteNode *node2; SKLabelNode *label0; } -(void)didMoveToView:(SKView *)view { self.backgroundColor = [SKColor blackColor]; if(view.frame.size.height == 736) { NSLog(@"iPhone 6 plus"); scaleFactorX = kIphone6PlusScaleFactorX; scaleFactorY = kIphone6PlusScaleFactorY; } if(view.frame.size.height == 667) { NSLog(@"iPhone 6"); scaleFactorX = kIphone6ScaleFactorX; scaleFactorY = kIphone6ScaleFactorY; } if(view.frame.size.height == 568) { NSLog(@"iPhone 5"); scaleFactorX = kIphone5ScaleFactorX; scaleFactorY = kIphone5ScaleFactorY; } if(view.frame.size.height == 480) { NSLog(@"iPhone 4"); scaleFactorX = kIphone4ScaleFactorX; scaleFactorY = kIphone4ScaleFactorY; } node0 = [SKSpriteNode spriteNodeWithImageNamed:@"Pic"]; node0.position = CGPointMake(self.size.width/2, self.size.height/2); [node0 setScale:scaleFactorX]; [self addChild:node0]; node1 = [SKSpriteNode spriteNodeWithImageNamed:@"button0"]; node1.position = CGPointMake(100*scaleFactorX, 100*scaleFactorY); [node1 setScale:scaleFactorX]; [self addChild:node1]; node2 = [SKSpriteNode spriteNodeWithImageNamed:@"button1"]; node2.position = CGPointMake(314*scaleFactorX, 100*scaleFactorY); [node2 setScale:scaleFactorX]; [self addChild:node2]; label0 = [SKLabelNode labelNodeWithFontNamed:@"HelveticaNeue-Bold"]; label0.text = @"Big Game Menu"; label0.fontSize = 48*scaleFactorX; label0.fontColor = [SKColor whiteColor]; label0.horizontalAlignmentMode = SKLabelHorizontalAlignmentModeCenter; label0.verticalAlignmentMode = SKLabelVerticalAlignmentModeCenter; label0.position = CGPointMake(207*scaleFactorX,690*scaleFactorY); [self addChild:label0]; }
iPhone 4
iphone 5
iPhone 6
iPhone 6 Plus
请注意,即使文本标签正确缩小,不仅字体大小,而且位置。
您可以使用上面的逻辑来产生与屏幕尺寸相关的节点。
为了供您参考,我在我的GameViewController中使用了标准代码,因为我发现使用更简单的版本更容易。 这是我用来展示我的SKView的代码:
- (void)viewDidLoad { [super viewDidLoad]; SKView * skView = (SKView *)self.view; SKScene *scene = [GameScene sceneWithSize:skView.bounds.size]; scene.scaleMode = SKSceneScaleModeAspectFill; [skView presentScene:scene]; }
从iPhone 5或6移动到4时,屏幕纵横比从16:9(5和6)变为4:3(iPhone 4)。 您的选项,没有图像失真,要么使用SKSceneScaleModeAspectFill(你是)或SKSceneScaleModeAspectFit。 从Apple文档:
SKSceneScaleModeAspectFill“….这保证视图的整个区域被填满,但是可能导致场景的一部分被裁剪。
SKSceneScaleModeAspectFit“…..这确保整个场景可见,但可能需要在视图中使用字母框。
我碰到类似的问题,并为4:3设备(iPhone 4 / iPad)重新创build单独的图像,因为上述两个选项都不能给我想要的东西。
尝试使用比例而不是实际大小。 所有iOS设备都有不同的宽度和高度。
改变这一点
leftArrow.position = CGPointMake(CGRectGetMidX(self.frame) - 230, yPoint);
像这样的东西
leftArrow.position = CGPointMake(CGRectGetMidX(self.frame) - self.frame.size.width / 2, yPoint);
我只能猜测它应该做什么,但尝试改变这一点
int randomY = arc4random() % (675 - 175); int yPoint = randomY + 175;
对此:
int randomY = arc4random() % (self.frame.size.height - self.frame.size.height / 4); int yPoint = randomY + self.frame.size.height / 4;
另外我会build议你改变这些:
改变那些“30”和“470”
SKAction* action1 = [SKAction moveToX:leftArrow.position.x + 30 duration:0.5]; SKAction* action2 = [SKAction moveToX:leftArrow.position.x + 470 duration:1.5];