SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

シンプルなマルチメディアプログラミング向けライブラリ「SDL.NET」

オープンソースのライブラリ「SDL.NET」で始める
ゲームプログラミング ~後編~

シンプルなマルチメディアプログラミング向けライブラリ「SDL.NET」 (2)

キーボードイベントの処理再び

 画面が描画できたら、残るはプレイヤーからのキーボードイベントを処理することと、アクションに応じて適切な効果音を鳴らすだけです。最初にキーボードイベントの処理を見ていきます。

 と言っても、ゲーム全体で共有しているキーボードイベント処理については前編で見た通り、KeyboardDownイベントに記述しました。ここで見ていくのは、前編で「不可能である」とお話ししたキーボードイベントの連続処理についてです。

リスト5
//== このシーン特有のキーボード処理
//== 引数:キーボードイベント
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回、キーの入力判定が行われていることになります。この時の入力判定に従って、所定のキーが入力されていればプレイヤーのパドルを動かすようコーディングしました。

KeyboardDownイベントとKeyprocessメソッドの関係

 Keyprocessメソッドを見てしまうと、KeyboardDownイベントに記述した内容も、同じようにしてKeyprocessメソッド内で処理してしまえばいいように感じます。しかし、KeyboardDownイベントには、Keyprocessメソッドとは大きく異なる特徴が一つあります。それが割り込み処理という考え方です。Keyprocessメソッドは、あくまでTickイベントごとに呼び出されるメソッドですから、Tickイベントの枠を超えて活動することはできません。しかし、KeyboardDownイベントは、キーが押された時、他のイベントに割り込んでSDL.NETにイベント発生を知らせてくれます。この割り込みというのが、システム全体で共有するようなキーボード操作についてKeyboardDownイベントを利用する大きな理由です。

効果音を鳴らす

 20年ほど前まで、効果音やBGMはゲームのおまけで、なくてもゲームを楽しめると考えられていたようですが、最近では音楽を主体にしたゲームなども登場するなど、これらもゲームの大切な一部として受け入れられているようです。当然、SDL.NETにも音楽を扱うための機能が提供されています。今回のプログラムではBGMこそつけていませんが、ボールが反射したり、シーンが変わるごとに効果音をつけてみました。最後に、その効果音をどのように鳴らしているのか見てみたいと思います。

リスト6
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」連載記事一覧
この記事の著者

太田 晃(オオタ アキラ)

 ブログ(http://repse.blogspot.com/)では、coLinux上にMinGWを用いてクロスコンパイル環境を構築し、そのうえでSDLやOpenGLを使ってWindows向けのプログラムを書くとか、海外のソフトウェアを(勝手に)日本語化するとか、Windowsのインデックスサービ...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/3462 2009/02/18 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー