GameControllerizer: 既存ディジタルゲームへの入力をプログラミングするためのミドルウェアの開発


本研究では,IoT機器,Webサービス,AIなどの処理を統合して,最終的にゲームコントローラ操作へと変換し既存ディジタルゲームを操作するためのミドルウェア,GameControllerizerを提案する.多様な機器および情報源を既存ゲームへの入力として扱えるようになることにより,新たなエンタテインメントの創出やゲーミフィケーションの構成のための試行錯誤を容易に行うことが可能となる.GameControllerizerNode-REDにより各種入力情報を既存ゲーム入力に変換するプログラミングを簡便に行うビジュアルプログラミング部,およびハード・ソフト両面のエミュレーションにより実際のゲーム機への入力信号を発生させるゲーム入力エミュレーション部からなる.基礎的な性能評価を行うとともに,多様なユースケース事例を提示することでその有用性を示す.

関連する技術に,すでに市販されているMakey Makeyがある.身の回りのものについて「タッチ入力」を自由にデザインでき,それをキーボード・マウス入力としてPCに送る技術である.PC上で動作するゲームに限定されるものの,そのエンタテインメント性を拡張するために用いることができる点はGameControllerizerと共通している.
Makey Makeyと比較した場合のGameControllerizerの特徴は,以下の点である.
  • GameControllerizerはキーボード・マウスだけでなく,ゲームパッドも出力として扱える.また,USB接続以外の特殊ハードウェアの家庭用ゲームマシンを扱える.
  • GameControllerizerは入力機器として,タッチ入力だけでなく,加速度センサやWebサービスなど,広範なデバイス・情報源を扱うことができる.
    • Makey MakeyもGameControllerizerで活用できる入力デバイスの一つとして扱うことができ,ビジュアルプログラミングで加工ののちにPlaystationなどの家庭用ゲームマシンへと送出する使い方などが実現可能である.
  • GameControllerizerはビジュアルプログラミング部によって,複雑なコマンド操作や,AI等による自動操作などをプログラミングできる.


NEWS

ソースコードを近日公開します.
ハードウェアの配布方法も検討中です.



仕様情報

DSL4GC

GameControllerizerにおいては,ゲーム制御情報をDSL4GC(Domain Specific Language for Game Control)という抽象形式で記載し,Node-REDでこの制御情報を適切に改変・再送出することで,既存ゲームへの入力のマッピングを実現する.たとえば方向キーおよびアナログスティックをニュートラルとし,1番のボタンを押す動作を2フレームにわたって行う,という情報は:
{"dpad":5, "btn":[1], "dur":2, "ang":[0,0,0,0]}
のようにJSONで表現される.

DSL4GCの定義

DSL4GCで対象とする既存入力デバイスは Gamepad/Mouse/Keyboard とし,この制御情報を次に示すフォーマットで記載するものとした.


gc_sentence = Array[gc_word]

gc_word = gc_gamepad_word | gc_mouse_word | gc_keyboard_word

gc_gamepad_word = {“dpad”:Int, “btn”:Array[Int], ”ang“:Array[Int], “dur”:Int}

gc_mouse_word =  {“btn”:Array[Int], “mov”:Array[Int], “dur”:Int}

gc_keyboard_word = {“key”:Array[String], “mod”:Array[Int],  “dur”:Int}


gc_gamepad_word

下記要素をもつゲームパッドとして抽象化した.


  • 十字キー:1個

  • ボタン:n個

  • アナログスティック:2個

dpad

1~9の数値でゲームパッドの方向キー(十字キー)入力を表現する.方向と番号の対応は図[*] である.

btn

ボタンの押し込み状態を表現する.押しているボタンのIDが配列に格納される.

ang

アナログスティックを表現している.インデックス順に [Axis0-h, Axis0-v, Axis1-h, Axis1-v],値域は-128~127とした.

dur

上記制御を適用する期間である,単位はframeとした(1frame = 16.666msに相当).値が表現する動作は以下である.

0~127 指定された制御(dpad, btn, ang)を指定frame間適用した後,default値にも

どる

0 < 指定された制御(dpad, btn, ang)を次の入力がある適用し続ける.


{“dpad”:5, “btn”:[0], “ang”:[0,0,0,0], “dur”:2}

0番目のボタンを2frameの間押し,離す(実動作では,スタートボタンや決定ボタンを押すことに相当)

{“dpad”:2, “btn”:0, “ang”:[0,0,0,0], “dur”:-1}

方向キーの下ボタンを押し続ける.


なお,制御期間は gc_sentence で指定することもできるが,実時間として扱うこともできる.例えば,ビジュアルプログラミング部に入力/出力される gc_sentence において,以下2つの gc_sentence は等価であり交換可能である.


  1. [{“dpad”:5, “btn”:[0], “ang”:[0,0,0,0], “dur”:2}]

  2. [{“dpad”:5, “btn”:[0], “ang”:[0,0,0,0], “dur”:-1}]

2frame(=0.033 msec)待ち

[{“dpad”:5, “btn”:[], “ang”:[0,0,0,0], “dur”:-1}]


GcScanner は既存入力デバイス(gamepad)を一定期間ごと(初期値は30回/1秒)にスキャンし,イベント(方向キーやボタンを押す,アナログスティックの値が変わる)が発生するたびに,gc_sentence を生成,ビジュアルプログラミング部へ送信する.

gc_mouse_word

下記要素をもつマウスとして抽象化した.

  • ボタン:3個

  • 移動軸:2軸

btn

ボタンの押し込み状態を表現する.左ボタン:0,右ボタン:1,中央ボタン:2とした.

mov

マウスの相対移動量を指し示す.インデックス順に[dX, dY].画面に対して左下を原点とする.

dur

Gamepadの場合に同じ

gc_keyboard_word

下記要素をもつキーボードとして抽象化した.

  • Alphanumeric keys(”a”~”z”,”0”~”9”)

  • Arrow pad keys(”ArrowUp”, “ArrowDown”, “ArrowRight”, “ArrowLeft”)

  • Function keys(”F1”~”F12”, “Escape”)

  • Functional keys (”Space”, “Tab”, “Enter”, “Backspace”)

  • Modifierkey(”Ctrl”, “Shift”, “Alt”)


key

Modifierkeyを除くキーの押し込み状態を文字列配列で表現する.同時に押されているキーがある場合,それぞれのキーに対応する文字列をすべて配列に格納するものとする(順不同.

mod

Modifierkeyの押し込み状態を表現する.Ctrl:0,Shift:1,Alt:2,とした.

dur

Gamepadの場合に同じ


現実のkeyboardには上記以外にも多数のキーが存在する.しかしこれらを含めて統一的に扱う標準仕様は存在しておらず,OS,ロケーション,機器,入力を受け取るアプリケーション(例:ウェブブラウザ)によりまちまちである[*]

https://d-toybox.com/studio/lib/what_is_keyCode.html

http://var.blog.jp/archives/70803410.html

よって現状のGameControllerizerでは抽象化の範囲を,一般的にゲームコントロールに使われるであろうキーのみに限定したなお,GC-DSL自体は,押し込まれたキーを文字列で表現する形式をとっているため,これ以外のキーを判定に加えた場合にも言語仕様そのものを変更する必要はない



{“key”:[“a”], “mod”:[], “dur”:2}

”a”をタイプ

{“key”:[“a”], “mod”:[1], “dur”:2}

“A”をタイプ(”Shift”+”a”の組み合わせ).”mod”:[1] はMofdifierkeyの1番(=”Shift”)を表す