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 の内容は truefalse を交互に繰り返すわけです。

くま先生 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 ) の画像が表示されます。

くま先生 これで障害物&キャラアニメーション プログラムは完成です! MapPaint.javaMapPaint.classDIR

うし君 お! 山には入れなくなってるも〜

ミャンちゃん 海にも入れないみゃん!!

ミャンちゃん ちゃんと、主人公のくまさんがアニメーションしてるみゃ!

うし君 やったも〜!!

うし君 ちょっと質問だも〜。
今回はキャラクター画像が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枚も画像を描いてぇ〜。

ミャンちゃん (なんか、説明が嫌そうだみゃん・・・) 

くま先生 状態の関数 kumaBoolean、向きの状態関数 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話につづく -


戻る