2015-08-27 67 views
1

我遇到了一些问题,试图使我的SpriteKit游戏在所有设备上兼容。我了解Image.xcassets的工作原理,以及如何在放置节点时引用电话框。缩放特定设备

例如,我的游戏在6,6+和iPad上看起来不错。不幸的是,它已经成为早期iPhone手机的主要屏幕。一个简单的办法,这将仅仅是引用该屏幕的顶部像这样:

node.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMaxY(self.frame) - 5) 

这适用于所有的手机,但不是ipad公司

但是如果我引用的顶部这样的设备,那么在iPad上,上层节点距离屏幕太远,使得英雄无法与它们交互。

我的代码是为节点的定位书面只是通过使用其他节点的基础上的顶部的电流方式:

node.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMinY(self.frame) + node2.size.height + node3.size.height) 

这适用于6个,6 +和ipad公司

我怎样才能让所有设备兼容?我知道我可以调整“2x”图像,以适应5和5秒,但是这会让游戏机制失效6(因为6和5系列由于某种原因共享“2倍”)。

有没有一种方法可以专门测试在某个设备上使用,然后在这种情况下运行某些代码?有没有解决方案?谢谢。

回答

3

,这是更容易使用斯威夫特三元运营商运营商:

此检查高度比iPhone 6+这将意味着它的iPad的更大的尺寸,然后相应地设置自定义大小的图像,你可以甚至用卢卡斯的宏,他上面贴:

asdf!.qrImageView.image = UIScreen.mainScreen().bounds.height > 736 ? UIImage(named: "check") : UIImage(named: "bubbles") 

继承人的全部代码,现在试试这个,很明显的图像改变您的需要,呼叫上面使用的是很定制UIView子类,这下调用不是,其使用UIImageView:

override func viewDidLoad() { 

    super.viewDidLoad() 

    var floatiesW = 200 as CGFloat 
    var floatiesH = 200 as CGFloat 

    var asdf = UIImageView() 
    asdf.backgroundColor = UIColor.redColor() 
    asdf.frame = CGRectMake((self.view.bounds.width/2.0) - (floatiesW/2.0), (self.view.bounds.height/2.0) - (floatiesH/2.0), floatiesW, floatiesH) 
    asdf.image = self.view.bounds.height > 736 ? UIImage(named: "check") : UIImage(named: "bubbles") 
    self.view.addSubview(asdf) 
} 

这:

UIScreen.mainScreen().bounds.height > 736 ? UIImage(named: "check") : UIImage(named: "bubbles") 
在大多数情况下

可以用这个调换:

self.view.bounds.height > 736 ? UIImage(named: "check") : UIImage(named: "bubbles") 

但要小心,你可能应该使用UIScreen.main ..一个

+0

这看起来很有效,我试图用几种方法实现它。如果我没有弄错,三元运算符的功能与条件类似。如果是这样,为什么我不断要求申报声明?我对这种方法的确切语法实现略有困惑。谢谢,我对编程非常陌生。 @Larcerax – TerranceW

+0

不知道你可能做错了什么或对的,但下一个最好的选择是尝试这一点,一秒。 – Loxx

+0

重读我给你的答案,只是放下代码看它的工作 – Loxx

2

将此代码置于导入下方以检查用户正在运行的设备类型。

enum UIUserInterfaceIdiom1 : Int 
{ 
case Unspecified 
case Phone 
case Pad 
} 

struct ScreenSize1 
{ 
static let SCREEN_WIDTH = UIScreen.mainScreen().bounds.size.width 
static let SCREEN_HEIGHT = UIScreen.mainScreen().bounds.size.height 
static let SCREEN_MAX_LENGTH = max(ScreenSize.SCREEN_WIDTH,  ScreenSize.SCREEN_HEIGHT) 
static let SCREEN_MIN_LENGTH = min(ScreenSize.SCREEN_WIDTH, ScreenSize.SCREEN_HEIGHT) 
} 

struct DeviceType1 
{ 
static let IS_IPHONE_4_OR_LESS = UIDevice.currentDevice().userInterfaceIdiom == .Phone && ScreenSize.SCREEN_MAX_LENGTH < 568.0 
static let IS_IPHONE_5 = UIDevice.currentDevice().userInterfaceIdiom == .Phone && ScreenSize.SCREEN_MAX_LENGTH == 568.0 
static let IS_IPHONE_6 = UIDevice.currentDevice().userInterfaceIdiom == .Phone && ScreenSize.SCREEN_MAX_LENGTH == 667.0 
static let IS_IPHONE_6P = UIDevice.currentDevice().userInterfaceIdiom == .Phone && ScreenSize.SCREEN_MAX_LENGTH == 736.0 
} 

然后在viewDidLoad为了看到正在使用哪些设备,然后每一个下运行所必需的代码做一个简单的if statement

if UIDevice.currentDevice().userInterfaceIdiom == .Phone && ScreenSize.SCREEN_MAX_LENGTH < 568.0 { 
     println("Iphone 4s") 
     // put code here 
    } 

然后为每个设备执行此操作。这显然有点乏味,但它应该做到这一点。 也在上面我没有列出iPad规格,但您可以通过计算出它们的屏幕高度来轻松提供这些规格。希望这可以帮助!

+0

这是大。不过,我在“ScreenSize”上得到了未解析的标识符。我是否需要导入某种其他核心库?我是否需要为结构声明一些东西? (感谢我很新)@LucasAzzopardi – TerranceW

+0

在上面的代码中,我把它作为ScreenSize1 ..改变它,它应该工作。或者简单地将ScreenSize1更改为ScreenSize –