歪招!SpriteKit中的裝置尺寸處理

曹化宇發表於2015-09-09

寫在iPhone6S釋出之際!(等著沒事幹!^^)

曾幾何時,Android裝置由於型別繁多,螢幕尺寸不統一成為被批評的原因之一,而iOS裝置,包括iPhone、iPad、iPod Touch,越來越多的裝置型別也出現了不同的螢幕解析度,為開發者帶來了新的挑戰。

當然,現在我們可以使用自動佈局來處理普通的iOS應用,但SpriteKit可能有些不同;近日研究SpriteKit的開發問題,搞出一些歪招,正所謂:不走尋常路也!^^

實際上,在使用SpriteKit開發iOS遊戲時,我們可以只處理三種解析度:

  • iPhone4S及更早的iPhone裝置。
  • iPhone5及更新的iPhone裝置及相應的iPod Touch。
  • iPad裝置。

我們知道, iOS裝置雖然標識的解析度越來越高,但實際上,畫素並沒有變化,而是每個畫素的“點”數在提高;這樣一來,在SpriteKit開發過程中,我們可以只處理畫素,問題就簡單多了。

首先,我們需要幾個變數儲存相關的資料,如下面的程式碼:

#define IPHONE4 1
#define IPHONE5 2
#define IPAD 3

int deviceType;
int screenWidth;
int screenHeight;

然後,我們通過如下面程式碼獲取裝置的尺寸和型別:

CGSize size = [[UIScreen mainScreen] bounds].size;
screenWidth = size.width;
screenHeight = size.height;
if (screenWidth == 480 || screenHeight == 480) {
        deviceType = IPHONE4;
}else if (screenWidth == 1024 || screenHeight == 1024){
        deviceType = IPAD;
}else{
        deviceType = IPHONE5;
}

對於程式碼中的魔數(如480和1024)請不要提意見,這只是針對特殊裝置解析度所做的假設,如,480只存在於iPhone4S及更早的iPhone裝置中(3:2的螢幕,480*320畫素),而1024則是iPad的尺寸(4:3的螢幕,1024*768畫素,不知道iPad Pro會不會保持這個傳統?),其它的尺寸,只當作是16:9(568*320畫素)的螢幕了。

上面的程式碼,可以幫助我們在SpriteKit中有效的處理已存在的iOS裝置型別和解析度問題,而且,只需要處理三種情況。

當然,在初始化場景時,需要做出相應的尺寸設定,如下面的程式碼:

SKView * skView = (SKView *)self.view;
PlayScene *scene = [[PlayScene alloc]initWithSize:CGSizeMake(screenWidth, screenHeight)];
scene.scaleMode = SKSceneScaleModeAspectFill;
[skView presentScene:scene];

閒著沒事寫著玩,歡迎高手來踩!^^

PS. 如果你喜歡俄羅斯方塊遊戲,可以玩玩Element Blocks Free或Element Blocks,多提寶貴意見!^^

相關文章