[Next] [Prev] [Back] [Home]

■ UpperHand Gameを作る


ゲームができるようにする

では、マウスのボタンが押されたときの処理を書きましょう。

Applet上でマウスボタンが押されるとイベントが発生し、 mouseDown()というメソッドが呼び出されます。

//-----------------------------------------------------------------------------
//  public boolean mouseDown(Event evt, int x, int y)
//      マウスのボタンが押されたときの処理を行う。
//-----------------------------------------------------------------------------
public boolean mouseDown(Event evt, int x, int y)
{
}

mouseDown()にはイベントの詳細を記録した Eventクラスのインスタンスと、 マウスボタンが押された座標が渡されます。 mouseDown()には返り値があります。 イベントを処理したときはtrue、 処理すべきイベントではなかったときはfalse を返す必要があります。

[警告] JDK1.1からイベントのしくみが大幅に変更されています。 ここで説明しているのは、 JDK1.0.2でのイベント処理ですのでご注意ください。 例えばmouseDown()は、JDK1.1では推奨されないメソッド となっています。
ただし、JDK1.0.2対応の古いブラウザ(Netscape3.0など)は JDK1.1のイベントモデルを処理できませんので、 もうしばらくしてから書き直すことにしようと思っています。

JDK1.0.2でのイベントのしくみ

JDK1.0.2ではイベントが発生すると、まずhandleEvent() というメソッドが呼び出されます。 handleEvent()は発生したイベントのイベントタイプを判定し、 mouseDown()などのイベントタイプごとに定義されたメソッドを 呼び出しているのです。
マウス操作に関連して発生するイベントタイプと 呼び出されるメソッドの対応を以下に示します。

イベントタイプ
呼ばれるメソッド
発生契機
MOUSE_ENTER
mouseEnter()
マウスがApplet内に入ったとき。
MOUSE_EXIT
mouseExit()
マウスがAppletから出たとき。
MOUSE_DOWN
mouseDown()
マウスボタンが押されたとき。
MOUSE_UP
mouseUp()
マウスボタンが離されたとき。
MOUSE_MOVE
mouseMove()
マウスが動かされたとき。
MOUSE_DRAG
mouseDrag()
マウスがドラッグされたとき。

イベントタイプは、Eventクラスのid というインスタンス変数に格納されています。 マウス操作以外にもイベントタイプは定義されていますが、ここでは省略します。

mouseDown()を実装する

では、mouseDown()を実装しましょう。
マウスボタンが押された座標から着手する位置を決めるのですが、 ゲーム盤を真上から見ているので(x, y)座標だけでは位置が特定できません。 例えば、位置12、45、54の描画エリアは完全に一致しています。

位置の番号

そこで考え方を変えて、まず着手可能な手の一覧をもらい、 マウスボタンの押された座標が 着手可能な手の位置の描画エリア内かどうか調べることにしました。

//-----------------------------------------------------------------------------
//  public boolean mouseDown(Event evt, int x, int y)
//      マウスのボタンが押されたときの処理を行う。
//-----------------------------------------------------------------------------
public boolean mouseDown(Event evt, int x, int y)
{
    if (game.isFinish())
    {                           //  ゲームが終了している場合
        game = new UpperHandGame();     //  新しいゲームを始める。
    }
    else
    {
        //  着手可能な手の一覧を取得する。
        int move[] = game.moves();

        //  マウスのボタンが押された座標が、
        //  着手可能な位置の描画エリア内か調べる。
        for (int i = 0; i < move.length; i++)
        {
            int p = move[i];
            if (area[p].inside(x, y))
            {                       //  エリア内の場合
                game.makeMove(p);   //  着手する。
                break;
            }
        }
    }

    repaint();      //  再描画の「きっかけ」をもらう。
    return true;
}

repaint()paint()を呼び出してもらいたいときに実行するメソッドです。

ついでに、マウスがApplet内に入ったときに WebブラウザのステータスバーにAppletの情報を表示する処理を追加しました。

//-----------------------------------------------------------------------------
//  public boolean mouseEnter(Event evt, int x, int y)
//      マウスがApplet内に入ったときの処理を行う。
//-----------------------------------------------------------------------------
public boolean mouseEnter(Event evt, int x, int y)
{
    //  Appletの情報をステータスバーに表示する。
    showStatus(getAppletInfo());
    return true;
}

実際にゲームをやってみると、 玉と玉が重なったときと、玉が置けるようになった位置が見にくかったので、 UpperHandクラスのメソッドpaintBall() を少し書き直しました。詳細はソースコードをご覧ください。 また、デバッグ文も取り除いてあります。


ここまでにできあがったもの

あなたのブラウザはJavaに対応していません。

Javaソースコード (Ver. 1.1a4)



[Next] [Prev] [Back] [Home]
Satoshi Kobayashi (koba@yk.rim.or.jp)