JAVAプログラミング講座 宇宙のJAVAさん 第2部
- 第3話 くまさんに散る -
| くま お茶の間劇場 |
毎度おなじみ、くまです。
・・・
・・
・
くま
です。
さて、講座を始めます。
わーい!!
も〜!!
前回予告したとおり、キャラを海と山にキャラを入れないようにしましょう。
これでキャラが飛び出すことは、にゃくにゃるみゃん!!
さて、具体的な障害物処理ですが・・・ 次のようにします。
(1) キャラを動かす時、キャラの座標を違う変数に保存する。
(2) キャラを動かす。
(3) キャラの座標を確認して、もし障害物の上にいたら、先ほど保存したキャラ座標にキャラ座標を戻してやる。
(4) 再作画。
なるほどみゃあ〜。 障害物に乗り上げたら、1つ前の状態に戻してやるのかみゃあ〜
では、キャラ座標を保存するための変数を定義します。
「グローバル変数」に追加します。
| // グローバル変数 Image haikei[]; Image player1, player2; int cx, cy; int oldcx, oldcy; |
変数名は
oldcx oldcy にします。
次に動いた時の処理をします。 さてウシ君、プログラムは何処に書くでしょう?
キャラの移動の処理は前回
mouseDown() に記述したも〜
mouseDown() についかするも〜
そうです。 では mouseDown()
に記述しましょう。
まず、(1) キャラを動かす時、キャラの座標を違う変数に保存する。 をプログラムします。
| public boolean mouseDown(Event e, int x, int y) { //
マウスダウン int pos; oldcx = cx; oldcy = cy; pos = checkDirection( x, y); |
これで、キャラのX座標の値
cx は oldcx に、キャラのY座標の値 cy は oldcy
に保存(コピー)されました。
前回の第2話ですでに、(2) キャラを動かす。 というプログラムは作っているので、
次に (3) キャラの座標を確認して、もし障害物の上にいたら、先ほど保存したキャラ座標にキャラ座標を戻してやる。 の部分をプログラムします。
| public boolean mouseDown(Event e, int x, int y) { //
マウスダウン int pos; oldcx = cx; oldcy = cy; pos = checkDirection( x, y); if (pos == 1) cy--; if (pos == 3) cy++; if (pos == 2) cx++; if (pos == 4) cx--; if ( map[cx][cy]==3 || map[cx][cy]==4 ) { cx = oldcx; cy = oldcy; } repaint(); return true; } // mouseDown() |
このプログラムでは、移動したキャラの座標の背景番号を調べて、もし3番(山)か4番(海)だったら、キャラ座標を動かす前の状態に戻しています。
で、repaint() で再作画して、おわりです。
これで、山と海には入れなくなりました。
やったも〜 早く動かしてみるも〜
せっかくですから、俺はこの赤い扉を選ぶぜ!
キャラクターに動きをつけて見ましょう。
このために キャラクタを2種類描いた訳ですから・・・
ついに、主人公キャラがアニメーションするのかも!!
たのしみだみゃん!
さて、キャラクタをアニメーションさせるとなると、
「今現在どのキャラクターの画像が表示されているか?」を保存しておく変数が必要です。
今回はキャラクター画像が2週類しかないので、Boolean 型
で宣言します。
Boolean 型? あの
真(true) と 偽(false) の2種類の状態しか保存できない型みゃん??
そうです。 スイッチのように
ON-OFF
しかありませんが、キャラクター画像が2種類しかないので、今回は
Boolean型をつかうと都合が良いのです。
「グローバル変数」で定義します。 変数名は kuma
にします。
| // グローバル変数 Image haikei[]; Image player1, player2; int map[][]; int cx, cy; int oldcx, oldcy; boolean kuma; |
変数 kuma に初期値を代入します。 init()
の最後にプログラムします。
初期値は true false
どちらでもいいのですが、ここでは true
にしておきます。
| cx=50; cy=50; kuma=true; } // init() |
つぎにマウスをクリックする度に、kuma
の true false を入れ替えます。
クリックする度に変数の内容を書き換えるわけですから、mouseDown()
にプログラムします。
| public boolean mouseDown(Event e, int x, int y) { //
マウスダウン int pos; kuma = !kuma; oldcx = cx; oldcy = cy; pos = checkDirection( x, y); |
!kuma
ってなんだみゃん???
!
という記号は、C言語と一緒で「否定」です。
「 !kuma 」というのは、今の変数 kuma
の状態の逆の値です。
この逆の値が変数 kuma に代入されますので、この命令を実行されるたびに変数
kuma の内容は true と false
を交互に繰り返すわけです。
kuma = !kuma
は次の1行に置き換えることもできます。
if ( kuma == true ) kuma = false; else kuma = true;
こっちの方が解りやすいみゃん!
では最後に、キャラクターの表示部分に入ります。
当然 paint( ) にプログラムします。
| public void paint(Graphics g) { // 作画処理 int no, mx, my; for ( my=0; my<9; my++) { for ( mx=0; mx<9; mx++) { no = map[cx-4+mx][cy-4+my]; g.drawImage( haikei[no], mx*40, my*40, this); } } if ( kuma ) g.drawImage( player1, 4*40, 4*40, this); else g.drawImage( player2, 4*40, 4*40, this); } // paint() |
第1話で書いたキャラクター作がプログラムを、上のように変更してください。
なるほども〜。 変数
kuma
の状態に応じて、表示するキャラクター画像を変えているのかも〜
そうです。 kuma
が true なら player1 ( kuma01.gif ) の画像が表示されます。
kuma が false なら player2 ( kuma02.gif )
の画像が表示されます。
お! 山には入れなくなってるも〜
海にも入れないみゃん!!
ちゃんと、主人公のくまさんがアニメーションしてるみゃ!
やったも〜!!
ちょっと質問だも〜。
今回はキャラクター画像が2種類だから良いけど、画像が多い場合はどうするも〜。
その場合はキャラクターの状態を保存する変数に
int 型を使いましょう。
たとえば6枚のキャラクター画像の場合は、変数
kuma を int型で宣言して、画像を player[0]〜player[5] とかに入れて、paint(
) で、
g.drawImage( player[ kuma ], 4*40, 4*40, this);
と表示させましょう。
init( ) で初期宣言して、
kuma = 0;
mouseDown( ) でキャラのアニメーションを変更する場合は、
kuma ++;
if ( kuma>5 ) kuma= 0;
とします。
これで、player[0]
から player[5] までの画像を順番に表示します。
キャラクター画像の向きを変える場合は、どうするみゃん???
Z Z
Z・・・(書くの面倒だな・・・)
ふぅ〜!!
失礼しました。 突然
睡魔 が襲ってきました。
まず、上下左右
各2枚ずつのキャラ画像を用意します。
それを適当な名前の image 変数にいれます。 たとえば、
player_u1 上向きのキャラ画像1
player_u2 上向きのキャラ画像2
player_r1 右向きのキャラ画像1
player_r2 右向きのキャラ画像2
player_d1 下向きのキャラ画像1
player_d2 下向きのキャラ画像2
player_l1 左向きのキャラ画像1
player_l2 左向きのキャラ画像2
としますね〜。 ご丁寧に8枚も画像を描いてぇ〜。
(なんか、説明が嫌そうだみゃん・・・)
状態の関数
kuma を Boolean、向きの状態関数 muki
を int で宣言します。「グローバル変数」で、
init( ) で初期値入力、
muki 変数は例として、上向き=1 右向き=2 下向き=3 左向き=4 とします。
kuma = true;
muki = 3;
mouseDown( ) で状態を変化。
kuma = !kuma;
mouseDown( ) の移動プログラムで、移動した方向を muki に記憶します。
if (pos == 1) { cy--; muki=1;}
if (pos == 3) { cy++; muki=3;}
if (pos == 2) { cx++; muki=2;}
if (pos == 4) { cx--; muki=4;}
paint( ) で状態と向きに合わせた画像を表示します。
if ( muki = 1 )
if ( kuma )
g.drawImage( player_u1,
4*40, 4*40, this);
else
g.drawImage( player_u2,
4*40, 4*40, this);
if ( muki = 2 )
if ( kuma )
g.drawImage( player_r1,
4*40, 4*40, this);
else
g.drawImage( player_r2,
4*40, 4*40, this);
if ( muki = 3 )
if ( kuma )
g.drawImage( player_d1,
4*40, 4*40, this);
else
g.drawImage( player_d2,
4*40, 4*40, this);
if ( muki = 4 )
if ( kuma )
g.drawImage( player_l1,
4*40, 4*40, this);
else
g.drawImage( player_l2,
4*40, 4*40, this);
これで、向きを変えてアニメーションしながら歩きます。
paint( ) の muki
変数だけど、if 文ではなく switch 文使ったほうが良いんじゃないかも〜??
それには理由があります。 私は
swith文があんまり好きではないのです。

なるほど〜
さて次回は、もう少しこのプログラムを改良していきましょう。
さて次回こそ待望のゲスト! 爆裂健さんに、JAVAプログラムを語っていただく予定です。
たのしみだも〜。
では、次回
アトランタでお会いしましょう!
- 第4話につづく -
![]()