noir_neo’s blog

日記と偶にスマホゲームの感想と、重箱の隅をつつくようなUI/UX批評

cocos2d-x の NO_BORDER で天地中央

諸事情により cocos2d-x に手を出して、ここ2、3日で C++ をほぼ初めて書き始めている。

C++ 難しい話はともかく、 cocos の座標系がやばいので覚書。

端末ごとの画面サイズ(というよりもアスペクト比)の差異を吸収する方法のひとつに ResolutionPolicy::NO_BORDER というのが用意されている。比率は保持して縦横どちらかにはみ出すやつ(cssbackground-size でいうところの cover 的な?)

この状態で画面の中央に配置するのにちょっとハマった。

Size size = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();

// layer->setPosition(size/2);
// では期待した挙動をしない(上下にはみ出す画面サイズの端末だと、下寄りになる)

Vec2 center = Vec2(size.width/2+origin.x, size.height/2+origin.y);

layer->setPosition(Vec2(center.x-layerSize/2,
                        center.y-layerSize/2))

早速ブレークポイントを使った。

Visible という名前からもう少し察したかったと言えば、それもそう。

この問題に関連したりしなかったりして ignoreAnchorPointForPosition とかいうのもあるけど、これはもっとややこしくてまだ完全に理解できていない… いっそ生 OpenGL のほうが座標系はそこそこ理解しているつもりなので書きやすそうである(感想)

これ系のネタでまた書くかも。