Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在xcode中处理不同的屏幕大小_Ios_Objective C_Iphone_Sprite Kit - Fatal编程技术网

Ios 在xcode中处理不同的屏幕大小

Ios 在xcode中处理不同的屏幕大小,ios,objective-c,iphone,sprite-kit,Ios,Objective C,Iphone,Sprite Kit,我有一款iPhone游戏,最早是为iPhone 6开发的,在iPhone 5 sim卡上玩时效果很好,但在iPhone 4 sim卡上玩时,两边都伸展了?!?我从左侧和右侧生成的节点在屏幕上生成,而不是像iPhone 6和5那样在屏幕外生成。 (请不要说这是重复的,因为我数周来一直在寻找如何处理不同的iPhone) 我有从左到右的箭头,它们在y轴上随机产生。它们在屏幕外生成,然后在屏幕上缓慢移动,而不是在屏幕上快速移动,但在iPhone4上,箭头在屏幕上生成。这是其中一个箭头的代码 -(void

我有一款iPhone游戏,最早是为iPhone 6开发的,在iPhone 5 sim卡上玩时效果很好,但在iPhone 4 sim卡上玩时,两边都伸展了?!?我从左侧和右侧生成的节点在屏幕上生成,而不是像iPhone 6和5那样在屏幕外生成。 (请不要说这是重复的,因为我数周来一直在寻找如何处理不同的iPhone)

我有从左到右的箭头,它们在y轴上随机产生。它们在屏幕外生成,然后在屏幕上缓慢移动,而不是在屏幕上快速移动,但在iPhone4上,箭头在屏幕上生成。这是其中一个箭头的代码

-(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;

尝试使用比例而不是实际尺寸。所有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;
此外,我建议您更改以下内容:

更改那些“30”和“470”


主要问题是如何处理与图像资源和屏幕对象坐标相关的各种屏幕大小

我的解决方案是编写代码,就像编写iphone6plus一样。将所有图像设置为3x大小,并将屏幕布局坐标设置为iPhone 6屏幕大小

只需一点代码,我就可以为iPhone6Plus、6、5和4种屏幕尺寸获得统一的布局。我已经包括了每一个屏幕截图。字符图像为300x300。2个按钮图像为100x100

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];
}
iPhone4

iphone5

iphone6

iphone6plus

请注意,即使是文本标签也是如何正确地缩小的,不仅仅是字体大小,还包括位置

您还可以使用上述逻辑根据屏幕大小生成节点

作为参考,我确实在GameViewController中使用了标准代码,因为我发现使用更简单的版本更容易。这是我用来展示我的SKView的代码:

- (void)viewDidLoad {
    [super viewDidLoad];

    SKView * skView = (SKView *)self.view;
    SKScene *scene = [GameScene sceneWithSize:skView.bounds.size];
    scene.scaleMode = SKSceneScaleModeAspectFill;
    [skView presentScene:scene];
}

从iPhone5或6移动到4时,屏幕纵横比从16:9(5和6)更改为4:3(iPhone4)。在没有图像失真的情况下,您可以选择使用SKSceneScaleModeAspectFill(您现在使用的)或SKSceneScaleModeAspectFit。来自苹果文档:

SKSceneScaleModeAspectFill“…这保证了视图的整个区域被填充,但可能会导致场景的部分被裁剪。”

SKSceneScaleModeAspectFit“……这保证了整个场景可见,但可能需要在视图中显示字母框。”


我遇到了一个类似的问题,并为4:3设备(iPhone 4/iPad)重新创建了单独的图像,因为上面两个选项都没有满足我的需要。

你能提供iPhone 4和iPhone 5的屏幕截图吗?所以,我可以看到是什么导致了拉伸。你有没有使用自动布局来管理不同的屏幕尺寸?我会,但我的声誉太低了。我可以看到使用比例会如何工作,但它仍然会产生远离屏幕的方式,当我将/2更改为/3.8时,它适用于iPhone4,但对于iPhone6,它会产生离屏幕更远的效果。我应该使用一个特定的定位点还是?试试这个:leftArrow.position=CGPointMake(-self.frame.size.wight/2-leftArrow.frame.size.width/2,yPoint);或者类似的东西:leftArrow.position=CGPointMake(-self.frame.size.wight/2-self.frame.size.width/10,yPoint);这些都不管用。我想这是因为场景比我们现在看到的要大得多,把一些东西放在0,0把它放在屏幕的另一边,而不是放在下角。这是可行的,但该死的,现在我必须重新排列和缩放我所有的节点,哈哈,还有其他事情。这对宽度有效,但当我开始时,但当我在iPhone4上运行应用程序时,它会切断顶部和底部???并且它也真的放大了是否可以缩小场景???@siqhakz-我的道歉。我刚刚意识到我没有为我的答案添加相关代码。请用代码查看编辑后的答案。
- (void)viewDidLoad {
    [super viewDidLoad];

    SKView * skView = (SKView *)self.view;
    SKScene *scene = [GameScene sceneWithSize:skView.bounds.size];
    scene.scaleMode = SKSceneScaleModeAspectFill;
    [skView presentScene:scene];
}