[GameMaker: Studio] キーボードとゲームパッドとOSCをまとめて処理するサンプル(gmzあり v0.5.1.0)

GameMaker: Studio(GM:S)用のコントローラー入力支援ライブラリです。

まずはこちらの動作サンプルを見てください。
IE11FirefoxChromeで動作します。


■主な特徴

  • キーボード、ゲームパッド、オンスクリーンコントローラー(OSC)といったデバイスの違いを意識することなく、1命令でキーの状態を取得できます。
    ゲームパッドは複数接続できます。
  • 各キーには任意のスクリプトをコールバックとして設定することができます。
    たとえばスタートボタンにポーズメニューのスクリプトを設定しておけば、スタートボタンが押されれば自動的にポーズメニューを表示させるといったことができます。
  • OSCはデスクトップ環境ではマウス、モバイル端末ではタッチに対応しています。
  • OSCGM:S標準の仮想キー(Virtual Keys)機能は使用していないので、デスクトップ環境でも使用できます。
  • OSCで表示するキーの種類や位置、大きさはカスタマイズ可能です。
    方向キーは4方向個別表示とアナログパッドのどちらでも表示できます。
  • OSCはウィンドウサイズや端末の向きの変化で自動的に位置とサイズが再計算されます。
  • OSCの画像はサンプルが付属していますが、好きなスプライトに置き換えることができます。
  • roomviewが設定されている場合、一番上位(番号が小さい)viewOSCが追従します。
    viewを使用する場合はview[0]が全画面になるようにしてください。
  • GM:S Professional Editionで使用できます。Free版は未検証です。
    バージョンはv1.4.1763にて動作確認を行っています。
  • 動作確認済みプラットフォームは以下の通りです。
    Windowsデスクトップ(+YYC)
    Windows 8(Native/YYC)
    Windows Phone 8(+YYC)
    Windows UWP(+YYC) for x86
    Windows UWP for arm(Windows 10 Mobile)
    Android(+YYC)
    HTML5(IE11・Firefox・Chrome)
    ※環境によっては正常に動作しない場合があります。
    Windows UWP+YYC for arm(Windows 10 Mobile)はインストールはできるものの起動しませんでした。YYCを使用しなければ起動します。WP8ビルドはYYCを使用しても起動するので、Win10MobileUWPを使わずWP8で出力するという手もあります。

■仕様と問題点

  • とりあえず動作させることが目的で作成したため、全体的に無駄が多く、それなりに負荷がかかります。
  • GM:Sのドキュメントではブラウザでもゲームパッドに対応しているような記述がありますが、認識されなかったため未確認です。
  • キーボードとOSCは入力デバイス#0に固定されます。たとえばキーボード(またはOSC)とゲームパッド1台ではどちらも入力デバイス#0のため同時プレイができません。
  • サンプルのRoom-2でポーズかけたときのBGフィルターの座標がずれてますが、これは入力ライブラリとは無関係でサンプル固有のミスなので気にしないでください。
  • おそらく、色々とバグがあるような気がします。

■ライセンス等

  • 本ライブラリの一部または全部を使用したゲームやアプリは、無償/有償を問わず自由に配信/販売して構いません。
    使用料やクレジット表記、使用報告も不要です。
  • 本ライブラリ内容を修正/改造しても構いません。
  • 本ライブラリを含むソースコードやプロジェクトファイルを配信/販売またはブログ等の記事にする場合は、本ライブラリの制作者として下記にリンクを貼ってください。
    http://emilycharlotte.jp/
  • 本ライブラリの使用による損害/問題/紛争等について一切関与せず、責任も負いません。
  • 本ライブラリはサポート対象外です。
    使用方法の詳細な解説は省略していますので、サンプルプロジェクトを解析してください。今後アップデートを行う保証もありません。

■サンプルプロジェクト

こちらからダウンロードしてください。
http://labo.emilycharlotte.jp/gms_device_input_sample/gms_device_input_sample_0510.gmz

サンプルの操作方法は下記の通りです。

ゲームパッド/OSC : キーボード   : サンプルの動作
左スティック     : カーソルキー : 四角いオブジェクトが移動します。
[A][B]          : [Z][X]      : 四角いオブジェクトが回転します。
                                押した瞬間に四角いオブジェクトがポップします。
[X]             : [C]         : roomを切り替えます。
[Y]             : [V]         : OSCの色を変更します。
[SELECT]        : [BS]        : OSCの表示を切り替えます。
[START(>)]     : [Enter]     : ポーズ状態を切り替えます。
                                room#2のみ有効です。
                                room#1はポーズを無効にしています。

■バージョン履歴

  • v0.5.1.0 – 2016/10/10
    [修正] LT3とRT3のキーコードが逆に設定されていたのを修正。
    [追加] Viewが有効の場合はOSCをViewに追従するように処理を追加。
  • v0.5.0.0 – 2016/10/10
    初版公開。

■キーボードの割り当て一覧

ゲームパッド/OSC      : キーボード
[START]              : Enter
[SELECT]             : BackSpace
[左スティック UP]     : 
[左スティック DOWN]   : 
[左スティック LEFT]   : 
[左スティック RIGHT]  : 
[A]                  : Z
[B]                  : X
[X]                  : C
[Y]                  : V
[LB]                 : Q
[RB]                 : E
[LT]                 : Ctrl
[RT]                 : Shift
[左スティックボタン]  : Tab       *1
[右スティックボタン]  : R         *1
[パッド UP]          : W
[パッド DOWN]        : S
[パッド LEFT]        : A
[パッド RIGHT]       : D

*1 : v0.5.0.0では[R]と[Tab]が逆に定義されています。v0.5.1.0で修正されています。
v0.5.0.0を継続して使用する場合は初期化後に、
global.system_device_input_key_list[global.system_device_input_type_lt3] = vk_tab;
global.system_device_input_key_list[global.system_device_input_type_rt3] = ord("R");
…として再設定して使用してください。

■基本的な使用手順・1

サンプルプロジェクトの内、最低限必要なものは以下の通りです。抜けがあったらごめんなさい。

  • SpritesOSC* (自身で作成しても構いません)
  • ScriptsDeviceInput*

キーの種類や方向パッドの番号等はp_device_input_constant内で定数化してあります。


■基本的な使用手順・2

起動roomに初期化用のObjectを配置して、そのCreateイベントで下記の2つのオブジェクトを配置してください。
この2つはPersistent(永久)オブジェクトなので、roomが変っても動作し続けます。

  • メインループ用Object (サンプルではo_main_loop)
    Persistent = true
    Depth = 100 (プロジェクト内で一番小さな数値)
    Begin Stepイベント = p_device_input_main();
  • OSC描画用Object (サンプルではo_post_draw)
    Persistent = true
    Depth = 9999999 (プロジェクト内で一番大きな数値)
    Draw GUIイベント = p_device_input_osc_draw();

■基本的な使用手順・3

起動roomに初期化用のObjectを配置して、そのCreateイベントで下記命令を実行してください。

  • OSCを使わない場合
    p_device_input_init(使用したい入力デバイスの数);
  • OSCを使う場合
    p_device_input_init(使用したい入力デバイスの数,
          OSCキーのスプライトID,
          OSC方向パッドのスプライトID);

■基本的な使用手順・4

OSCを使用する場合は任意で以下の設定を行ってください。OSCを使用しない場合この手順は不要です。
具体的な設定方法はp_device_input_initの最後を参考にしてください。

  • OSCとして使用したいキーの表示設定を行う。
    [幅][高さ]は省略可能で、省略時は元の値が引き継がれます。
    幅と高さの初期値はそれぞれ画面サイズの1/10です。
    p_device_input_osc_key_set(キーの種類, X座標, Y座標[, 幅, 高さ]);
  • OSC方向パッドを使用する場合は下記命令で設定を行う。
    キーと同様に[幅][高さ]は省略可能です。
    幅と高さの初期値はそれぞれ画面サイズの1/4です。
    p_device_input_osc_pad_set(左または右, X座標, Y座標[, 幅, 高さ]);
  • OSCは標準でSTRATSELECTABXY左方向パッドが設定されています。
    不要なものは下記命令で消去してください。
    ただし、表示維持に設定されている場合は消去されません。先に表示維持を解除してください。
    p_device_input_osc_key_disable(キーの種類);
    p_device_input_osc_pad_disable(左または右);
  • OSCは全表示/全非表示以外に、一部を残したまま表示/非表示を切り替えることもできます。
    その場合に表示状態を維持したいキーは下記命令で設定/解除できます。
    p_device_input_osc_key_set_keep_view(キーの種類, trueまたはfalse);
    p_device_input_osc_pad_set_keep_view(左または右, trueまたはfalse);
  • OSCの透明度は下記命令で変更できます。0.0が透明、1.0が不透明です。
    p_device_input_osc_set_alpha(透明度);
  • OSCの全表示/全非表示は下記命令で行います。
    p_device_input_osc_show();
    p_device_input_osc_hide();
  • 一部を残したまま表示/非表示を切り替えるには下記命令を使用します。
    p_device_input_osc_set_show_only_keeps(trueまたはfalse);

■基本的な使用手順・5

  • 指定したキーが押されているか調べる。
    これは継続して検出されます。
    [消去]trueを設定すると「押されている」というフラグがクリアされるため、そのフレーム中は以降の処理では押されていないことになります。
    押したままであれば次フレームで再び押された状態となります。
    [消去]は省略可能で、省略時はfalseとなります。
    if(p_device_input_check(入力デバイス番号, キーの種類[,消去])) { 押されている場合の処理 }
  • 指定したキーが押されたか調べる。
    こちらは押された瞬間のみ検出されます。
    [消去]trueを設定すると「押された」というフラグがクリアされます。消去するとそのキーが離されて再度押されるまでは再検出されません。
    [消去]は省略可能で、省略時はfalseとなります。
    if(p_device_input_check_pressed(入力デバイス番号, キーの種類[,消去])) { 押された場合の処理 }
  • 指定したキーが離されたか調べる。
    こちらは離された瞬間のみ検出されます。
    [消去]trueを設定すると「離された」というフラグがクリアされます。
    [消去]するとそのキーが再度押して離されるまでは再検出されません。
    [消去]は省略可能で、省略時はfalseとなります。
    if(p_device_input_check_released(入力デバイス番号, キーの種類[,消去])) { 離された場合の処理 }

■基本的な使用手順・6

  • 方向キー(左方向パッドと左スティックも共通)は4方向(上下左右)個別のON/OFF以外に、上を0として時計回り(CW)に8方向に番号を振ったデジタル値を取得することもできます。
    方向キーが押されていない場合は-1となります。
    8方向値 = global.system_device_input_now_dir[入力デバイス番号];
  • 左右方向パッド(左右スティックも共通)はデジタル値以外にも方向と強さのアナログ値を取得することもできます。
    方向は右を0度として反時計回り(CCW)に360度、強さは0.0~1.0となります。
    キーボードの方向キーは強さ1.0の左スティックとして扱われます。
    360度方向値 = global.system_device_input_osc_pad_dir[左または右];
    強さ = global.system_device_input_osc_pad_len[左または右];