iOS開發- 遊戲螢幕適配(SpriteKit),iosspritekit

來源:互聯網
上載者:User

iOS開發- 遊戲螢幕適配(SpriteKit),iosspritekit

我們開發一個App的時候, 通常希望它在 iPhone, iPad, Mac上同時能運行, 尤其是遊戲。

這樣就需要我們考慮不同裝置不同的解析度,處理起來比較麻煩。

比如說,按照官方的做法,我們需要提供諸如 xx.png, xx@2x.png, xx@3x.png, xx~iPad.png, and xx~iPad@2x.png 這樣不同的圖片,

 另外還有在程式中寫大量 if (...){...} else if {...}這樣的代碼來區分不同的裝置, 想想就覺得煩。

尤其是像我這樣的個體開發人員... 弄那麼多套圖片. 簡直要命。

所以我的做法是, 固定一個大小, 來相容不同的裝置。


這裡, 我把我需要的圖片, 都按照螢幕大小為 2048 * 1536 來繪製。 也就是說, 我們的背景圖的大小是 2048 * 1536, 其他圖片也是依照這個比例來繪製。

然後,載入每個情境的時候, 都設定情境大小為 2048 * 1536,並且顯示方式為 AspectFill。

如下, 預設的SpriteKit項目, 做簡單的修改: (GameViewController.swift)

////  GameViewController.swift//  ZombieConga////  Created by Colin on 14/12/21.//  Copyright (c) 2014年 icephone. All rights reserved.//import UIKitimport SpriteKitclass GameViewController: UIViewController {    override func viewDidLoad() {        super.viewDidLoad()                let myScene = GameScene(size:CGSize(width: 2048, height: 1536))        myScene.scaleMode = .AspectFill        let myView = self.view as SKView        myView.showsFPS = true        myView.showsNodeCount = true        myView.ignoresSiblingOrder = true        myView.presentScene(myScene)    }        override func prefersStatusBarHidden() -> Bool {        return true    }}


為什麼這樣做呢?

我們知道.   2048 * 1536 是iPad Retina 的解析度。也是我們需要適配的裝置裡面解析度最高的。 所以我選擇了這個大小。讓它來相容解析度低的裝置。(不會導致圖片失真, 當然,造成不必要的開銷是在所難免的,但是相對為每個裝置準備一套圖片還是更加優秀的)

也就是說, 2048 * 1536 在iPad Retina上是完美顯示的。 那在其他裝置上呢? 這裡就要依靠 AspectFill了。

簡單看一下下面這張圖:


橙色整體地區表示我們情境的真實大小。  黑色線框內的地區表示情境展示在裝置上的真實大小。

看下iPad Retina。 他的橙色地區和 黑色線框內的地區是完美吻合的,也就是說在裝置上能完整顯示。

再看下iPhone4S。  它的真實解析度應該是 960 * 640 (這裡是橫屏顯示), 但是黑色線框內的地區確實2048 * 1136,是原來的2.1倍。

這要歸功於 AspectFill了。 接觸過iOS開發的應該都知道, AspectFill是圖片顯示的一種模式。它保持縱橫比縮放圖片,映像可能不完全顯示。(可以理解成兩個方向一起放縮,當兩個方向都達到螢幕大小時候,才停止放縮。這時候先達到螢幕大小的那個因為之後的繼續放縮,會導致那個方向上的映像被截去。故顯示不完全)


同理,iPhone6 的顯示效果。


• iPad Retina [4:3 or 1.33]: Displayed as-is to fit the 2048x1536 screen size.
• iPad Non-Retina [4:3 or 1.33]: Aspect fill will scale a 2048x1536 playable area by 0.5 to fit the 1024x768 screen size.
• iPhone 4S [3:2 or 1.5]: Aspect fill will scale a 2048x1366 playable area by 0.47 to fit the 960x640 screen size.
• iPhone 5 [16:9 or 1.77]: Aspect fill will scale a 2048x1152 playable area by 0.56 to fit the 1136x640 screen size.
• iPhone 6 [16:9 or 1.77]: Aspect fill will scale a 2048x1152 playable area by 0.64 to fit the 1334x750 screen size.
• iPhone 6 Plus [16:9 or 1.77]: Aspect fill will scale a 2048x1152 playable area by 0.93 to fit the 1920x1080 screen size.


總的來說, 使用這樣的方法,相對來說讓不同裝置間的操作統一了(我們的操作都以情境大小 2048*1536為準)。

但是從圖片上也能很直觀的看出,情境中有些地區是顯示不完整的。 比如看iPhone6,如果把一個精靈放在 (0, 0)點, 那麼就有可能看不到了,如果那個精靈不夠大的話,因為(0,0)點不再裝置螢幕顯示地區內。


但是,相對與一般的逐個適配,我還是比較推崇上述做法。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.