JAVAプログラミング講座 宇宙のJAVAさん
- STORY 5 -
では、宇宙(そら)のJAVAさんをはじめます!!
みゃみゃみゃ・・・
もーもーもーもーもー
前回の「お絵かきアプレット」、覚えてますか??
暇だったので少し手を加えてみました。
みゃ???
円が作画されるのではなく、線が作画されるようにしました。
さっそくこれを動かしてください。![]()
![]()
![]()
もちろん、ダブルバッファリング(裏画面)を使っています。
やったもー!!
このプログラムは説明しませんが、
ソースプログラムに多数コメントを書いたので、それを参考にしてください。
この boolean っていう型の宣言は、なんだも????
boolean は、真偽型の宣言です。
真偽型と言うのはスイッチのような変数で、真(true)、偽(false)
の2つの状態しかありません。
このプログラム中のboolean変数 isDown は、マウスボタンが押されているときは
真(true)、離されているときは 偽(false)
となっています。
-STORY1-
の MousePrint.java ではフラグに flag という名の int型
を使用しましたが、0か1かで判別するための変数でしたので、本当は
boolean型 の方が良いのです。intでも問題無いですが・・・
なるほども〜
このプログラムは良く見ると
paint() 以外の場所で作画しています。
ほんとだみゃ!!
ダブルバッファリングを利用した場合は
paint() 以外の場所で作画しても、再作画時に画面が消える事がありません。
便利だみゃ!!
さて、今回は 夢の
ゲーム製作 に挑戦しましょう!!!!
ついにきたにゃ!!!
やったもー
どういうゲームを作ろうか、いろいろ考えましたが・・・
今回は「パズルゲーム」を作ろうと思います。
パズルみゃーか?!!!
最初にゲームの完成予想図を考えます。

はーい!
バラバラになったパネルを交換して、画像を完成させるパズルゲームを作ります。

こんな感じです(上図参照)。
大体のゲームのイメージが出来たら、次は具体的に考えます。
最初にCGの画面サイズですが、これは 480 x 480 にしましょう。
次にパネルサイズですが、全体画面を
横6分割、縦6分割にしましょう。
1つのパネルのサイズは 80 x 80 になります。
ゲーム製作は難しそうだみゃぁ〜
ゲームの名前は何にするみゃん???
ゲーム名はさしあたり
「 クマ・ザ・グレート CGパズル(仮名) 」
にしましょう。
もぉ〜 ナイス!!
では、いよいよ作りはじめましょう。
さいしょに、JAVA
Applet 雛形 のファイル名を、KumaPuzzle.java にします。
ここらへんの手順は、もう覚えましたね・・・
おぼえたみゃ! 次に
Applet名をファイル名と同じにするみゃあ!!
| //
=============================================================== public class KumaPuzzle extends Applet { |
次にアプレットを読みこむ
html ファイル (sample.html) を編集するみゃ!!
そのとおりです。 今回は画面サイズも変更します。
| <APPLET CODE="KumaPuzzle.class"
WIDTH=480 HEIGHT=480> </APPLET> |
ではさっそく作っていきましょう。
(1) CGを読みこむ
CGを入れるクラス名は何でしたか???
Image
クラスだもー。
そうです。 さっそく
グローバル変数 で、 Image変数を宣言しましょう。
ついでにダブルバッファリングも使うので、それも宣言しておきましょう。
| // グローバル変数 Image img; Graphics bg; Image backimage; |
さて、ここでパズルゲームに使う
( 480 x 480 )の画像が必要になります。
JAVA で利用できる画像フォーマットは、JPEG と GIF
ですので、このどちらかの画像を用意してください。
当然、みんな妖しいパズルゲームを求めてるみゃ!!
ロリロリいやぁ〜んな 女の猫(こ)の画像を用意するみゃ!!!!
それだもー!!!
インターネットのアングラサイトから GET してきた、女の牛(こ)の写真
をゲームに使うもーーー!!
・・・・・(-_-;)
それは、良い考えなんですが・・・
あぶない写真や画像を載せると、この 宇宙のJAVAさん
コーナー
が、プロバイダから締め出しをくらってしまいますので、今回は あたりさわりの無い画像
を使ってパズルゲームを製作しましょう!!!
残念みゃ〜。
まったくも〜。 自分のホームページに置くときは、ナイスCG用意するも〜〜。
では、裏画面に画像を読みこんで、それを表示させる事にしましょう。
init()
でメモリー上に裏画面を生成します。 では、みゃあちゃん覚えてますか??
覚えてるみゃ!! こうだみゃ!! 裏画面の画面サイズは(
480 x 480 )みゃ!!
| public void init() { // 初期処理 backimage = createImage( 480, 480 ); bg = backimage.getGraphics(); } // init() |
そのとおりです。 では牛君、init()
で画像を読みこみ、裏画面に作画してみましょう。
読みこむ画像のファイル名は「image.jpg」です。
裏画面 bg
に画像をロードするもー。
画像を読みこむ命令は「getImage()」。 画像を画面に作画する命令は「drawImage()
」だもー。
こうだもー。
| public void init() { // 初期処理 backimage = createImage( 480, 480 ); bg = backimage.getGraphics(); img = getImage(getDocumentBase(), "image.jpg"); bg.drawImage( img, 0, 0, this); } // init() |
次に paint()
の最後で裏画面を表画面にコピーします。
これは、ダブルバッファリングでは必ず必要な命令です。
| public void paint(Graphics g) { //
作画処理 g.drawImage( backimage, 0, 0, null ); } // paint() |
これで、
1.起動時に init() で画像がロードされ、裏画面に作画。
2.paint() で裏画面が表画面にコピーされる。 画面再表示の場合は paint() が実行され、再び表示される。
と、うまく行く筈ですが、1つ問題があります!!!!!!
コンパイルして実行したけど、CGが表示されないみゃ!!!!!!!
失敗みゃ!!!!!!!
ほんとだ! 表示されないもー!!
その通りです。 画像は表示されません。
問題の部分は init() の img =
getImage(getDocumentBase(), "image.jpg"); です。
getImage() は、非同期で動きます。 簡単に言うと、「CGを読みこみつつ、次の処理を行います」。
そこで、困った事がおきます。
img = getImage(getDocumentBase(),
"image.jpg"); で画像が読みきらないうちに、
bg.drawImage( img, 0, 0, this);
が処理され、裏画面に読みきらないままの画像が作画されてしまいます。
これが、このプログラムで画像が表示されない原因です。
どうするんも????
プログラムを追加して、画像が読み終わるまで、次の処理を待ってもらいます。
init() に次のプログラムを追加してください!!
| public void init() { // 初期処理 backimage = createImage( 480, 480 ); bg = backimage.getGraphics(); img = getImage(getDocumentBase(), "image.jpg"); MediaTracker mt = new MediaTracker(this); mt.addImage( img, 0); try { mt.waitForAll(); } catch (Exception e) { System.out.println("ERROR!!"); } bg.drawImage( img, 0, 0, this); } // init() |
MediaTracker という命令をつかって、CGを読み終わるまで次の処理を行わないようにします。
ピンク色のプログラムを記述すると、img という画像(Imageクラス)が読み終わるまで、プログラムに足止めをかけます。
も???? try って命令は何だも〜?
はじめてみるみゃん!!!
なかなか目の付け所が良いですね。
try - catch は、「ひょっとしたら動作しないかもしれない命令に記述する物」です。
例として、
try { A; } catch (Exception e) { B; }
の場合は、A; の命令を実行してもしエラーが出たら B; の命令を実行します。
今回のプログラム
try {
mt.waitForAll();
} catch (Exception e) {
System.out.println("ERROR!!"); }
では、
mt.waitForAll(); を実行して、もしエラーが出れば、System.out.println("ERROR!!"); を実行するんです.
ちなみに System.out.println("ERROR!!"); は、JAVAコンソールに ERROR!! という文字を出力(表示)する命令です。
そんな訳で当然 mt.waitForAll(); は try - catch の必要な命令の1つです。
どの命令が try -
catch の必要な命令か、わからないもー。
全部覚えるのかも〜???
覚える必要はありません。
コンパイルをした時に、「Exception 何とかエラー」というエラーが出たら、 try - catch が必要な命令なので、 try - catch で括ります。 それだけです・・・
とっても、いいかげんだも〜
くまですから・・・・・
では完成ですので、コンパイルして動作させてください!!
裏画面を使ったCG表示、成功だもー!!
では、今回はこれでおしまい。 次回はパズルゲームの続きを作りましょう!!
ではみなさん、さようなら!

もー! (みゃん!)
- 続く -
![]()