JAVAプログラミング講座 宇宙のJAVAさん
- STORY 6 -
こんにちは、クマです。
みゃんちゃんみゃん!!
うしだもー
さて、さっそく現在製作中のパズルゲームの続きを作りましょう!!

はーい!
前回は、裏画面にCGを読みこみ、それを表示するところまで作りました。
今回は読みこんだCGのパネルを、ごじゃごじゃに入れ替えて表示させましょう。
前回のプログラムは、
・CGを読みこむ
・裏画面に作画
・表画面に表示
の順番で処理をしていました。 今回はプログラムを追加して、
・CGを読みこむ
・裏画面に作画
・CGのパネルを入替える
・表画面に表示
のように処理(プログラム)を追加します。
CGの入替えってどうやるんだもー????
copyArea()
命令を使います。 この命令はCGの一部を違う場所にコピーできます。
さっそくCGを入替えるもーー!!!
プログラムするみゃん!!
ちょっと、待ってください・・・ 実は、1つ問題があります・・・・
問題が多いプログラムだもーーー
問題はなんだみゃん????
copyArea()
命令でCGの一部をコピーできるのですが、今回のプログラムはパネルをごじゃごじゃに入替える事ですよね???
たとえば下図で「1のパネル」と「2のパネル」を交換するとします。

「1のパネル」の場所に「2のパネル」を
copyArea() 命令でコピーすると、「1のパネル」の画像が消えてしまいます。
これでは次に「1のパネル」を「2のパネル」の位置にコピーする事は出来ません!!
ほんとだもー!! それなら「1のパネル」の画像を一時退避させるも!!!!!
「1のパネル」の画像を普通に退避させるためには、もう1つ裏画面を用意するか、MemoryImageSource
などの凝った命令を使って、メモリーに退避させねばならないので、かなりプログラムが複雑になってしまいます。
面倒なプログラムはいやだみゃん!!!
私もです。 そこで、次のように解決します。

上図を見てください。
まず裏画面のサイズを ( 480 x 480 )から、( 480 x 560 )に変更します。
そして、「パネル1」を裏画面の使われていない部分(増やした下部分)にコピーします。
次に、「パネル2」を「パネル1」の場所にコピーします。
次に、裏画面の使われていない部分にコピーした「パネル1」を「パネル2」の場所にコピーします。
これで、「パネル1」と「パネル2」を入替える事が出来ます!!
なるほどみゃん!
でも、ふざけた解決法方だもー
くまですから・・・
ではさっそく裏画面のサイズを変更します。
| public void init() { // 初期処理 backimage = createImage( 480, 560 ); bg = backimage.getGraphics(); img = getImage(getDocumentBase(), "image.jpg");
|
次はパネルの入替えプログラムかもーー??
そうですが、入替えるパネルを
ランダム で決定します。
それはなんだみゃ??? それ、機動戦士みゃん???
ランダム
は「いいかげん」って事だもー
たとえばサイコロです。 サイコロとは1から6までの数字が
ランダム で出てくるアイテムです。
なるほどみゃん!! 入替えるパネルを適当に選ぶのみゃん!!
そうです。 JAVAでは
int rd = (int) (6 * Math.random());
という命令で、0から5までのランダムな数字が rd という変数に入ります。
int rd = (int) (100 * Math.random());
とすると、0から99までのランダムな数字が rd という変数に入ります。
なるほどみゃん!!
init()
の bg.drawImage( img, 0, 0, this); の下に次のようにプログラムします。
|
bg.drawImage( img, 0, 0, this);
|
ここでは、x1
はパネル1のX座標、y1 はパネル1のY座標、x2
はパネル2のX座標、y2 はパネル2のY座標です。
次にパネル入替えです。
copyArea() は、 copyArea( 移動元X, 移動元Y, サイズX, サイズY, 移動先X, 移動先Y ) という風に使います。
さっそくパネルを入替えるもー!!! 1つのパネルの大きさは
( 80 x 80 )なので、
bg.copyArea( x1*80, y2*80, 80, 80, x2*80, y2*80 );
だもーーーー!!!
ところが再び問題があります。 問題は
copyArea() です。
実は恐ろしい事に、 copyArea() の移動先の指定は「相対座標」なんです!
もーーーーーーー!!!!!!!!!!!
??? 相対座標だと困るみゃん???
めんどくさいもー!!! ひどいもー!!
たとえば、( 122, 57 )の画像を
( 33, 29 ) にコピーするとしますね(下図参照)。
コピーする画像のサイズは ( 80, 50 )とします。

移動先の指定が「絶対座標」の場合は、
copyArea( 122, 57, 80, 50, 33, 29);
となります。
ところが「相対座標」の場合は、移動元の座標からの移動量で表すので、
copyArea( 122, 57, 80, 50, -89, -28);
となります。
わかりずらい、もぉ〜!!!
未確認情報ですが、爆裂健氏は
copyArea() のあまりの使いづらさに怒り狂って、
「スーパーサイヤ人」に変身したらしいです。
きっと、純粋な怒りだったんだもー
「相対座標」はあまりに使いづらいので、新たに関数を用意して、絶対座標で指定できるようにします。
それがいいもー!!
では、一番下に関数を追加します。 関数名は
kcpoy です。
| } //
mouseDrag() |
この関数は、
kcpoy( 移動元パネルのX位置 , 移動元パネルのY位置 , 移動先パネルのX位置 , 移動先パネルのY位置 );
という風にして、画像のコピーを指定します。
これで、楽になるもー
ではパネルをコピーしましょう。 もちろん
kcpoy() を使います!
先ほどの init() でのランダムのプログラムの下にコピー命令を足します。
|
x1 = (int) (6 * Math.random()); y1 = (int) (6 * Math.random()); x2 = (int) (6 * Math.random()); y2 = (int) (6 * Math.random()); kcopy( x1, y1, 0, 6); kcopy( x2, y2, x1, y1); kcopy( 0, 6, x2, y2); |
先ほど説明しましたが、もう一度手順を説明します。
kcopy( x1, y1, 0, 6);
「パネル1」をパネル座標( 0, 6 ) (裏画面下)にコピー
kcopy( x2, y2, x1, y1);
「パネル2」を「パネル1」の場所にコピー
kcopy( 0, 6, x2, y2);
パネル座標( 0, 6 )の「パネル1」を「パネル2」の場所にコピー
という具合にパネルを入替えています。
では、さっそくコンパイルしてみてください!!
javac
KumaPuzzle.java(リターン)
appletviewer sample.html(リターン)
あ! パネルが1枚、入れ替わってるみゃ!!!

ほんとだもー!! でもこれだとパズルゲームにならないも・・
わかっています。
そこで、プログラムを追加して、ほんの 300回ほどパネルを入替えましょう!!
init()
のランダムの部分とパネル移動の部分を、for 文で囲みます。
for 文で300回ほどループさせましょう!!
bg.drawImage( img, 0, 0, this); int r, x1, y1, x2, y2; for ( r=0; r<300 ; r++) { x1 = (int) (6 * Math.random()); y1 = (int) (6 * Math.random()); x2 = (int) (6 * Math.random()); y2 = (int) (6 * Math.random()); kcopy( x1, y1, 0, 6); kcopy( x2, y2, x1, y1); kcopy( 0, 6, x2, y2); } |
これで、パネル入替えのプログラムは終了です。
コンパイルしてみてください!!!
なんか、パズルゲームみたいになってきたもー。
今回の講座はこれで終了。 次回もまたゲームの続きを作っていきます。

はーい、くま先生。
- 続く -
![]()