第6回.連載でJavaゲーム作っちゃいます弐
ほるえ: キャラが、グレースケールになってますね。
Masa: DAさんの了解がでたからね。もともとこうする気だったよ。
ほるえ: Webで素材公開している人って、本当にいい人多いですね。
Masa: 本当にな。まあ、できるだけゲームの品質をあげるぐらいしか、恩返しはできんはな。

「ポップアップメニューによる各キャラクタへのコマンド指定」

キャラクタグラフィックは、こちらからお借りしています。


デバックソフトの動作
 1)中央のマップの右側に各キャラのステータス表示をつけました。この表示部分をクリックすることで各キャラをマップ画面の中央に持ってくることが出来ます。
 2)中央マップに表示された敵キャラについては、左側にステータス表示が出ます。
 3)選択したキャラの上で右クリックするとポップアップメニューが出ます。
 4)’MOVE’を選択しすると、キャラ周囲の移動可能部分に’□’マークが出ます。
 5)移動したいところをクリックすると、移動します。



サンプルが表示されない場合は、Java環境がインストールされていない可能性があります。
SUNホームページから、J2SE v 1.4.2_07 JRE以上のバージョンをダウンロードしてください。

Masa: 今回はコマンド指定にポップアップメニューを使ってみました。いわゆるRPGやSLGによくあるパターンですので、覚えておくと便利です。
ほるえ: ではさっそくここの部分の解説をします。
Masa: こら、そこはわしの台詞だ。
ほるえ: あ。しまった。

「ポップアップメニューについて」
動作:マウス右クリックで、ポップアップメニューを表示。選択したものにあわせた処理を行います。

手順
 1.ポップアップメニューを作ります。読み出しはActionListenerにより行います。
 2.マウスイベントによりポップアップメニューを表示するタイミングを定義します。
  今回は、キャラ上にマウスポインタがあり、且つ、右クリックが押された場合に表示します。
 3.actionPerformed()でアクションイベントをひろい、コマンド毎に処理をします。
Tips.ポップアップメニューとは
右クリックで表示されるこんなメニューのことをポップアップメニューと言います。

ソース解説(詳細)


public class slg3 extends Applet implements Runnable, MouseListener, MouseMotionListener,ActionListener {
//ポップアップ
PopupMenu popup;
boolean popflag;
マウスリスナ、マウスモーションリスナ、アクションリスナを使用します。

ポップアップメニューを準備します。


//ポップアップメニューを作成する

public void popinit(){
//ポップアップ
MenuItem mi;
setBackground(Color.white);
popup = new PopupMenu("Action");

mi = new MenuItem("Move");
mi.addActionListener(this);
popup.add(mi);

popup.addSeparator();

mi = new MenuItem("Cancel");
mi.addActionListener(this);
popup.add(mi);

add(popup); // add popup menu to applet

enableEvents(AWTEvent.MOUSE_EVENT_MASK);

comnum=-1;
}
ポップアップメニューの構成を定義します。

背景色とポップアップメニューの名称を決めます。


’MOVE’コマンドを定義します。
このコマンドはActionListenerで認識されますので、これを忘れずに入れて下さい。


セパレータラインを引きます。

'Cancel'を定義しています。



ポップアップメニューをアプレットに追加しています。

マウスイベントを可能にしています。

public void processMouseEvent(MouseEvent e) {

 int x = e.getX(); int y = e.getY();
 popflag=false;

int xx
= character[count].getPointX() - 5 + (int) ( (x - ButSize) / Size);
int yy = character[count].getPointY() - 5 + (int) (y / Size);

 if (comnum==-1){
 for (int i = 0; i < 20; i++) {
 if ( (character[i].getPointX() == xx)
      && (character[i].getPointY() == yy)){
      popflag=true;}}
 }

  if ((e.isPopupTrigger())&popflag) {
    popup.show(e.getComponent(), e.getX(), e.getY());
  }
  super.processMouseEvent(e);
}
マウス位置にキャラクタがいるかを判定して、いればポップアップメニューを開く。

マウス位置を検出する


マップの配列に計算しなおす。




コマンド処理中で無ければポップアップメニューを開けるようにする。





右クリックが押されていればポップアップメニューを開く
public void actionPerformed(ActionEvent e){

String command = e.getActionCommand();

if (command.equals("Move")) {
comnum=0;
// perform cut operation
} else if (command.equals("Cancel)) {
comnum = -1;
popflag=false;
}
}
アクションイベントでコマンドを読み取ります。

文字列形式の'command'にgetActionCommand()で読み取ったポップアップメニューのコマンドを読み取りそれぞれ処理します。




Masa: この辺の書き方は、あまり詳しく書いた本が手元に無かったのでWebからの読みかじりです。もう少し効率良く書く方法も有りそうだけどね。まあ、動くしいいか。
ほるえ: 品質、品質。
Masa: ごめんなさい
ほんとに品質って大事ですね。次回も、品質第一でガンバロー

Copyright (C) 錬金術師Masa
新規:2005年08月28日