WASM-4には最大4人同時プレイのオンラインマルチプレイヤーゲームを作る機能があります。しかも、この機能はとても簡単に使えるようです。今回のゲームは基本的にはシングルプレイヤーのゲームなのですが、この機能がどんなものなのか、試しに使ってみたいと思います。
ただし、まだ試験的な段階のようで、今後仕様の変更があったり、バグがあったりするかも、とドキュメントには書かれているので注意です。
ネットプレイの有効化
WASM-4で作ったゲームは、特に何の設定もせずにいきなりマルチプレイヤーゲームになります。エンターキーを押してシステムメニューを開き、"Copy Netplay URL"を選択するとクリップボードに新規参加用のURLがコピーされます。あとはこのURLを何らかの方法で相手に送り、ブラウザで開いてもらうだけです。これだけで、ホストとゲストの両方に同じ画面が表示され、ホストの操作が相手のプレイ画面にも反映されているのが確認できるはずです。
しかも、このネットプレイはw4 watch
で起動する開発サーバーでも使うことができます。これはどうやら、その開発中のゲームのバイナリ自体をその場でネットワーク経由で相手に送信し、そのまま相手のデバイスで実行しているようです。なにしろカートリッジは最大でも64キロバイトしかないので、瞬時に相手に共有できてしまうわけです。便利!
ネットプレイでの入力の取り扱い
ネットプレイでは最大4名までが参加でき、それぞれのプレイヤーの入力は単純にゲームパッド1〜ゲームパッド4への入力として扱われます。このため、ネットプレイとはいっても、コーディングとしてはひとつのデバイスに4つゲームパッドを繋いで実行する場合とまったく同じで、ゲームパッド1〜ゲームパッド4の入力をそれぞれプレイヤーキャラクター1〜プレイヤーキャラクター4への入力としてそのまま処理するだけです。
自身の識別
ただし、現在の私のゲームではホスト側プレイヤーが画面中心に表示されるため、ゲスト側では自分のキャラクターが画面の中心になっていません。これでは自分のキャラクターをうまく操作できないので、自分が何番目のプレイヤーなのかを識別して、それに応じて画面を描画する位置を変える必要があります。
筆者が試している時点では、Rustの定義ファイルにはネットプレイに関する情報が入っているアドレスへのポインタが定義されていませんでした。ネットプレイの情報は0x0020
に入っているので、これを NETPLAY
という変数のポインタとして定義しておきます。
pub const NETPLAY: *const u8 = 0x0020 as *const u8;
ネットプレイが有効になっているかは、この1バイトの下から3ビットめの値でわかるようになっています。
pub fn is_netplay_active() -> bool {
unsafe { *NETPLAY & 0b100 != 0 }
}
そして、このデバイスで実行されているのが何番目のプレイヤーなのかのインデックスが、この下位2ビットに入っています。自分が何番目のプレイヤーなのかは、次のようにすれば調べることができます。
pub fn get_my_player_index() -> u8 {
unsafe {
if is_netplay_active() {
*NETPLAY & 0b011
} else {
0
}
}
}
あとは、このデバイスが何番目のプレイヤーなのかに応じて画面を描画すればOKです。今回私が作っているゲームでは、自分の操作キャラクターが画面の中心に来るように、このプレイヤーのインデックスに応じてカメラの位置だけが変わるようになっています。
ちなみに、現在何人のプレイヤーが接続しているかの情報は直接にはとれないようです。すべてのゲームパッドの入力を監視して、何らかの入力があったらそのプレイヤーが参加しているとみなせばよさそうです。
参考文献
次回予告
次回はアドベントカレンダーでは最終回です。WASM-4が今後どのような方向に開発が進むのか占ってみます。