Posted at

【いまさら】マルチ解像度に対応する対応【メモ】

More than 5 years have passed since last update.

cocos2dxはAndroidとiOS両方にそしてあらゆる解像度にも対応できる最高のゲームエンジンですね!

AndroidやiOSの画面解像度への引き延ばしは(cocos2dx3.0より)ResolutionPolicyとして設定することができます。


AppDelegate.cpp


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)で設計したとしましょう。


ex

Size designResolutionSize = Size(640,1136);


ところがどっこい、Androidにも対応させたいです。そこで、どんなオプションがあるか、という話です。画面に設定した座標系をどう表示させるかは、先ほどのResolutionPolicyがあるわけです。画面を引き延ばして一致させるのか、全体を表示させるのか、引き延ばしてもアスペクト比をいじるのかいじらないのか。とかね。しかし、もし、リソースが1280×720でデザインされてたらどうしましょう。

ゲームの座標系を伸ばす処理はResolutionPolicyなわけですが、リソースが1280×720では、そのまま貼付けてもうまく行きません。

というわけで、ScaleFactorなんていうオプションがDirectorがあるわけです。リソースがこうあるので、(1136×640) に縮小してくださいっていう処理が次のようになります。


AppDelegate.cpp

//画面のリソースの解像度

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は、画面の実際の解像度に合わせて、設定してあげた方が良いです。

たとえば1920*1080(FHD)にたいして1280*720を一旦1136*640に縮小して1920*1080に伸ばしてもやっぱりあまり綺麗ではなかったりするので。

実際の画面の解像度は次のようにして得られます。


ex

 auto eglView = EGLView::getInstance();

//実際の画面の解像度
Size frameSize = eglView->getFrameSize();


これで得た解像度に合わせて、使うリソースを切り替えたりすると端末ごとに綺麗に表示されていいです。