/* 「オプション課題は笑いが取れる物を目指します(^^;;」って書いたんですけど, 結局サムイものしか作れませんでした(泣) 操作方法: キーボード: n で普通の顔 a で怒った顔 s で悲しい顔 r で再描画 q で終了 マウス: クリックするとアニメーション(もどき)のオン/オフ切り替え なお,雪が降っているので月は出ません(笑) */ import java.util.*; import java.awt.*; import java.awt.event.*; class drawdata extends Frame { // データ格納用クラス int ground[][] = { { 0 , 50 , 350 , 400 } , { 400 , 300 ,300 , 400 } }; // ポリゴンのデータ型 int body[][] = { { 250 , 250 , 60 , 60 } , { 240 , 300 , 80 , 80 } }; // 矩形のデータ型 int mayuge[][][][] = { { { { 259 , 259 , 275 , 275 } , { 285 , 285 , 301 , 301 } } , { { 260 , 266 , 266 , 260 } , { 260 , 266 , 266 , 260 } } } , { { { 259 , 259 , 275 , 275 } , { 285 , 285 , 301 , 301 } } , { { 258 , 264 , 268 , 262 } , { 262 , 268 , 264 , 258 } } } , { { { 259 , 259 , 275 , 275 } , { 285 , 285 , 301 , 301 } } , { { 262 , 268 , 264 , 258 } , { 258 , 264 , 268 , 262 } } } }; // ポリゴンのデータ型 int eye[][] = { { 263 , 270 , 8 , 8 } , { 289 , 270 , 8 , 8 } }; // 矩形のデータ型 int nose[] = { 276 , 280 , 8 , 8 }; // 矩形のデータ型 int mouse[] = { 271 , 292 , 20 , 6 }; // 矩形のデータ型 drawdata(String title) { super(title); } } class daruma extends drawdata { // 実際の描画用クラス int state; // 顔の状態 boolean onstart = false; // マウスがクリックされたかどうか判定用 // グラデーション用 int p = 0; boolean limit = false; // ダブルバッファリングに使用 Image offScreenImage; Graphics offScreenGraphics; GregorianCalendar seed = new GregorianCalendar(); // 乱数の種 Random rnd = new Random(seed.get(Calendar.MILLISECOND)); // 乱数 public daruma(String title) { super(title); addKeyListener(new KeyAdapter() { // キー判定 public void keyPressed(KeyEvent e) { switch (e.getKeyChar()) { case 'n': // 普通の顔 state = 0; break; case 'a': // 怒った顔 state = 1; break; case 's': // 悲しい顔 state = 2; break; case 'r': // 再描画 repaint(); break; case 'q': // 終了 System.out.println("Thank you!"); System.exit(0); break; default: break; } } }); addMouseListener(new MouseAdapter() { // マウス判定 public void mouseClicked(MouseEvent e) { onstart = !onstart; // アニメーション(もどき)を始める repaint(); } }); } public void update(Graphics g) { // ダブルバッファリング if (offScreenImage == null) { offScreenImage = createImage(400 , 400); offScreenGraphics = offScreenImage.getGraphics(); } paint(offScreenGraphics); g.drawImage(offScreenImage , 0 , 0 , this); } public void paint(Graphics g) { if (onstart) { if (limit) p -= 8; else p += 8; } if (p == 0 || p == 256) limit = !limit; // 背景 if (p > 255) g.setColor(new Color(255 , 255 , 255)); else g.setColor(new Color(p , p , p)); g.fillRect(0 , 0 , 400 , 400); int c = p / 2 + 127; g.setColor(new Color(c , c , c)); g.fillPolygon(ground[0] , ground[1] , ground[0].length); // 雪だるま // 体 g.setColor(Color.white); for (int i = 0 ; i < 2 ; i++) { g.fillOval(body[i][0] , body[i][1] , body[i][2] , body[i][3]); } // 目 g.setColor(Color.black); for (int i = 0 ; i < 2 ; i++) { g.fillPolygon(mayuge[state][0][i] , mayuge[state][1][i] , mayuge[state][0][0].length); g.fillOval(eye[i][0] , eye[i][1] , eye[i][2] , eye[i][3]); } // 鼻 g.setColor(Color.orange); g.fillOval(nose[0] , nose[1] , nose[2] , nose[3]); // 口 g.setColor(Color.black); g.fillRect(mouse[0] , mouse[1] , mouse[2] , mouse[3]); // 雪 g.setColor(Color.white); for (int i = 0 ; i < 60 ; i++) { g.fillOval(((rnd.nextInt() % 39) + 1) * 10 , ((rnd.nextInt() % 39) + 1) * 10 , 7 , 7); } } } class Kadai1108op { public static void main(String args[]) { daruma daru = new daruma("Kadai1108"); daru.setSize(400 , 400); daru.setVisible(true); boolean flag = false; int sec = daru.seed.get(Calendar.SECOND); while (true) { // 1秒ごとに再描画する int tmp = new GregorianCalendar().get(Calendar.SECOND); if (flag == true) { daru.repaint(); flag = false; } else if (sec == (tmp + 59) % 60) { flag = true; sec = tmp; } } } } /* 本当はもっといろいろ遊べるように出来ると思いますが, 私の乏しいセンスではこれが限界のようです(泣)*/