このページはヒントです。各自が考えなければ いけないところは ■■■■ となっています。 このまま入力しても動かないので注意して下さい。
もちろんimport java.awt.*; import java.applet.*; public class iyaiya extends Applet implements Runnable{ Button gohan_bottun; Image img[] = new Image[2];
としておいて、init() method のところで、Image img[];
のようにしてもよいです。Image[2] の 2 は、画像が 2 枚(0 番めの絵と 1 番めの絵、2 枚の絵を連続的に提示することで「イヤイヤ」を表現するわけ です)であることを表しています。public void init() { img[] = new Image[2];
課題では button の位置などの指定がありませんから、 とりあえず button を作っておきましょう。 作る場所はこの applet が最初に起動した直後に実行される init() method がよいです。作るための命令は GUI の章を参考に して下さい。作ったら add するのを忘れずに。
public void init() { gohan_button = new ■■■■; add(gohan_button);
MediaTracker 用に変数が用意できたので、実際の画像を読み込んでおきます。import java.awt.*; import java.applet.*; public class iyaiya extends Applet implements Runnable{ Button gohan_button; Image img[] = new Image[2]; MediaTracker ■■■■; public void init() { gohan_button = new ■■■■; add(gohan_button); ■■■■ = new MediaTracker(■■■■);
本当は 2 枚しかない画像なので、 for 〜 loop を使っても使わなくてもどちらでもかまいません。for ( int i=0; i<2; i++ ){ img[i] = getImage(getDocumentBase(), "iyaiya" + i + ".gif"); ■■■■.addImage(img[i], 0); try { ■■■■.waitForID(0); } catch (InterruptedException e) { return; } }
Flag と呼ばれる boolean 型の object 変数を用意することで、
この変数が「真」であれば、ずっと同じ絵を表示し続け、
「偽」になった時に、あらかじめ決められた回数だけ、別の絵
と交替させるようにするわけです。
仮に、この object 変数を gokigen と名付けることにすると…
変数 gokigen が true ならば、止まっている。となるわけです。最初は動かない(すなわちイヤイヤをしていない)わけだから、 この変数 gokigen は true に初期化しておくのがよいです。
変数 gokigen が false な間だけイヤイヤをする
さらに、何回「イヤイヤ」して首を振るかですが、実際には iyaiya0.gif と iyaiya1.gif を何回交替させるか、という問題になります。 首を振る回数を覚えておく int 型の変数 turned を導入しておく必要があり そうです。
もうひとつ imgID という int 型の変数も導入します。
iyaiya0.gif なら 0
iyaiya1.gif なら 1
を値として保持する変数だとしましょう。この変数を導入するメリットは
paint() method が極端に簡単になるからです。
以上で必要な object 変数が出そろいました。program の冒頭部分を まとめておくと以下のようになるでしょう。public void paint(Graphics g) { g.drawImage(■■■■, 10, 30, this); }
import java.awt.*; import java.applet.*; public class iyaiya extends Applet implements Runnable { Thread th; Button gohan_button; Image img[] = new Image[2]; MediaTracker ■■■■; boolean gokigen = ■■■■; int imgID = 0; int turned = 0;
public boolean action(Event e, Object arg) { if (e.target instanceof ■■■■) { String str = ((Button)e.target).getLabel(); if ("gohan".equals(■■■■) ) { gokigen = ■■■■; } return true; } else return false; }
のようになっていたわけですが、 (thread をよく調べておくように!) 変数 gokigen の状態によって動作を変えるために if 文が必要になります。public void run() { while (true) { try { Thread.sleep(1000); } catch (InterruptedException e) { break; } repaint(); } }
最初の if 文の条件節内には、もし「ご機嫌斜め」だったら、 という意味の if 文になります。public void run() { while (true) { if (■■■■) { if (■■■■) { turned = 0; gokigen = ■■■■; } /* この部分には… もし imgID が 0 だったら imgID を 1 にし、 もし imgID が 1 だったら imgID を 0 にする、 ような記述が必要です。うまく書くとたった一行です */ repaint(); } try { Thread.sleep(1000); } catch (InterruptedException e) { break; } }
次の if 文の条件節は、 続く{} の中で、イヤイヤをした回数 turned を 0 にしている ことから、 もし「イヤイヤを決められた回数だけ行った」のであれば、 という意味になりるようにすればよいのです。 ただし、同時に回数を一だけ増加させてしまうには、 どうすればよかったかを考えてください。 {} 内では、イヤイヤするのをやめるために gokigen をよくしておいてください。
には、いくつの method が必要なのかを書き出しておきます。public class iyaiya extends Applet implements Runnable {
という html file も必要です。<applet code=iyaiya.class width=150 height=120> </applet>
独力で作ろうとせず、このヒントを最後まで読んでしまった
というように、乱数用の package を import しておく必要があります。 それから、import java.util.Random;
のように初期化してから使います。具体的に1個の乱数をとりだす 方法については、自分で調べましょう。Random rnd = new Random();
この課題は、出席率や課題提出率に不安がある人を救済するためのものです。