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です。
背景0 back00.gif
背景1 back01.gif
背景2 back02.gif
背景3 back03.gif
背景4 back04.gif
背景5 back05.gif
キャラクタ1 kuma01.gif
キャラクタ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[][]](cg/st201_2.gif)
その左上の ( 9 x 9 )の部分(赤の四角)を画面に表示しようと思います。
この絵の場合は、画面に表示されるマップの左上は 0
番なので「平地」です。
その右側も「平地」で、その右が「木」です。
左上の部分だけ考えると、実際に表示される画像はこのようになります。
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
あくまでこれは例です。 木や山の配置は
ランダム
で作られるので、どのようなマップが表示されるか誰にもわかりません。
では、画像表示させましょう。 画像表示のプログラムはどこに書きますか???
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() |
わーい! RPGゲームみたいみゃん!!
まだ見掛け倒しです。 キャラを動かすことはできません。
これじゃ、あそべないも〜。
残念ながら、今回はこれでおしまいです。
次回は、キャラをマップ上で動かして見ましょう。
ではみなさん、さようなら。

クマ先生、さようなら!
- 第2話につづく -
![]()