[GameMaker: Studio] 端末の向きとレイアウト・シンプル版

前回の記事では端末の向きでレイアウトそのものを変更するためにちょっとややこしいことをしてしまいました。

今回はレイアウト自体は変更せず、端末が横なら全体を表示し、縦なら縦サイズをフィットさせて横サイズははみ出した部分をカットするというシンプルな方法です。

基本的には縦画面としてレイアウトを考え、横画面にした際には空いた部分に何か付け加える…といった感じです。

viewは0番のみ使用し、通常のroomと同様に、0,0から横サイズx縦サイズの領域に描画します。例えば横向き(landscape)で1972×1240なら、wview=1972,hview=1240です。
wportvportは実際に表示したいサイズに設定します。620×390ならwport=620,vport=390です。

gms_device_orientation_sample_8 gms_device_orientation_sample_9

縦向き(portrait)時の表示サイズも決めておきます。
ここでは390×620とします。

これら各サイズは向き変更用スクリプトに渡します。
パラメータは“view番号 , 描画領域の縦サイズ , 横向き時の横サイズ , 横向き時の縦サイズ , 縦向き時の横サイズ , 縦向き時の縦サイズ”の順です。
描画領域の横サイズは向きによって自動的に算出されます。

s_change_orientation(0, 1240, 620, 390, 390, 620);
[script : s_change_orientation]
{
    var vn = argument0;     // view index
    var vh = argument1;     // view height
    var lw = argument2;     // landscape width
    var lh = argument3;     //           height
    var pw = argument4;     // portrait width
    var ph = argument5;     //          height

    if(view_wport[vn] > view_hport[vn]) {     // l -> p
        view_wview[vn] = floor(pw / ph * vh + 0.5);
        view_wport[vn] = pw;
        view_hport[vn] = ph;
    }
    else {                                    // p -> l
        view_wview[vn] = floor(lw / lh * vh + 0.5);
        view_wport[vn] = lw;
        view_hport[vn] = lh;
    }
    view_hview[vn] = vh;
    surface_resize(application_surface, view_wport[vn], view_hport[vn]);
    window_set_size(view_wport[vn], view_hport[vn]);
}

実際の表示はこのようになります。

gms_device_orientation_sample_6
gms_device_orientation_sample_7

オレンジの部分が横向き時専用の描画領域になっています。

今回は呼び出すたびに向きが変るようにしましたが、パラメータで向きを指定したり、display_get_orientation()で自動判別しても良いかと思います。

縦向き時にxviewを移動させると、右をカットではなく左をカットや左右をカットにさせることもできます。