Enchant.jsで沼にはまったところがあったので、ここにメモしておきます。
Enchant.jsをはじめとして、HTML5ベースに作ったWebアプリをスマホとかで全画面表示(ネイティブアプリっぽく表示)するとき、
metaタグでviewportとかの設定をすると思います。
ただ、このときに、ゲーム画面が全体にフィットしないという問題が起こりました。
スマホの解像度に合わせて作ったにも関わらず...
結構これで悩んだのですが、いろいろ試したり調べたりするうちに、「viewportで表示した際、innerHeightを取得すると、最初の一回
目はアドレスバーを考慮した数値が出てくる」ということがわかりました。
viewportでの表示の時と、普通のブラウザの時の表示で何が異なるかというと、主にアドレスバーの有無です。
ブラウザで表示した際のinnerHeightが500だったとします。
viewportで表示すると、アドレスバーがない分これより値が大きくなりそうですが、一回目の表示の際は500となることがわかりました。
で、その状態でリロードすると、innerHeightの値が500より大きい、すなわち、アドレスバーが消えた状態の高さが取得できました。
実際には、最初に読み込んでからしばらく時間が経ってからinnerHeightを取得すれば、正しい高さが取得できるようでしたので、次のような
コードを実装すればこの問題は解決できると思われます。
var game = new Core(540, 930);
var CenterMove = function (core) {
var scale = Math.min(window.innerWidth / core.width, window.innerHeight / core.height);
core.scale = scale;
var stage = document.getElementById('enchant-stage');
stage.style.position = 'absolute';
stage.style.top = (window.innerHeight - (core.height * core.scale)) / 2 + 'px';
stage.style.left = (window.innerWidth - (core.width * core.scale)) / 2 + 'px';
core._pageX = (window.innerWidth - (core.width * core.scale)) / 2;
core._pageY = (window.innerHeight - (core.height * core.scale)) / 2;
};
setTimeout(function () {
CenterMove(game);
}, 55);
最初にgameオブジェクトを作成します。
正しい高さを取得するため55ms後にCenterMove関数を呼び出します。
ここでは、縦、横においてそれぞれ、拡大縮小率を計算し値が小さいものを選んで、それをgameオブジェクトのスケールとします。
その後は、画面を中央に表示しています。
以上です。