キーボードイベントの処理再び
画面が描画できたら、残るはプレイヤーからのキーボードイベントを処理することと、アクションに応じて適切な効果音を鳴らすだけです。最初にキーボードイベントの処理を見ていきます。
と言っても、ゲーム全体で共有しているキーボードイベント処理については前編で見た通り、KeyboardDownイベントに記述しました。ここで見ていくのは、前編で「不可能である」とお話ししたキーボードイベントの連続処理についてです。
//== このシーン特有のキーボード処理
//== 引数:キーボードイベント
public override void KeyProcess(KeyboardEventArgs e)
{
base.KeyProcess(e);
//-- プレイヤーパドルの移動処理
if (Keyboard.IsKeyPressed(Key.LeftArrow))
{
parent.player.Move(-mv,parent);
}
else if (Keyboard.IsKeyPressed(Key.RightArrow))
{
parent.player.Move(mv,parent);
}
}
プログラムリストに示した通り、シーンごとにKeyprocessというキーボードイベントを処理するメソッドを用意し、それをTickイベントごとに呼び出すようにしています(前編のリスト2を参照)。
これによって、Keyprocessイベントは1秒間にFPSで指定した回数呼び出されることになりますので、人間にとっては連続的に処理されているように感じられるのです。
具体的な処理の内容についてですが、IsKeyPressedメソッドを用いて、目的のキーが押されているか否かを確認しています。このメソッドは、引数に指定したキーが押されていればTrue、押されていなければFalseを返すメソッドです。
今回の例ではFPSに30を指定しましたので、1秒間に30回、キーの入力判定が行われていることになります。この時の入力判定に従って、所定のキーが入力されていればプレイヤーのパドルを動かすようコーディングしました。
Keyprocessメソッドを見てしまうと、KeyboardDownイベントに記述した内容も、同じようにしてKeyprocessメソッド内で処理してしまえばいいように感じます。しかし、KeyboardDownイベントには、Keyprocessメソッドとは大きく異なる特徴が一つあります。それが割り込み処理という考え方です。Keyprocessメソッドは、あくまでTickイベントごとに呼び出されるメソッドですから、Tickイベントの枠を超えて活動することはできません。しかし、KeyboardDownイベントは、キーが押された時、他のイベントに割り込んでSDL.NETにイベント発生を知らせてくれます。この割り込みというのが、システム全体で共有するようなキーボード操作についてKeyboardDownイベントを利用する大きな理由です。
効果音を鳴らす
20年ほど前まで、効果音やBGMはゲームのおまけで、なくてもゲームを楽しめると考えられていたようですが、最近では音楽を主体にしたゲームなども登場するなど、これらもゲームの大切な一部として受け入れられているようです。当然、SDL.NETにも音楽を扱うための機能が提供されています。今回のプログラムではBGMこそつけていませんが、ボールが反射したり、シーンが変わるごとに効果音をつけてみました。最後に、その効果音をどのように鳴らしているのか見てみたいと思います。
Sound se; // ミス時に鳴らす効果音
//== コンストラクタ
public SceneMiss()
{
// 効果音ファイルの読み込み
se = new Sound("sound" + Path.DirectorySeparatorChar + "miss.wav");
}
public override void Init(Pon p)
{
base.Init(p);
se.Play(); // 効果音を再生
}
効果音を使うための機能は、Soundクラスとしてカプセル化されています。SoundクラスはSdlDotNet.Audioに属していますので、あらかじめusingしておきます。このクラスの利用法も非常に簡単で、コンストラクタで読み込むファイル名を指定し、Play()メソッドで再生するだけです。
Linux環境での再生に失敗したので今回のサンプルではwav形式の音しか使用していませんが、ドキュメントによればSoundクラスはこれ以外にも、.ogg, .mp3, .mod, .midの各形式に対応しており、これらを普通のwav形式の音声ファイルと同じように扱うことができるので、wav形式の音声ではデータ量が膨大になってしまう多量の音声データを含むゲームを作成するときにも有用であると言えます。
また、今回のサンプルでは、読み込みとPlay()メソッドしか使用していませんが、Soundクラスを用いればVolumeプロパティで簡単に効果音の音量を設定したり、SetPannning()メソッドを用いて左右の聞こえ方を調整したり、サウンドのフェードアウトですら、メソッドを呼ぶだけで手軽に実現することができます。
まとめ
いかがだったでしょうか? 駆け足で解説しましたが、SDL.NETのお手軽さを感じていただけたでしょうか。これだけ手軽なSDL.NETですが、執筆時点では参考にできるリソースが少なく、国内での利用者もほとんどいないようです。本稿をきっかけに、ひとりでも多くの開発者がSDL.NETを利用するようになれば幸いです。
参考資料
記事を書くにあたって、以下の資料を参考にしました。
- SDL.NET付属ドキュメント
- SDL.NET 公式サイト
- MSDN Online
また、効果音素材はザ・マッチメイカァズさんからお借りました。
