JAVAプログラミング講座 宇宙のJAVAさん 第2部

- 第1話 くまさん、大地に立つ -


<これまでのあらすじ>

突如、2機のJAVAがサイド7に侵入、破壊活動をはじめる。
パズルゲーム完成以降なりを潜めていたJAVAがついに動き出した。
宇宙世紀0091、宇宙の鼓動は新化する。


ミャンちゃん JAVAの進入を許したみゃあか!!

うし君 もぉ〜だめもぉ〜

 

豚さん 大変だ! やつらが!

豚さん 、つららららららら・・・・・・・・

 

 

ひでぶ ひでぶ!

うし君 もぉ〜! 大変!!

ミャンちゃん 冬眠中のクマ先生を起こすみゃん!!

うし君 いそぐも〜!!

 

くま先生 ZZZ 素粒子Z0

ミャンちゃん クマ先生!! 起きるみゃん!!

うし君 だめだも〜。 冬眠システムをシャットダウンするも〜

ミャンちゃん どうやるみゃん???

うし君 そこいら辺に、マニュアルがあるはずもー。

ミャンちゃん えーと・・・ 「冬眠システム 基本マニュアル」、これみゃん!!

うし君 も〜、はやくシャットダウンの項目を読むも〜

ミャンちゃん えーと・・・  基本動作はコンピュータがやってくれるのみゃん・・・

ミャンちゃん すごい、5倍以上のエネルギーゲインがあるみゃん!!

ミャンちゃん やってみるみゃん。

(ピピピ・・・)

(ぷしゅ〜)

 

くま先生 おはようございます、みなさん!!

くま先生 非常にギャグのネタがわかりずらかったですが、とにかく目覚めました!!

くま先生 早速、JAVA講座 第2部 をはじめます!!

うし君ミャンちゃん はーい!

 



くま先生 さて、第2部ではロールプレイングゲームみたいに「キャラクタがマップ上をうろうろできるアプレット」を作っていこうと思います。

くま先生 その昔、爆裂健が「 Bakuretu Online 」という未完成のふざけたアプレットをホームページに乗せたら、数人から感想や質問メールが来たので、気を良くして第2部スタートです。

ミャンちゃん ついにRPGみゃん!!

くま先生 さて、さっそくゲーム画面の全体イメージを考えましょう。

 

こんなかんじ

 

くま先生 こんな感じになります。 山や木などの背景画像を全体に描き、中央にキャラクタを描きます。
キャラは絶えず中央で、後ろの背景が移動して歩くようにします。

うし君 ファミコン時代のRPGを思い出すも〜

ミャンちゃん 「消えたプリンセス」だみゃん!!

くま先生 1つの背景画像の大きさは ( 40 x 40 ) にしましょう。
これを縦9つ、横9つ並べて背景にします。

ミャンちゃん つまり、ゲーム画面は ( 360 x 360 ) になるみゃん???

くま先生 そうです。 40 ドットの画像が9つ並びますから・・・

くま先生 じゃ全体イメージが見えたところで具体的に作っていきましょう。
今回のアプレットはRPG風のマップを表示するので「 MapPaint 」という名前にします。
まずは何をしますか? みゃあちゃん?

ミャンちゃん えーと・・・ なんだっけ??? JAVAプログラムは久しぶりなんで忘れたみゃん・・・

うし君 も〜 しっかりして欲しいも〜。 雛形JAVAソースのファイル名をアプレット名に変えるも〜
そして、ソースのアプレット名をへんこうするも〜

くま先生 そうです。 ウシ君! では、やってみてください。

うし君 MapPaint.java にリネイム(名前の変更)して・・・・
MapPaint.java のアプレット名を MapPaint にかえるも〜

// ===============================================================

public class MapPaint extends Applet {

くま先生 そうですね。 あとこのアプレットを動かすための html ファイルも編集してください。
アプレットの全体サイズは 360 x 360 の予定なので、それも変更しておきます。
sample.html を開き、編集します。

<APPLET CODE="MapPaint.class" WIDTH=360 HEIGHT=360>
</APPLET>

くま先生 おもいだしましたか? みゃあちゃん?

ミャンちゃん そうだったみゃん!

くま先生 さて、プログラムをする前に、マップなどの画像が必要ですね。

うし君 背景画像とキャラクタ画像が、も〜ひつよう。

くま先生 では早速描きます。 タブレットを持てい!!!!

ミャンちゃん はは! ここに!!

くま先生 (カリカリカリ・・・)

 

くま先生 完成しました。 とりあえず背景は「背景0」から「背景5」までの6枚です。
キャラクタは簡単なアニメーション(?)をさせるため、2枚用意しました。
画面のサイズはすべて ( 40 x 40 )です。 キャラクタは透明GIFです。

      back00.gif (266 バイト)  背景0  back00.gif
      back01.gif (494 バイト)  背景1  back01.gif
      back02.gif (1023 バイト)  背景2  back02.gif
      back03.gif (650 バイト)  背景3  back03.gif
      back04.gif (343 バイト)  背景4  back04.gif
      back05.gif (870 バイト)  背景5  back05.gif

      kuma01.gif (1437 バイト)  キャラクタ1  kuma01.gif
      kuma02.gif (1417 バイト)  キャラクタ2  kuma02.gif

 

ミャンちゃん ゲームらしくなってきたみゃん・・・

くま先生 さて、いよいよプログラムです。 今回の第1話では、マップを表示させます。
山や木の配置はランダムで行います。 プログラムの流れは、次のようになります。


1.「マップ画像」や「キャラ画像」ファイルを読み込む

2.山や木などのマップ配置をランダムで作る

3.画面に「マップ配置」あわせて、山や木の画像を表示する。

 

くま先生 では、まず最初に画像を読み込みます。
これはどこに記述すると良いですか??

ミャンちゃん もちろん init( ) みゃん!

くま先生 そうです。 では早速プログラムを作りましょう。
まずは使う画像データ変数を、 グローバル変数 で宣言しましょう。

    // グローバル変数
   
    Image haikei[];
    Image player1, player2;

    int map[][];

 

くま先生 画像データなので Imege で宣言します。
haikei[] というのは、背景画像を入れておく変数です。
キャラ画像はそれぞれ、player1 player2 という変数に入れます。

うし君 haikei[] のカッコはなんだも????

くま先生 これは配列です。 背景画像はたくさんあるので、配列に収納することにします。
同様に マップ配置 も int 型の配列に入れるため、int map[][] と宣言します

うし君 なるほど。C言語といっしょだも〜。

くま先生 そうです。 しかし、C言語と違ってJAVAはポインタがないので、ポインタの配列はつくれませんよ・・・

くま先生 では変数は宣言したので実際に init() で画像を読み込みます。
しかしその前に、配列の大きさの宣言をします。

くま先生 グローバル宣言で haikei[] という変数を作りましたが、これには大きさがありません。
そこで、 init() で配列の大きさを決めます。

    public void init() { // 初期処理
       
       haikei = new Image[6];

くま先生 このように宣言すると、6個の haikei変数 が使えるようになります。
つまり、haikei[0] から haikei[5] までの変数が使用可能になります。
haikei[0] には背景0の画像haikei[1]には背景1の画像・・・という具合に画像を変数に入れることにします。

    public void init() { // 初期処理
       
        haikei = new Image[6];
       
        haikei[0] = getImage(getDocumentBase(), "back00.gif");
        haikei[1] = getImage(getDocumentBase(), "back01.gif");
        haikei[2] = getImage(getDocumentBase(), "back02.gif");
        haikei[3] = getImage(getDocumentBase(), "back03.gif");
        haikei[4] = getImage(getDocumentBase(), "back04.gif");
        haikei[5] = getImage(getDocumentBase(), "back05.gif");
        player1  = getImage(getDocumentBase(), "kuma01.gif");
        player2  = getImage(getDocumentBase(), "kuma02.gif");
       

くま先生 とうぜんキャラ画像の2つも、player1 player2 という変数に入れます。

ミャンちゃん じゃもしも背景が100個あったら、haikei = new Image[100]; と宣言すれば良いみゃん?

くま先生 そうです。 もしそうすれば haikei[0]〜haikei[99] の100個の変数が使用できます。

くま先生 次に「マップ配置」をランダムで作ります。
マップ配置の変数 map[][] はカッコが2つありますので、2次元配列といわれる配列です。
RPGのマップは X Y がある2次元のフィールドなので、2次元配列を使います。

くま先生 今回のゲーム(?)のマップのサイズは 300 x 300 にしましょう。
これでキャラクターは、300 x 300 のフィールドを自由にうろうろすることができます。
では、map[][] も heikei[] と同様に大きさの宣言です。

    public void init() { // 初期処理
       
        haikei = new Image[6];
       
        haikei[0] = getImage(getDocumentBase(), "back00.gif");
        haikei[1] = getImage(getDocumentBase(), "back01.gif");
        haikei[2] = getImage(getDocumentBase(), "back02.gif");
        haikei[3] = getImage(getDocumentBase(), "back03.gif");
        haikei[4] = getImage(getDocumentBase(), "back04.gif");
        haikei[5] = getImage(getDocumentBase(), "back05.gif");
        player1 = getImage(getDocumentBase(), "kuma01.gif");
        player2 = getImage(getDocumentBase(), "kuma02.gif");
       
        map = new int[300][300];

くま先生 これで map[][] は、 map[0][0] から map[299][299] までの 90000個の変数を持ちました。
この「マップ配置」に ランダムでデータをおいていきます。
ここでおいていく値は、数字です。

その数字がもし 0 でしたら「背景0」の野原、 3 だったら「背景3」の山になるわけです。

くま先生 ではランダムで、map[0][0] から map[299][299] までの 90000個の変数に 0 〜 3 までの数字を入れていきましょう。

ミャンちゃん ?? クマ先生。 背景は 0 から 5 までの6種類あるみゃん。
0 から 3 までの数字で良いみゃんか???

くま先生 背景4 は「海」ですし、背景5は「家」ですからね。
これらが多数画面にあるとちょっと不自然なんですよ。 この2つの背景は後で使うことにします。

ミャンちゃん なるほどみゃん。

くま先生 では、for 文 を使って、map[0][0] から map[299][299] までの 90000個の変数に 0 〜 3 までの数字を入れてきす。

    public void init() { // 初期処理
       
        haikei = new Image[6];
       
        haikei[0] = getImage(getDocumentBase(), "back00.gif");
        haikei[1] = getImage(getDocumentBase(), "back01.gif");
        haikei[2] = getImage(getDocumentBase(), "back02.gif");
        haikei[3] = getImage(getDocumentBase(), "back03.gif");
        haikei[4] = getImage(getDocumentBase(), "back04.gif");
        haikei[5] = getImage(getDocumentBase(), "back05.gif");
        player1 = getImage(getDocumentBase(), "kuma01.gif");
        player2 = getImage(getDocumentBase(), "kuma02.gif");
       
        map = new int[300][300];
      
        for (int yy=0; yy<300; yy++){
            for (int xx=0; xx<300; xx++){
                map[xx][yy] = (int) (4 * Math.random());
            }
        }

       
    } // init()

くま先生 0 〜 3 までのランダムを作り出す命令は、 (int) (4 * Math.random()); です。
覚えてますか??

うし君 覚えてるも〜。 パズルゲームを作る時に、つかったも〜。

くま先生 では次に、画面に「マップ配置」あわせて山や木の画像を表示します。
map[][] には次のように 0 から 3 までの数字が入っています。

map[][]

くま先生 その左上の ( 9 x 9 )の部分(赤の四角)を画面に表示しようと思います。
この絵の場合は、画面に表示されるマップの左上は 0 番なので「平地」です。
その右側も「平地」で、その右が「木」です。
左上の部分だけ考えると、実際に表示される画像はこのようになります。

back00.gif (266 バイト)back00.gif (266 バイト)back02.gif (1023 バイト)back00.gif (266 バイト)
back00.gif (266 バイト)back01.gif (494 バイト)back01.gif (494 バイト)back00.gif (266 バイト)

 

くま先生  あくまでこれは例です。 木や山の配置は ランダム で作られるので、どのようなマップが表示されるか誰にもわかりません。

くま先生  では、画像表示させましょう。 画像表示のプログラムはどこに書きますか???

ミャンちゃん paint( ) みゃん!!

くま先生  そのとおりです。 またも for文を使って、9 x 9 の背景画像を表示させましょう。

    public void paint(Graphics g) { // 作画処理
       
        int no, mx, my;
       
        // 背景を作画
        for ( my=0; my<9; my++) {
            for ( mx=0; mx<9; mx++) {
                no = map[mx][my];
                g.drawImage( haikei[no], mx*40, my*40, this);
            }
        }

       
    } // paint()

ミャンちゃん 結構難しいみゃん・・・

うし君 なるほど。 for 文で mx という変数と my という変数をそれぞれ 0 から 8 まで動かして、
その場所の map[][] の中の数字を拾って、その数字の背景画像をひょうじさせているも〜かぁ・・・

くま先生  そうなんです、ウシ君。 でも、ちょっと難しいですね。
map[mx][my] 3 だったら、表示される画像は haikei[3] になるから、「山」が表示されます。

くま先生 では、仮にマップ画面左上の数字( map[0][0] の値 )が 3 だとします。
no = map[mx][my] と書いてあるので、mx が 0、 my が 0 の瞬間は  map[0][0] 3 となり、
変数 no 3 となります。
次に画像 haikei[no] の作画命令があるので、左上には 背景画像3(山の画像)が表示されるわけです。

うし君 なるほども〜。

くま先生 これで背景の画像は画面に表示されました。
これでOKなんですが、RPG的な気分を出すため中央に「キャラ画像 ( player1 )」を置いてみましょう。

     public void paint(Graphics g) { // 作画処理
       
        int no, mx, my;
       
        for ( my=0; my<9; my++) {
            for ( mx=0; mx<9; mx++) {
                no = map[mx][my];
                g.drawImage( haikei[no], mx*40, my*40, this);
            }
        }
    
        g.drawImage( player1, 4*40, 4*40, this);
       
    } // paint()

くま先生 これで、今回のプログラムは完成です!!! MapPaint.javaMapPaint.classDIR

ミャンちゃん わーい! RPGゲームみたいみゃん!!

くま先生 まだ見掛け倒しです。 キャラを動かすことはできません。

うし君 これじゃ、あそべないも〜。

くま先生 残念ながら、今回はこれでおしまいです。
次回は、キャラをマップ上で動かして見ましょう。
ではみなさん、さようなら。

うし君ミャンちゃん クマ先生、さようなら!

 

 

- 第2話につづく -


戻る