//140841d 岡野雄幸 //雪ダルマということですので、少し凝って雪を降らせてみました。 //実行すると4秒弱のアニメーションが見られます。 //アニメーション中は外部からの入力を受け付けないのが問題点です。 //また、マシンスペックによっては相当ちらつきます。 //sleepの使い方も今一わからずに使っているため、他にも問題があるかも知れません。 // AWTを使うので java.awt.*を import する import java.awt.*; // イベント駆動関係のクラスを用いるため import java.awt.event.*; // 独立したウィンドウを開くので,Frameクラスのサブクラスにする class Kadai1120 extends Frame{ public Kadai1120(String title){ super(title); // GUI部品と,Event Listenerを関連づける // KeyAdapterは,KeyListenerを実装して中身は何もないクラス // new クラス名(){} で,「クラス名」の名前のない子クラスを定義すると同時に // インスタンスを作る addKeyListener(new KeyAdapter(){ public void keyPressed(KeyEvent e){ int key=e.getKeyChar(); System.out.println("keyPressed("+e+","+key+")"); if(key=='q') System.exit(0); } }); } public static void main(String[] args){ Kadai1120 frame=new Kadai1120("Kadai1120"); frame.setSize(400,400); frame.setVisible(true); } public void paint(Graphics g){ System.out.println("paint("+g+") is called"); //黒を選択 g.setColor(Color.black); //背景を塗り潰す g.fillRect(0,0,400,400); //少し暗めの白を選択 g.setColor(new Color(225,225,225)); //地面を塗り潰す g.fillRect(0,300,400,100); //以下雪を降らせるアニメーションを含むループ for(int i=0;i<=110;i++){ //jは雪のy座標 int j=4*i; //白を選択 g.setColor(Color.white); //雪が画面の外に出たときの処理 if(j>390) j=j-390; //直径10ピクセルの円(雪) g.fillOval(20,j,10,10); //他の雪のためにjを元に戻す if(i>=98)j=4*i; //以下、降り始める位置と時間を少しずつずらして22個の雪を降らせている //雪が画面の外に出たときの処理 if(j>410)j=j-390; if(i>5){ g.fillOval(240,j-20,10,10); } //他の雪のためにjを元に戻す if(i>=103)j=4*i; //雪が画面の外に出たときの処理 if(j>430)j=j-390; if(i>10){ g.fillOval(120,j-40,10,10); } //他の雪のためにjを元に戻す if(i>=108)j=4*i; if(i>15){ g.fillOval(320,j-60,10,10); } if(i>20){ g.fillOval(60,j-80,10,10); } if(i>25){ g.fillOval(220,j-100,10,10); } if(i>30){ g.fillOval(30,j-120,10,10); } if(i>35){ g.fillOval(280,j-140,10,10); } if(i>40){ g.fillOval(110,j-160,10,10); } if(i>45){ g.fillOval(210,j-180,10,10); } if(i>50){ g .fillOval(340,j-200,10,10); } if(i>55){ g.fillOval(200,j-220,10,10); } if(i>60){ g.fillOval(40,j-240,10,10); } if(i>65){ g.fillOval(125,j-260,10,10); } if(i>70){ g.fillOval(250,j-280,10,10); } if(i>75){ g.fillOval(50,j-300,10,10); } if(i>80){ g.fillOval(300,j-320,10,10); } if(i>85){ g.fillOval(190,j-340,10,10); } if(i>90){ g.fillOval(130,j-360,10,10); } if(i>95){ g.fillOval(260,j-380,10,10); } if(i>100){ g.fillOval(80,j-400,10,10); } if(i>105){ g.fillOval(360,j-420,10,10); } if(i>110){ g.fillOval(20,j-440,10,10); } //Snowクラスのオブジェクトを作成 Snow s; s=new Snow(); //アニメーションさせるために、33msの間sleep。一応秒間30フレームです s.waiting(); //黒を選択 g.setColor(Color.black); //iが110になるまでは以下を再描画する if(i!=110){ //背景を塗り潰す g.fillRect(0,0,400,300); //少し暗めの白を選択 g.setColor(new Color(225,225,225)); //地面を塗り潰す g.fillRect(0,300,400,100); //暗めの茶色を選択 g.setColor(new Color(110,55,10)); //長方形に塗り潰す(木の幹) g.fillRect(225,295,30,35); //暗めの緑を選択 g.setColor(new Color(45,150,45)); //ポリゴンを塗り潰す(木) int[] xs1={185,220,200,225,215,240,265,255,280,260,295}; int[] ys1={295,240,240,190,190,145,190,190,240,240,295}; g.fillPolygon(xs1,ys1,11); //少し暗めの白を選択 g.setColor(new Color(220,220,220)); //楕円を塗り潰す(雪ダルマの体) g.fillOval(240,290,80,80); //楕円を塗り潰す(雪ダルマの頭) g.fillOval(245,230,70,70); //白っぽい黄色を選択 g.setColor(new Color(255,255,200)); //円弧を塗り潰す(月) g.fillArc(50,40,60,60,60,180); //少し暗めの赤を選択 g.setColor(new Color(230,30,30)); //ポリゴンを描画(雪ダルマの頭のバケツの輪郭) int[] xs2={270,290,320,310}; int[] ys2={231,200,215,251}; g.drawPolygon(xs2,ys2,4); //ポリゴンを塗り潰す(雪ダルマの頭のバケツ) g.fillPolygon(xs2,ys2,4); //少し明るい黒を選択 g.setColor(new Color(10,10,10)); //楕円を塗り潰す(雪ダルマの両目) g.fillOval(255,260,8,8); g.fillOval(282,265,8,8); //ポリゴンを塗り潰す(雪ダルマの眉毛) int[] xs3={282,284,295,293}; int[] ys3={260,255,258,263}; g.fillPolygon(xs3,ys3,4); int[] xs4={255,257,268,266}; int[] ys4={254,249,252,257}; g.fillPolygon(xs4,ys4,4); //ポリゴンを塗り潰す(雪ダルマの鼻) int[] xs5={268,270,268,266}; int[] ys5={269,270,280,279}; g.fillPolygon(xs5,ys5,4); //楕円を塗り潰す(雪ダルマの口) g.fillOval(265,284,9,4); //茶色を選択 g.setColor(new Color(140,80,20)); //ポリゴンを塗り潰す(雪ダルマの手) int[] xs6={300,320,320,323,340,328,350,325,301}; int[] ys6={310,300,280,298,282,299,302,302,313}; g.fillPolygon(xs6,ys6,9); int[] xs7={245,240,225,238,232,242,250,245,248}; int[] ys7={310,298,295,295,280,295,285,298,307}; g.fillPolygon(xs7,ys7,9); //長方形を塗り潰す(家) g.fillRect(20,220,160,120); //長方形を塗り潰す(家の窓) //黄色を選択 g.setColor(Color.yellow); g.fillRect(60,240,40,20); g.fillRect(110,240,40,20); g.fillRect(60,270,40,20); g.fillRect(110,270,40,20); //くすんだ白を選択 g.setColor(new Color(200,200,200)); //ポリゴンを塗り潰す(屋根) int[] xs8={0,100,200}; int[] ys8={220,160,220}; g.fillPolygon(xs8,ys8,3); } } } } //sleepを使うためにSnowクラスを作成 class Snow extends Thread{ public void waiting(){ //エラーが起こる可能性あり try{ //33mssleepする sleep(33); } //エラーが起こったときの処理 catch(java.lang.InterruptedException e){ //現在のスレッドの一時停止 yield(); } } }