情報処理2z(Java version) 課題6:キーボードによるラケット操作 |
移動させるようにしてみよう。
Java ではユーザの入力にはそれぞれ対応のメソッドを使って調べることになります。 キー入力は keyDown, keyUp メソッドがこれに当たります *1。 まずはサンプルプログラムを見て下さい。
import java.awt.*; public class kadai601 extends java.applet.Applet { String s = " "; /* String 型のフィールド変数設定 */ public boolean keyDown(Event e, int key){ /* keyDown メソッド (キー入力開始) */ switch(key){ /* key の値による条件分岐文 switch */ case 'h': /* もし key に 'h' が代入されていたら */ s = "Hello, World! "; break; case 'g': /* もし key に 'g' が代入されていたら */ s = "Good Afternoon!"; break; default: /* それ以外の場合 */ s = " "; break; } repaint(); /* paint メソッド呼び出し */ return true; /* boolean 型メソッドなので、true か false の返り値が必要 */ } public boolean keyUp(Event e, int key){ /* keyUp メソッド (キー入力終了) */ s = " "; repaint(); /* paint メソッド呼び出し */ return true; /* boolean 型メソッドなので、true か false の返り値が必要 */ } public void paint(Graphics g){ g.drawString(s, 60, 100); /* s をアプレットにプリント */ } } |
keyUp, keyDown メソッド共に、 入力されたキーのアスキーコードが第2引数の key に入ります。 よって、ここで使ったような switch や if 文を使って条件分岐を行えば、 それぞれのキー入力に対応できるようになります。
上にも書いたようにキー入力はアスキーコードで対応します。 よって矢印キーのアスキーコードを調べれば良いことになります。 実際 1004 から 1007 までの数字が矢印キーに対応しているのですが、 このままだとちょっと分かりにくいですね。
そこで UP, DOWN, LEFT, RIGHT をそれぞれ 1004 〜 1007 に対応させて、 これらを定数にしてしまいましょう。 C では #define を使うところですが、Java では final 修飾子を使います。
import java.awt.*; public class kadai603 extends java.applet.Applet implements Runnable { Thread th; Image ofscr; Graphics ofscr_g; final int UP = 1004; /* final 修飾子を使うと定数の意味 */ final int DOWN = 1005; final int LEFT = 1006; final int RIGHT = 1007; /* バーで使う変数の宣言 */ int barx, bary, bardy; public void init(){ th = new Thread(this); th.start(); ofscr = createImage(200, 200); ofscr_g = ofscr.getGraphics(); /* バーの初期値の代入 */ ................ } public void paint(Graphics g){ ofscr_g.setColor(Color.white); ofscr_g.fillRect(0, 0, 200, 200); ofscr_g.setColor(Color.black); ofscr_g.drawRect(barx, bary, 10, 40); /* バーの表示 */ g.drawImage(ofscr, 0, 0, null); } public void update(Graphics g){ paint(g); } public boolean keyDown(Event e, int key){ /* 省略(自分で考えよう!) 押されたキーに対応して、bardyを-1,1,0にする。 runメソッドで描画されるので、ここではrepaintは呼ばない。 trueを返す。 */ } public void run(){ /* 省略(自分で考えよう!) 時間調節(sleep)。 baryにbardyを足す。 上下の端まで行ったときの処理。 描画。 */ } public void destroy(){ th.stop(); } } |
矢印キー以外のキーもそれぞれアスキーコードを持っています。 それを調べるには keyDown メソッドの中に次の一文を入れてアプレットビューアで実行してみましょう。
知りたいキーを押すと MS-DOS 画面にそのアスキーコードが表示されます。 あとは final を使って定数化して(しなくても問題はありませんが)使いましょう。
の形のメソッドですが、 その呼ばれるタイミングと x, y の意味を表にしておきます。
メソッドの名前 | タイミング | x, y の意味 |
---|---|---|
mouseDown | マウスのボタンが押されたとき | ボタンが押された座標 |
mouseDrag | マウスのボタンが押されたまま移動したとき | 移動した先の座標 |
mouseEnter | マウスカーソルがアプレットのウィンドウの中に入ったとき | 初めて中に入った座標 |
mouseExit | マウスカーソルがアプレットのウィンドウから出たとき | ウィンドウの外に出た直後の座標 (だから負になることもある) |
mouseMove | マウスカーソルが 1 ドットでも動いたとき | 動いた先の座標 |
mouseUp | マウスのボタンが離されたとき | ボタンが離された位置の座標 |
Java ではユーザの入力にはそれぞれ対応のメソッドを使って調べることになります。 キー入力は processKeyEvent メソッドがこれに当たります *1。 まずはサンプルプログラムを見て下さい。
import java.awt.*; public class kadai601 extends java.applet.Applet { String s = " "; /* String 型のフィールド変数設定 */ public void init(){ this.enableEvents(AWTEvent.KEY_EVENT_MASK);/* おまじない */ this.requestFocus(); } public void processKeyEvent(KeyEvent e){ if (e.getID() == KeyEvent.KEY_PRESSED){ /* キーが押されたら */ switch (e.getKeyCode()){ case KeyEvent.VK_H: /* Hキーの時 */ s = "Hello, world! "; break; case KeyEvent.VK_G: /* Gキーの時 */ s = "Good Afternoon!"; break; default: /* それ以外の時 */ s = " "; break; } } else if (e.getID() == KeyEvent.KEY_RELEASED){ /* キーが離されたら */ s = " "; } repaint(); } public void paint(Graphics g){ g.drawString(s, 60, 100); /* s をアプレットにプリント */ } } |
processKeyEventメソッドで,まずキーに何が起きたのかを判別します.この場合は,キーが押された場合と,離された場合で条件分岐します.さらに押された場合では,switch分を使って,何のキーが押されたかも判別して,それぞれのキー入力に対応できるようになります.
まずサンプルを見てください.
import java.awt.*; public class kadai603 extends java.applet.Applet implements Runnable { Thread th; Image ofscr; Graphics ofscr_g; /* バーで使う変数の宣言 */ int barx, bary; int bardy; public void init(){ this.enableEvents(AWTEvent.KEY_EVENT_MASK); this.requestFocus(); th = new Thread(this); th.start(); ofscr = createImage(200, 200); ofscr_g = ofscr.getGraphics(); /* バーの初期値の代入 */ ................ } public void paint(Graphics g){ ofscr_g.setColor(Color.white); ofscr_g.fillRect(0, 0, 200, 200); ofscr_g.setColor(Color.black); ofscr_g.drawRect(barx, bary, 10, 40); /* バーの表示 */ g.drawImage(ofscr, 0, 0, null); } public void update(Graphics g){ paint(g); } public void processKeyEvent(KeyEvent e){ if (e.getID() == KeyEvent.KEY_PRESSED){ switch (e.getKeyCode()){ case KeyEvent.VK_UP: /* 上矢印キーの時 */ break; case KeyEvent.VK_DOWN: /* 下矢印キーの時 */ break; case KeyEvent.VK_LEFT: /* 左矢印キーの時 */ break; case KeyEvent.VK_RIGHT: /* 右矢印キーの時 */ break; } } } public void run(){ /* 省略(自分で考えよう!) 時間調節(sleep)。 baryにbardyを足す。 上下の端まで行ったときの処理。 描画。 */ } public void destroy(){ th.stop(); } } |
色々なキーの定義は,公開されているJavaのドキュメントを読むと沢山書かれています.
To: report
cc: 自分のログイン名
Subject: 2z6
です。
Subjectを間違えないよう注意しましょう。