[セットトップ]cocos 2 d-x画面適応解決方法


最近、pc、ipad、andriodプラットフォームで実行できるプロジェクトを書いているので、cocos 2 d-xで開発することを選びました.私たちの資源の大きさは1024*768で、pcでもアップルでも問題ありませんが、andriodでは問題が来ました.Androidには様々な解像度がありますが、プログラムはすべての解像度で正常に表示されますか?この問題に対して、私はいくつかの方法を考えました.
(1)複数セットの資源を作る
このプロジェクトにはアニメーションリソースがたくさんあるので、複数のリソースを作るには、作業量が大きく、プロジェクトの時間がきついので、このプログラムは使用できません.
(2)cocos 2 d-xには一つの方法がある
pDirector->setContentScaleFactor(0.5);
この方法はシーン全体を半分に縮小して、インタフェースの上で問題がないように見えますが、中でクリックする精霊の対応する位置はすべて間違っています.この方法を使うと、コードはいくつかのセットを書いて、異なる解像度によって異なる精霊の配置位置と対応する位置を調整します.リソースは1部ですが、コードは書き直さなければなりません.まず機械の解像度を決めてから、その精霊の位置と対応する位置のコードを決めます.andriodの下の機械の解像度をどのように分けるか、これはまだ問題です.よく考えて、複数のapkファイルを作成するつもりで、主流の解像度をして、例えば1024*7681280*800800*480などをします.そうするつもりだったが、もっと良い3つ目の方法を見つけた.
(3)この方法は1セットのリソースしか必要とせず,精霊の位置も1セット(絶対位置でも相対位置でも)しかなく,絶対に最適な選択である.
まずwindowsの下の解決方法を言います:
例えば、私たちのプロジェクトは1024*768で、今サイズを800*600に変更するには、関数を書くだけです.
 
int ViewAutoScale(cocos2d::CCEGLView* view,   
	                  void* title,  
	                  int width,   
	                  int height,  
	                  cocos2d::CCSize* supportDisplay,  
	                  int displays,  
	                  int defaultWidth,  
	                  int defaultHeight)  
	{  
		 if(view == NULL)  
		{  
				 return -1;  
		}  
		for (int i=0; i < displays; i++)  
		{  


			if ((w==size.width && h==size.height) || (h==size.width && w==size.height))  
				{  
					 view->Create((LPCTSTR)title, width, height);  
						     return i+1;  
				}  
		}  
		view->Create((LPCTSTR)title, defaultWidth, defaultHeight);  
		view->setScreenScale(min((float)width/ defaultWidth, (float)height/ defaultHeight));  
		view->resize(width, height);  
		view->centerWindow();  
		return 0;  
	}  

 
この関数はAppDelegateに置きます.cppでグローバル関数として、次に
bool AppDelegate::initInstance()で呼び出し、次のように使用します.
bool AppDelegate::initInstance()
{
    bool bRet = false;
    do
    {
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)

		// Initialize OpenGLView instance, that release by CCDirector when application terminate.
		// The HelloWorld is designed as HVGA.
		CCSize sSupportDisplay[]={CCSize(1024, 768)};
		CCEGLView * pMainWnd = new CCEGLView();
		//CC_BREAK_IF(! pMainWnd
		//		|| ! pMainWnd->Create(TEXT("    "), 1024, 768));
		if (ViewAutoScale(pMainWnd,TEXT("    "),1024,768,
							sSupportDisplay,
							sizeof(sSupportDisplay)/sizeof(CCSize),
							1024,
							768)<0)
		{
			return false;
		}

#endif  // CC_PLATFORM_WIN32

}
上の1024*768は私たち自身の大きさで、800*480は私たちが適応したい大きさで、このようにして、800*480のパラメータを調整すれば、自分の望む大きさに変えることができます.
2つ目はandriodの下でスクリーン適応を実現することですが、実はもっと簡単で、1つの方法しか必要ありません.cocos 2 d-xの下では、呼び出すだけで実現できます.
修正方法は次のとおりです.
ハローワールド/android/jni/helloworld/mainに入ります.cppでは、
次にview->create(1024768)を呼び出します.
コードは次のとおりです.
void Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit(JNIEnv*  env, jobject thiz, jint w, jint h)
{
    if (!cocos2d::CCDirector::sharedDirector()->getOpenGLView())
    {
	cocos2d::CCEGLView *view = &cocos2d::CCEGLView::sharedOpenGLView();
        view->setFrameWidthAndHeight(w, h);
        view->create(1024,768);
        // if you want to run in WVGA with HVGA resource, set it
        // view->create(480, 320);  Please change it to (320, 480) if you're in portrait mode.
        cocos2d::CCDirector::sharedDirector()->setOpenGLView(view);

        AppDelegate *pAppDelegate = new AppDelegate();
        cocos2d::CCApplication::sharedApplication().run();
    }
    else
    {
        cocos2d::CCTextureCache::reloadAllTextures();
        cocos2d::CCDirector::sharedDirector()->setGLDefaultValues();
    }
}

これで、andriodがどんな解像度であっても、この方法を使用すると、自動的に調整され、すべてokになります.
 
では、まとめてみましょう
3つ目の方法を使うのは当然ですが、弊害もあります.例えば、プログラムはもともと1024*768をサポートしています.それから、800*480に変更します.幅と高さは比例しません.だから、この方法を使うと、x軸に黒い辺があります.
フルスクリーンの効果を得るには、最初の方法で複数のリソースを処理するしかありません.