下面簡單記錄一下在最近cocos2d-x項目在iOS平台真機測試和模擬器測試中遇到的一些要注意的地方(使用ipod):
1、圖片大小
遊戲中基本上都是會用到圖片,那麼在使用圖片的時候要特別注意圖片的size。
注意:一般來說,在設計圖片的時候,其大小要設計為我們所需要圖片大小的兩倍大小。(why,下面解釋)
例如說:
我們需要一張50*50大小的圖片,用於精靈顯示,也就說在螢幕中(無論是模擬器還是真機)顯示的大小都是50*50。那麼我們設計的圖片大小要多少呢?沒錯,就是100*100。那麼我們在模擬器中測試的時候,要注意將其scale設定為0.5,這樣在模擬器中就可以顯示我們所需要的正確的大小了;那到了真機測試的時候,就不用設定圖片的scale了,直接使用這100*100的圖片就可以正確顯示我們所需要的50*50大小的圖片了。
為什麼會這樣呢?
我們可以在debug訊息中,看到:
①如果是模擬器,cocos2d: surface size: 320x480
②如果是真機,cocos2d: surface size: 640x960
沒錯了,這就是因為螢幕解析度的問題導致了,這裡我用到的模擬器裝置是iPhone。
那麼如果你模擬器使用下面的Retina的話,螢幕解析度就是640*960了。
2、座標點位置
上面已經講到由於模擬器和真機不同的解析度導致圖片size的問題,其實還有一個問題也同樣要注意---座標點的位置大小。
因為我們一般都是基於320*480這樣大小的螢幕下進行程式設計,那麼相應的位置座標設定也是相當於320*480這樣大小來設計的。那麼由於實際真機的的螢幕是640*960的,那麼我們如果在320*480的模擬器下調試好了,直接將程式放到真機中的話,圖片等等的位置是錯亂的。為什麼呢?因為座標點的大小都縮小了一半。那麼解決的方法也是很簡單的,就是將所有的座標點的x軸和y軸座標資料乘以2,就可以了。
總結:上面所遇到的問題的根源就是我們使用的模擬器和真機之間的解析度不同,模擬器是320*480,而真機是640*960。由於個人習慣是在320*480的模擬器下進行程式設計,所有就需要對圖片大小,座標點大小進行一些額外的處理(其實也很簡單)。但是如果嫌麻煩的話,可以之間使用iPhone(Retina 3.5-inch)的模擬器,這樣的模擬器解析度就是和真機一樣的640*960。
總之,只要我們在圖片大小和座標點大小處理的時候,始終是基於真機的640*960進行處理,那麼將程式移植到真機的時候,就沒有什麼問題了。
下面對這部分內容進行一些補充:
其實關於關於cocos2d-x螢幕解析度的適配問題,網上已經有好多部落格進行了介紹,主要是針對android平台的多解析度螢幕,但是對於iOS平台還比較好螢幕解析度比較固定。
那麼針對多解析度螢幕的適配,其實在cocos2dx中有一個方法是用於解決這個問題的---setDesignResolutionSize。
這個方法在應用程式啟動的時候進行調用applicationDidFinishLaunching()。
/** * Set the design resolution size. * @param width Design resolution width. * @param height Design resolution height. * @param resolutionPolicy The resolution policy desired, you may choose: * [1] kResolutionExactFit Fill screen by stretch-to-fit: if the design resolution ratio of width to height is different from the screen resolution ratio, your game view will be stretched. * [2] kResolutionNoBorder Full screen without black border: if the design resolution ratio of width to height is different from the screen resolution ratio, two areas of your game view will be cut. * [3] kResolutionShowAll Full screen with black border: if the design resolution ratio of width to height is different from the screen resolution ratio, two black borders will be shown. */ virtual void setDesignResolutionSize(float width, float height, ResolutionPolicy resolutionPolicy);
其中的第三個參數可以為:
enum ResolutionPolicy{ // The entire application is visible in the specified area without trying to preserve the original aspect ratio. // Distortion can occur, and the application may appear stretched or compressed. kResolutionExactFit, // The entire application fills the specified area, without distortion but possibly with some cropping, // while maintaining the original aspect ratio of the application. kResolutionNoBorder, // The entire application is visible in the specified area without distortion while maintaining the original // aspect ratio of the application. Borders can appear on two sides of the application. kResolutionShowAll, // The application takes the height of the design resolution size and modifies the width of the internal // canvas so that it fits the aspect ratio of the device // no distortion will occur however you must make sure your application works on different // aspect ratios kResolutionFixedHeight, // The application takes the width of the design resolution size and modifies the height of the internal // canvas so that it fits the aspect ratio of the device // no distortion will occur however you must make sure your application works on different // aspect ratios kResolutionFixedWidth, kResolutionUnKnown,};
關於具體的螢幕適配解決方案這裡不做介紹,可以參考這篇文章:點擊開啟連結
下面針對上面我說到的iOS平台下,關於圖片大小和座標點大小的設定。
我之前已經說過,一般是基於320*480進行設計程式的,那麼我們可以在applicationDidFinishLaunching()中(注意在
pDirector->setOpenGLView(CCEGLView::sharedOpenGLView()); 之後添加)添加下面兩行代碼
CCSize designSize = CCSizeMake(320, 480); CCEGLView::sharedOpenGLView()->setDesignResolutionSize(designSize.width, designSize.height, kResolutionShowAll);
這樣的話,我們就將真機的螢幕大小設定成了320*480的size了。
通過 CCDirector::sharedDirector()->getWinSize() 獲得的真機的size也是320*480了。
那麼在程式中我們設定座標點的時候,真機和模擬器的座標點是一致的。但是假如你使用的是放大一倍的圖片,那麼需要對圖片的scale進行0.5的處理了。這樣做的好處是,模擬器和真機進行調試的時候二者是一樣的,就不會出現圖片大小或者座標點大小不一致的問題了。