Greenfoot(グリーンフット)を試してみよう(その4)
Greenfoot を(プログラミングを知らない人でも)簡単に始められる手順を説明しています。前回の「Greenfoot(グリーンフット)を試してみよう(その3)」では Greenfoot のワールド上のネズミをキーボードの上下左右を押して動き回れるようにしました。
上下左右で動けるようになるのとこれはこれで感動ですが、何かが足りません。。。まだきっとネズミしか登場人物がいないからです。
そんなわけで今度はネズミがエサを食べられるようにしてみましょう。
ピザをおいてネズミが食べられるようにする
ピザを置こう
「ネズミにはチーズ」というのが一般的ですが、Greenfoot が用意した画像にチーズがなかったので今回はピザを使いましょう。ピザもネズミと同じく登場人物、つまり Actor(アクター)ですので Actor として追加します。
さあ、これでピザが Actor の中に入りましたね。このピザはコンパイルした後、ネズミと同じように Pizza を右クリックして「new Pizza()」を選択することで背景に追加することができます。
もちろんこのピザには何もプログラムを書いていないので Run を押したあとも動きません。次にネズミが食べた時の動きを修正してみます。
ネズミがピザを食べる
ネズミがピザを食べる時の動きをプログラムしてみます。と言っても実際に食べるというのはとても難しいので今回はシンプルに「ネズミがピザに重なった時にピザが消える」ようにしたいと思います。
さあ、またネズミのプログラムです。「Actor」−「Rat」を右クリックして「Open editor」でエディタを出して下さい。
前のプログラムのままであれば act() の中身は次のようになっていますね。
[java] public void act() { if (Greenfoot.isKeyDown(“left”)){ // 左キーが押された時は 180度を向いて移動する setRotation(180); move(4); } if (Greenfoot.isKeyDown(“right”)){ // 右キーが押された時は 0度を向いて移動する setRotation(0); move(4); } if (Greenfoot.isKeyDown(“up”)){ // 上キーが押された時は 270度を向いて移動する setRotation(270); move(4); } if (Greenfoot.isKeyDown(“down”)){ // 下キーが押された時は 90度を向いて移動する setRotation(90); move(4); } } [/java]
上のコードを次のように修正(追加)してみましょう。
[java] public void act() { if (Greenfoot.isKeyDown(“left”)){ // 左キーが押された時は 180度を向いて移動する setRotation(180); move(4); } if (Greenfoot.isKeyDown(“right”)){ // 右キーが押された時は 0度を向いて移動する setRotation(0); move(4); } if (Greenfoot.isKeyDown(“up”)){ // 上キーが押された時は 270度を向いて移動する setRotation(270); move(4); } if (Greenfoot.isKeyDown(“down”)){ // 下キーが押された時は 90度を向いて移動する setRotation(90); move(4); }
// ピザ Actor の箱を作る Actor pizza; // 自分(ネズミ)と接触しているピザを取得する pizza = getOneObjectAtOffset(0, 0, Pizza.class); if (pizza != null){ // (接触している)ピザがあるならば、、、
// ワールドの箱を作る World world; // ワールドを取得する world = getWorld(); // ワールドから(接触している)ピザを削除する world.removeObject(pizza); } } [/java]
修正が終わったら保存・コンパイル・ネズミを背景に追加して今度はピザも追加して Run を実行してみましょう。
上のようなイメージになりましたか?それではネズミをキーボードの上下左右で動かしてピザにぶつけてみましょう。ネズミがピザに当たるとピザが消えてネズミが食べてしまったように見えてくると思います。
それではこのからくりを見て行きましょう。まずは追加したのは次のコードの部分です。
[java] // ピザ Actor の箱を作る Actor pizza; // 自分(ネズミ)と接触しているピザを取得する pizza = getOneObjectAtOffset(0, 0, Pizza.class); if (pizza != null){ // (接触している)ピザがあるならば、、、
// ワールドの箱を作る World world; // ワールドを取得する world = getWorld(); // ワールドから(接触している)ピザを削除する world.removeObject(pizza); } [/java]
2行目の Actor pizza; では Actor の形が入る箱を用意しています。Java でこれは変数といいます。変数はあらかじめ型を決めておけば後で何度でも取り出したり変更したりできる箱を意味します。
この変数は pizza という名前で作っている(宣言と言います)ので後で pizza という名前を使えば何度でも使うことができます。上のコードだけでも 4行目と 5行目と 13行目で登場していますね。
次に 4行目の getOneObjectAtOffset(…) ですがこれも何度か登場した move() や setRotation() 等と同じく Greenfoot が用意している命令(関数)の一つで「自分自身と同じ座標にある特定のクラスを取得する」という意味になります。今回は Pizza.class と Actor が指定してあるので Pizza クラスを取得することになります。この .class や 0 等は今は無視して構いません。
この getOneObjectAtOffset(…) では「自分自身と同じ座標にあるピザを取得する」となっていますが取得したピザはどこに置かれるのでしょうか?それは getOneObjectAtOffset(…) の左側にある pizza に入ります。これは代入と呼ばれ =(イコール)の記号を使います。算数や数学の = と意味が違うので気をつけて下さい。
getOneObjectAttoffset(…) では「自分と同じ座標に…」ですがもちろん同じ座標にピザが無い時もあります。この時には null という空を意味する値が入ります。null は次の 5行目で出ていますね。
5行目では if(もしも〜)で pizza が null かどうかを確認しています。この"!=“は「〜でなければ」を意味します。つまり「ピザが空でなければ〜」if の { } の中を実行することになります。
そして 2行目と同じように 9行目では World の型も変数として宣言し、11行目で getWorld() という関数を使って World を取得しています。この World は Greenfoot のワールドと同じでこのワールドの中で様々な命令を出すことができます。
13行目ではこの world を使ってワールドの中に存在するピザを removeObject(pizza); という関数で消しています。
どうですか?最後は難しいコードが多くなったと思います。このコードは実際には Java のクラスや関数等が分かっていないと理解するのが難しい部分ですのでよく分からなくても問題ありません。今回は Greenfoot に触れてみるのが目的と考えて下さい。
おまけ:ネズミは増殖できる
気づいたかもしれませんが、ネズミはいくらでも増殖できます!
これは「Rat」の「new Rat()」を選択して背景にネズミを何度でも追加することもできますし、もっと簡単に「Rat」や「Pizza」をクリックした後 Shift キーを押したまま背景を何度もクリックするだけでも追加できます。
ピザはたくさん増やして上げてもよいのですがネズミはたくさん増やしてもキーボードを上下左右するとみんな同じように動いてしまいます。これをなんとか個別の動きにするにはもっともっとたくさんの工夫が必要です。
今回はピザを食べるところまでを説明しました。Greenfoot の扱いに慣れてきたでしょうか。
最後に今の時点の Rat のコードを下に掲載しておきます。
[java] import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
/** * Write a description of class Mouse here. * * @author (your name) * @version (a version number or a date) */ public class Mouse extends Actor { /** * Act - do whatever the Mouse wants to do. This method is called whenever * the ‘Act’ or ‘Run’ button gets pressed in the environment. */ public void act() { if (Greenfoot.isKeyDown(“left”)){ // 左キーが押された時は 180度を向いて移動する setRotation(180); move(4); } if (Greenfoot.isKeyDown(“right”)){ // 右キーが押された時は 0度を向いて移動する setRotation(0); move(4); } if (Greenfoot.isKeyDown(“up”)){ // 上キーが押された時は 270度を向いて移動する setRotation(270); move(4); } if (Greenfoot.isKeyDown(“down”)){ // 下キーが押された時は 90度を向いて移動する setRotation(90); move(4); }
// ピザ Actor の箱を作る Actor pizza; // 自分(ネズミ)と接触しているピザを取得する pizza = getOneObjectAtOffset(0, 0, Pizza.class); if (pizza != null){ // (接触している)ピザがあるならば、、、
// ワールドの箱を作る World world; // ワールドを取得する world = getWorld(); // ワールドから(接触している)ピザを削除する world.removeObject(pizza); } } } [/java]