cocos2dxはAndroidとiOS両方にそしてあらゆる解像度にも対応できる最高のゲームエンジンですね!
AndroidやiOSの画面解像度への引き延ばしは(cocos2dx3.0より)ResolutionPolicyとして設定することができます。
auto director = Director::getInstance();
auto eglView = EGLView::getInstance();
director->setOpenGLView(eglView);
eglView->setDesignResolutionSize(designResolutionSize.width,
designResolutionSize.height,
ResolutionPolicy::NO_BORDER);
このResolutionPolicyてなんじゃって人はこちら
んで、このDesignResolutionSizeは、結局ゲームで使う座標系のことのなんですよ。これ大事!たとえば、iPhoneの4inch(1136×640)で設計したとしましょう。
Size designResolutionSize = Size(640,1136);
ところがどっこい、Androidにも対応させたいです。そこで、どんなオプションがあるか、という話です。画面に設定した座標系をどう表示させるかは、先ほどのResolutionPolicyがあるわけです。画面を引き延ばして一致させるのか、全体を表示させるのか、引き延ばしてもアスペクト比をいじるのかいじらないのか。とかね。しかし、もし、リソースが1280×720でデザインされてたらどうしましょう。
ゲームの座標系を伸ばす処理はResolutionPolicyなわけですが、リソースが1280×720では、そのまま貼付けてもうまく行きません。
というわけで、ScaleFactorなんていうオプションがDirectorがあるわけです。リソースがこうあるので、(1136×640) に縮小してくださいっていう処理が次のようになります。
//画面のリソースの解像度
Size ResourceDpi = Size(720,1280);
auto director = Director::getInstance();
director->setContentScaleFactor(MIN(ResourceDpi.size.height / designResolutionSize.height ,
ResourceDpi.size.width / designResolutionSize.width));
ContentScaleFactorは、リソースをゲーム座標系に対しどれくらい縮小するか、大きくするかを決めるファクターなんですよね。
たとえば、1136×640がゲーム座標系で、リソースの解像度が1280×720なら、ContentScaleFactorはこの場合は、1280/1136 = 1.25fとなります。
これは、もとのリソースがゲームの解像度の何倍か、教えてあげるものです。それに応じて、この逆数倍、縮小してあげればちゃんと表示できるわけです。
このResourceDpiは、画面の実際の解像度に合わせて、設定してあげた方が良いです。
たとえば19201080(FHD)にたいして1280720を一旦1136640に縮小して19201080に伸ばしてもやっぱりあまり綺麗ではなかったりするので。
実際の画面の解像度は次のようにして得られます。
auto eglView = EGLView::getInstance();
//実際の画面の解像度
Size frameSize = eglView->getFrameSize();
これで得た解像度に合わせて、使うリソースを切り替えたりすると端末ごとに綺麗に表示されていいです。