/****************************************************************************** 理科1類 14組 140525E 上野裕也 画面をクリックすると、鼻が飛んでいくプログラムです。 処理が早すぎて見えなかったので、sleep()やfor()で何とか処理を遅らせようと したの ですが、動きが見えなかったので、やむなくタイマーを使いました。 でも、一度で止まってしまいます。 mousePressメソッドのなかでMyTimerTaskオブジェクトを作ればいいと思ったの ですが、引 数の取り方がよくわからなくて。(そもそもそれで解決するという保証もないけ ど。) これに対する対処法を教えてください。 ******************************************************************************/ import java.awt.*; import java.awt.event.*; //タイマーを使うため import java.util.*; //TimerTaskクラスを継承したクラスを作る。 class MyTimerTask extends TimerTask{ Kadai1120 k; MyTimerTask(Kadai1120 ka){ super(); //フレームのオブジェクトをインスタンスとしてを作る。 k = ka; } public void run(){ //鼻を少しずらす。 for(int i = 0;i < 3;i++){ k.xNose[i] = k.xNose[i] - 6; k.yNose[i] = k.yNose[i] - 3; } k.repaint(); //鼻が画面外に出たら、タイマーを終了。この辺に一度しか動かない原因が ありそう。 if(k.xNose[2] < 0){ k.xNose[0] = 170; k.xNose[1] = 210; k.xNose[2] = 215; k.yNose[0] = 185; k.yNose[1] = 205; k.yNose[2] = 195; k.repaint(); cancel(); } } } //Frameクラスを継承する。 class Kadai1120 extends Frame{ //ちらつきをなくすために、updateメソッドをオーバーライド public void update(Graphics g){ paint(g); } //鼻の座標。クラスレベルの変数にしておけば、変数の値を変えてrepaintす れば描画位置が自動的に変わる。 int[] xNose = {170,210,215}; int[] yNose = {185,205,195}; //タイマーイベントの内容を持つオブジェクトの作成。 MyTimerTask tt = new MyTimerTask(this); //コンストラクタ。終了のためのqの入力イベント、後におもしろ画像にする ためのマウスイベントを関連づける。 public Kadai1120(String title){ super(title); //キーイベントを使えるようにします。 addKeyListener(new KeyAdapter(){ public void keyPressed(KeyEvent e){ int key = e.getKeyChar(); //入力がqだったら終了します。 if(key == 'q') System.exit(0); } }); addMouseListener(new MouseAdapter(){ public void mousePressed(MouseEvent e){ //タイマーを作る。この辺にも一度しか動かない原因がありそう。 Timer timer = new Timer(); //タイマー開始。 timer.schedule(tt,0,2); } }); } public static void main(String[] args){ Kadai1120 frame = new Kadai1120("Kadai1120"); //フレームの大きさを縦400横400に指定 frame.setSize(400,400); //見えるようにする。 frame.setVisible(true); } public void paint(Graphics g){ //色をオレンジに変更 g.setColor(Color.orange); //空を塗り潰す。ウインドウの上半分。 g.fillRect(0,0,400,200); //今度は地面。灰色にしよう。 g.setColor(Color.lightGray); //下半分を塗る。 g.fillRect(0,200,400,200); //次は月。黄色。 g.setColor(Color.yellow); //左上に書こう。 g.fillOval(65,65,70,70); //三日月にしよう。 g.setColor(Color.orange); g.fillOval(80,65,70,70); //次は、雪だるま本体。白。 g.setColor(Color.white); //少し右寄りに大きく立っている。 //体の下の部分。 g.fillOval(155,245,150,150); //体の上の部分。 g.fillOval(170,140,120,120); //次に、目を書く。ボタンもついでに書く。 g.setColor(Color.black); //左目。 g.fillOval(195,170,7,15); //右目。 g.fillOval(225,170,7,15); //下ボタン。 g.fillOval(200,300,10,10); //上ボタン。 g.fillOval(205,270,10,10); //次、はな。赤ニンジン。ついでに帽子も。 g.setColor(Color.red); //鼻。 g.fillPolygon(xNose,yNose,3); int[] xHat = {220,270,273,250}; int[] yHat = {146,170,120,110}; //帽子。 g.fillPolygon(xHat,yHat,4); //次は手。 g.setColor(new Color(200,100,50)); int[] xLHand = {270,273,300,330,333,303,315,313,300,304,301,297}; int[] yLHand = {290,293,260,247,245,257,228,227,259,235,235,260}; //左手。 g.fillPolygon(xLHand,yLHand,12); int[] xRHand = {170,172,132,147,144,132,115,113,129,119,117,129}; int[] yRHand = {276,274,230,210,208,228,201,203,230,225,227,232}; //右手。 g.fillPolygon(xRHand,yRHand,12); } }