イベントの分離

マウスイベントの続き。マウスにmouseDownやmouseMoveといったイベントを追加してみる。

using System;
using y4cs.timer;
using y4cs.aux;
using y4cs.draw;
using y4cs.input;

class Sample01
{
  static bool bEnd;

  static void Quit(MouseEventArgs args) {
    // 右ボタンが押されたら終了
    if (args.right)
      bEnd = true;
  }

  [STAThread]
  static void Main(string[] args)
  {
    Screen screen = new Screen();
    screen.beginScreenTest();
    screen.testVideoMode(640,480,0);
    screen.endScreenTest();

    // 60fps
    FpsTimer fpstimer = new FpsTimer();
    fpstimer.setFps(60);

    MouseInput m = new MouseInput();

    // マウスクリックで終了
    m.mouseDown += new MouseDownHandler(Quit);

    while (GameFrame.pollEvent() == 0 && !bEnd)
    {
      // マウスイベントを通知
      m.notify();

      screen.update();
      fpstimer.waitFrame();
    }
  }
}

QuitメソッドでクラスフィールドbEndを変更しているのがあんまりです。では、このQuitをどこに持っていけばいいのだろうか。例えば、GameFrame.Quitというのを用意して、

class Sample01 {

  [STAThread]
  static void Main(string[] args) {
    // 略

    MouseInput m = new MouseInput();

    // マウスクリックで終了
    m.mouseDown += new MouseDownHandler(GameFrame.Quit);

    while (GameFrame.pollEvent() == 0) {
      // マウスイベントを通知
      m.notify();

      screen.update();
      fpstimer.waitFrame();
    }
  }
}

とかすると、一見よさそうに見えます。しかし、GameFrameクラスにMouseEventArgsというマウス丸出しの引数をとるメソッドを持たせるのは好ましくないです。Quitだけならまだ良いですが、マウスクリックでテキストをスキップさせるために描画クラスにMouseEventArgsを・・・とか言い出すとあちこちにマウスイベントが出てくることになってしまいます。となると、マウスやキーボードイベントをいったんコマンドクラスみたいなものに変換すればよいのか? でも、そーするとライブラリの使い方が決まってきて、使う側としては窮屈に感じる気が。この辺はあまり凝らずに基本的なものだけにしておいた方が良いのかしら。さじ加減が難しい・・・