2015-08-27 100 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 –