(原創做品,歡迎轉載,註明出處,謝謝:http://www.cnblogs.com/binxindoudou/admin/EditPosts.aspx?postid=3213645)
html
1.原理分析的博客:cocos2d-x屏幕適配原理分析 cocos2d-x屏幕適配新解 app
2.cocos2d-x 在4inch模擬器下面也只顯示960 * 640的問題 (設置Default@2x.png跟 Default-568h@2x.png)iphone
3.Cocos2d-x-API-詳解-CCFileUtils post
4.本身實踐效果記錄(參考:http://www.cocos2d-x.org/projects/cocos2d-x/wiki/Mechanism_of_loading_resources)ui
1⃣一套資源匹配全部設備(有缺陷,圖片資源有限的狀況下采用)spa
在AppDelegate.cpp中.net
bool AppDelegate::applicationDidFinishLaunching()調試
{code
…… htm
CCEGLView* pEGLView = CCEGLView::sharedOpenGLView();//獲取到OpenGLView
//使用以下一句話,就能夠實現一套資源進行適配
//其中(480,320),在代碼中只要在始終想着適配480,320這個分辨率的設備就能夠了
//其中kResolutionExactFit是屏幕分辨率適配模式,這個模式是佔滿全屏幕,進行適當的延伸或者收縮,會出現失去比例,扭曲的畫面
//若是不想出現扭曲的畫面,那麼能夠試試kResolutionShowAll這個模式,會盡可能佔滿屏幕,但比例不變,因此最多有一個方向的留黑邊
pEGLView->setDesignResolutionSize(480, 320, kResolutionExactFit);
……
}
2⃣上述方法有遊戲效果上的損傷,若是你有多套資源,那麼能夠採用多套圖片適配多個設備。
若是隻針對蘋果的設備,那麼使用cocos2d-iphone的資源加載方法添加--後綴image.png image-hd.png image-ipad.png image-ipadhd.png image-568h.png就能夠識別了。但若是要是跨平臺的話,那麼這個方法可能就很差使了,由於我知道Andriod設備是經過文件夾來識別文件的,而且Android設備自己也是多種分辨率的,不可能覆蓋全面,只能挑些主流的適配,儘可能在使遊戲效果不受影響。固然爲了跨平臺開發,Xcode調試,安卓打包,那麼Xcode也只能使用文件夾加載資源了。
cocos2d-x提供了兩種機制來解決屏幕分辨率的問題。
第一種適用於資源路徑是這樣的(官方解釋說是使用CocosBuilder或者Cocos2d-iphone會使用這種路徑和處理方法,我沒有研究CocosBuilder,因此就在此就直譯下官方的說明)
--Resources
|--a.png
|--image
|--b.png
|--resources-iphonehd
|--b.png
|--resources-iphonehd
|--a.png
使用CCFileUtils::setSearchResolutionsOrder()來添加要找尋的路徑,能夠這樣設置:
std::vector<std::string> resDirOrders; if (resolution is ipad retina) { resDirOrders.push_back("resources-ipadhd"); resDirOrders.push_back("resources-ipad"); resDirOrders.push_back("resources-iphonehd"); } CCFileUtils::sharedFileUtils()->setSearchResolutionsOrder(resDirOrders);
在設置了找尋分辨率的路徑以後,若是想以以下方式建立精靈
CCSprite *sprite = CCSprite::create("images/tex.png");那麼引擎將會以如下方式尋找這張圖片
那麼引擎將會以如下方式尋找這張圖片先在images/resources-ipadhd/中找;
若是沒找到,在images/resources-iphonehd/中找;
若是沒找到,在images/resources-iphonehd/中找;
若是沒有,在images/中找。
注意:
這個策略不適合作多分辨率的匹配,不可能作到匹配全部設備的資源的,尤爲是對於跨平臺的,能夠這麼幹
先在images/resources-ipadhd/中找;
先在images/resources-ipadhd/中找;若是沒找到,在images/resources-iphonehd/中找;
若是沒找到,在images/resources-iphonehd/中找;
若是沒有,在images/中找。
注意:
這個策略不適合作多分辨率的匹配,不可能作到匹配全部設備的資源的,尤爲是對於跨平臺的,能夠這麼幹
若是沒找到,在images/resources-iphonehd/中找;
若是沒找到,在images/resources-iphonehd/中找;若是沒找到,在images/resources-iphonehd/中找;
若是沒有,在images/中找。
注意:
這個策略不適合作多分辨率的匹配,不可能作到匹配全部設備的資源的,尤爲是對於跨平臺的,能夠這麼幹
若是沒找到,在images/resources-iphonehd/中找;
若是沒找到,在images/resources-iphonehd/中找;
若是沒有,在images/中找。
注意:
這個策略不適合作多分辨率的匹配,不可能作到匹配全部設備的資源的,尤爲是對於跨平臺的,能夠這麼幹
若是沒有,在images/中找。
注意:
這個策略不適合作多分辨率的匹配,不可能作到匹配全部設備的資源的,尤爲是對於跨平臺的,能夠這麼幹
若是沒有,在images/中找。
若是沒有,在images/中找。
注意:
這個策略不適合作多分辨率的匹配,不可能作到匹配全部設備的資源的,尤爲是對於跨平臺的,能夠這麼幹
注意:
這個策略不適合作多分辨率的匹配,不可能作到匹配全部設備的資源的,尤爲是對於跨平臺的,能夠這麼幹
注意:
注意:
這個策略不適合作多分辨率的匹配,不可能作到匹配全部設備的資源的,尤爲是對於跨平臺的,能夠這麼幹
這個策略不適合作多分辨率的匹配,不可能作到匹配全部設備的資源的,尤爲是對於跨平臺的,能夠這麼幹
這個策略不適合作多分辨率的匹配,不可能作到匹配全部設備的資源的,尤爲是對於跨平臺的,能夠這麼幹
這個策略不適合作多分辨率的匹配,不可能作到匹配全部設備的資源的,尤爲是對於跨平臺的,能夠這麼幹
std::vector<std::string> resDirOrders; if (resolution is reslution1) { resDirOrders->push_back("path1"); resDirOrders->push_back("path2"); ... } else if (resolution is resolution2) { resDirOrders->push_back("path-a"); resDirOrders->push_back("path-b"); ... } ... CCFileUtils::sharedFileUtils()->setSearchResolutionsOrder(resDirOrders);
簡單理解起來,就是這種方法找的順序,你提供一個路徑:images/tex.png
而後引擎會認爲你的images文件加下會有resource-iphone resource-iphonehd都會有此圖片,就會依照你設置的順序去找,由於你的設置是最容易找到這張圖片的,可是若是沒有,那麼也
應該會有通用的就是images/下的tex.png。
適用範圍:每一個資源文件夾都是同樣的構造,都會有通用的文件和針對特定設備的文件夾,那麼依照你的設置,引擎只會索引相應設備下的。
你應該依據不一樣設備設置好查找路徑。具體的設備的識別及注意事項以下:
簡單理解起來,就是這種方法找的順序,你提供一個路徑:images/tex.png
而後引擎會認爲你的images文件加下會有resource-iphone resource-iphonehd都會有此圖片,就會依照你設置的順序去找,由於你的設置是最容易找到這張圖片的,可是若是沒有,那麼也
應該會有通用的就是images/下的tex.png。
適用範圍:每一個資源文件夾都是同樣的構造,都會有通用的文件和針對特定設備的文件夾,那麼依照你的設置,引擎只會索引相應設備下的。
你應該依據不一樣設備設置好查找路徑。具體的設備的識別及注意事項以下:
簡單理解起來,就是這種方法找的順序,你提供一個路徑:images/tex.png
而後引擎會認爲你的images文件加下會有resource-iphone resource-iphonehd都會有此圖片,就會依照你設置的順序去找,由於你的設置是最容易找到這張圖片的,可是若是沒有,那麼也
應該會有通用的就是images/下的tex.png。
適用範圍:每一個資源文件夾都是同樣的構造,都會有通用的文件和針對特定設備的文件夾,那麼依照你的設置,引擎只會索引相應設備下的。
你應該依據不一樣設備設置好查找路徑。具體的設備的識別及注意事項以下:
簡單理解起來,就是這種方法找的順序,你提供一個路徑:images/tex.png
而後引擎會認爲你的images文件加下會有resource-iphone resource-iphonehd都會有此圖片,就會依照你設置的順序去找,由於你的設置是最容易找到這張圖片的,可是若是沒有,那麼也
應該會有通用的就是images/下的tex.png。
適用範圍:每一個資源文件夾都是同樣的構造,都會有通用的文件和針對特定設備的文件夾,那麼依照你的設置,引擎只會索引相應設備下的。
你應該依據不一樣設備設置好查找路徑。具體的設備的識別及注意事項以下:
簡單理解起來,就是這種方法找的順序,你提供一個路徑:images/tex.png
而後引擎會認爲你的images文件加下會有resource-iphone resource-iphonehd都會有此圖片,就會依照你設置的順序去找,由於你的設置是最容易找到這張圖片的,可是若是沒有,那麼也
應該會有通用的就是images/下的tex.png。
適用範圍:每一個資源文件夾都是同樣的構造,都會有通用的文件和針對特定設備的文件夾,那麼依照你的設置,引擎只會索引相應設備下的。
你應該依據不一樣設備設置好查找路徑。具體的設備的識別及注意事項以下:
簡單理解起來,就是這種方法找的順序,你提供一個路徑:images/tex.png
而後引擎會認爲你的images文件加下會有resource-iphone resource-iphonehd都會有此圖片,就會依照你設置的順序去找,由於你的設置是最容易找到這張圖片的,可是若是沒有,那麼也
應該會有通用的就是images/下的tex.png。
適用範圍:每一個資源文件夾都是同樣的構造,都會有通用的文件和針對特定設備的文件夾,那麼依照你的設置,引擎只會索引相應設備下的。
你應該依據不一樣設備設置好查找路徑。具體的設備的識別及注意事項以下:
簡單理解起來,就是這種方法找的順序,你提供一個路徑:images/tex.png
而後引擎會認爲你的images文件加下會有resource-iphone resource-iphonehd都會有此圖片,就會依照你設置的順序去找,由於你的設置是最容易找到這張圖片的,可是若是沒有,那麼也
應該會有通用的就是images/下的tex.png。
適用範圍:每一個資源文件夾都是同樣的構造,都會有通用的文件和針對特定設備的文件夾,那麼依照你的設置,引擎只會索引相應設備下的。
你應該依據不一樣設備設置好查找路徑。具體的設備的識別及注意事項以下:
簡單理解起來,就是這種方法找的順序,你提供一個路徑:images/tex.png
而後引擎會認爲你的images文件加下會有resource-iphone resource-iphonehd都會有此圖片,就會依照你設置的順序去找,由於你的設置是最容易找到這張圖片的,可是若是沒有,那麼也
應該會有通用的就是images/下的tex.png。
適用範圍:每一個資源文件夾都是同樣的構造,都會有通用的文件和針對特定設備的文件夾,那麼依照你的設置,引擎只會索引相應設備下的。
你應該依據不一樣設備設置好查找路徑。具體的設備的識別及注意事項以下:
簡單理解起來,就是這種方法找的順序,你提供一個路徑:images/tex.png
而後引擎會認爲你的images文件加下會有resource-iphone resource-iphonehd都會有此圖片,就會依照你設置的順序去找,由於你的設置是最容易找到這張圖片的,可是若是沒有,那麼也
應該會有通用的就是images/下的tex.png。
適用範圍:每一個資源文件夾都是同樣的構造,都會有通用的文件和針對特定設備的文件夾,那麼依照你的設置,引擎只會索引相應設備下的。
你應該依據不一樣設備設置好查找路徑。具體的設備的識別及注意事項以下:簡單理解起來,就是這種方法找的順序,你提供一個路徑:images/tex.png
簡單理解起來,就是這種方法找的順序,你提供一個路徑:images/tex.png
而後引擎會認爲你的images文件加下會有resource-iphone resource-iphonehd都會有此圖片,就會依照你設置的順序去找,由於你的設置是最容易找到這張圖片的,可是若是沒有,那麼也
應該會有通用的就是images/下的tex.png。
適用範圍:每一個資源文件夾都是同樣的構造,都會有通用的文件和針對特定設備的文件夾,那麼依照你的設置,引擎只會索引相應設備下的。
你應該依據不一樣設備設置好查找路徑。具體的設備的識別及注意事項以下:
而後引擎會認爲你的images文件加下會有resource-iphone resource-iphonehd都會有此圖片,就會依照你設置的順序去找,由於你的設置是最容易找到這張圖片的,可是若是沒有,那麼也
應該會有通用的就是images/下的tex.png。
適用範圍:每一個資源文件夾都是同樣的構造,都會有通用的文件和針對特定設備的文件夾,那麼依照你的設置,引擎只會索引相應設備下的。
你應該依據不一樣設備設置好查找路徑。具體的設備的識別及注意事項以下:
CCEGLView* pEGLView = CCEGLView::sharedOpenGLView();
CCSize frameSize = pEGLView->getFrameSize();
frameSize就是屏幕實際的分辨率
(注意:對於iphone5來講,只有添加上Default-568h@2x.png的啓動圖片才能夠識別成正確的1136*640,不然是960*640)
(注意:CCDirector::sharedDirector()->getWinSize()與frameSize的區別,winSize只得是你的屏幕邏輯像素值)
(摘自cocos2d-x-2.1.4/samples/Cpp/HelloCpp/Classes/AppDelegate.cpp)
// if the frame's height is larger than the height of medium resource size, select large resource.
if (frameSize.height > mediumResource.size.height)
{
//設置使用資源路徑,儘可能的使用匹配資源
searchPath.push_back(largeResource.directory);
//注:designResolutionSize就是你的winSize,就是你的邏輯分辨率,會以你的資源尺寸作相應比例的變化。
pDirector->setContentScaleFactor(MIN(largeResource.size.height/designResolutionSize.height, largeResource.size.width/designResolutionSize.width));
}
// if the frame's height is larger than the height of small resource size, select medium resource.
else if (frameSize.height > smallResource.size.height)
{
searchPath.push_back(mediumResource.directory);
pDirector->setContentScaleFactor(MIN(mediumResource.size.height/designResolutionSize.height, mediumResource.size.width/designResolutionSize.width));
}
// if the frame's height is smaller than the height of medium resource size, select small resource.
else
{
searchPath.push_back(smallResource.directory);
pDirector->setContentScaleFactor(MIN(smallResource.size.height/designResolutionSize.height, smallResource.size.width/designResolutionSize.width));
}
// set searching path
CCFileUtils::sharedFileUtils()->setSearchPaths(searchPath);
在這裏要注意的是它的尋找資源的順序:
vector<string> searchPaths; searchPaths.push_back("/mnt/sd/example"); searchPaths.push_back("/data/data/org.cocos2dx.example"); CCFileUtils::setSearchPaths(searchPaths); 8CCSprite *pSprite = CCSprite::create("1.png");
找的時候先找/mnt/sd/example
而後/data/data/org.cocos2dx.example
而後/Resources
最後報錯
(原創做品,歡迎轉載,註明出處,謝謝:
http://www.cnblogs.com/binxindoudou/admin/EditPosts.aspx?postid=3213645)