import java.applet.Applet;
import java.awt.*;
public class Yuuyake extends Applet implements Runnable{
boolean is_on = false; //まずbooleanで、is_onを偽とする
int Red=45; //太陽の色Red,Green,Blueの初期値
int Green=190;
int Blue=240;
int er=2,eg=2,eb=2; //Red,Green,Blueの1度に変化する数値(2ずつ変化)
int x=0,y=0; //太陽の中心の座標(x,y)=(0,0)
double d=0.0; //太陽の軌跡の移動角度d=0から始める
Image sea,sea2; //海の画像
Image hosi,hosi2,hosi3,hosi4,hosi5; //星の画像
Image offs; //オフスクリーン
Thread th=null; //スレッド
public void init(){ //initメソッド
setBackground(Color.white); //背景を白に設定
}
public void start(){ //メソッド start() を用意してスレッドを始める
if(th==null){
th=new Thread(this); //新しいスレッド生成
th.start();
}
}
public void stop(){ //メソッド stop() を用意してスレッドをストップさせる
th=null; //threadがnullのとき
is_on = false; //is_onが偽のとき
sea.flush(); //flush()
sea2.flush();
hosi.flush();
hosi2.flush();
hosi3.flush();
hosi4.flush();
hosi5.flush();
offs.flush();
sea = null; //画像がnullのとき
sea2 = null; // 〃
hosi = null; // 〃
hosi2 = null; // 〃
hosi3 = null; // 〃
hosi4 = null; // 〃
hosi5 = null; // 〃
offs = null;
}
public void update(Graphics g){ // updateメソッド
paint(g);
}
public void drawSun(Graphics g, int a, int b){ //太陽の描き方
double r=30.0; // double で r を30に設定
final double RAD=Math.PI/180.0; //ラジアンを設定をする
double s=0.0; // double で s を0.0に設定
for(int i=0; i<=180; i++){ // i を180になるまで1ずつ増やす
double ang1=90.0+s;
double ang2=90.0-s;
//計算が大変(;_;)
int x1=(int)(Math.cos(ang1*RAD)*r); //コサインを使って → x1はcos((90+s)*RAD)*30
int x2=(int)(Math.cos(ang2*RAD)*r); //コサインを使って → x2はcos((90-s)*RAD)*30
int y1=(int)(Math.sin(ang1*RAD)*r); //サインで → y1はsin((90+s)*RAD)*30
int y2=(int)(Math.sin(ang2*RAD)*r); //サインで → y2はcos((90-s)*RAD)*30
g.setColor(new Color(255,185-i,0)); //setColorで色を設定する
g.drawLine(x1+a,b-y1,x2+a,b-y2); //drawLineでラインを描く
//それぞれの座標が変化していくからきれいな色ができます
s=s+1.0;
}
}
public void taiyou(Graphics g, double dd){ //太陽を描くメソッド
final double RAD=Math.PI/180.0; //ラジアンを設定する
x=(int)(Math.cos((90.0-dd)*RAD)*180)-55; //コサインを使ってxに代入
y=200-(int)(Math.sin((90.0-dd)*RAD)*180); //サインを使ってyに代入
drawSun(g,x,y); //太陽を描く
}
public void paint(Graphics g){ //コンポネートを描画するメソッド
if(is_on){
if(offs != null){ //offsがnullではないとき~
Graphics og=offs.getGraphics();
try{
paintSky(og, Red, Green, Blue); //背景を描く
taiyou(og,d); //太陽を描く
og.drawImage(sea,0,150,this); //海を描く座標(x,y)=(0,150)
if(Red<20){ //Redが20より小さくなったら
og.drawImage(hosi,50,50,this); //drawImageで星を貼り付け
og.drawImage(hosi2,80,20,this); // 〃
og.drawImage(hosi3,130,0,this); // 〃
og.drawImage(hosi4,1,10,this); // 〃
og.drawImage(hosi5,170,45,this); // 〃
}
if(Red<45){
og.drawImage(sea2,0,150,this); //drawImageで海を貼り付け
}
g.drawImage(offs,0,0,this); //オフスクリーンのとき
}
catch(NullPointerException e){ //例外をcatchする
return;
}
{
og.dispose();
}
}
}
{
g.drawString("Sun goes down...",10,20); //drawStringで文字列を並べる。
//座標(x,y)=(10,20)
}
}
public void paintSky(Graphics g, int Red2, int Green2, int Blue2){ //背景を描くメソッド
int dr=1,dg=1,db=1; //上から下へRed,Blue,Greenを1ずつ変化させる
for(int i=0; i<200; i=i+2){ //2ピクセルずつ色を変える
g.setColor(new Color(Red2,Green2,Blue2)); //setColorで色を指定
g.drawLine(0,i,200,i);
g.drawLine(0,i+1,200,i+1);
Red2=Red2+dr; //Redは1足していく
Green2=Green2+dg; //Greenは1足していく
Blue2=Blue2-db; //Blueは1減らしていく
if(Red2>=255) Red2=255; //Redは255になったらストップ
if(Green2>=254) dg=-1; //Greenは254になったら1減らしていく
if(Green2<=0) Green2=0; //1減らして0になったらストップ
if(Blue2<=0) Blue2=0; //Blueは0になったらストップ
}
}
public void run(){ //runメソッド
sea=getImage(getCodeBase(),"sea.jpg"); // getImage で画像を取得
sea2=getImage(getCodeBase(),"sea2.jpg"); // 〃
hosi=getImage(getCodeBase(),"h10_3.gif"); // 〃
hosi2=getImage(getCodeBase(),"h10_1.gif"); // 〃
hosi3=getImage(getCodeBase(),"h10_4.gif"); // 〃
hosi4=getImage(getCodeBase(),"h10_5.gif"); // 〃
hosi5=getImage(getCodeBase(),"h10_6.gif"); // 〃
MediaTracker mt=new MediaTracker(this); //メディアトラッカー
mt.addImage(sea,0);
mt.addImage(sea2,0);
mt.addImage(hosi,0);
mt.addImage(hosi2,0);
mt.addImage(hosi3,0);
mt.addImage(hosi4,0);
mt.addImage(hosi5,0);
try{ //メディアトラッカー読み込み
mt.waitForID(0);
}catch(InterruptedException e){}
offs=createImage(200,200);
is_on = true;
repaint(); //paintを呼ぶ。コンポネートを再描画する。
Thread thisThread = Thread.currentThread();
while( Red>0 && th==thisThread ){ //Redが0になるまで繰り返す
try{
th.sleep(100); //100m/秒ごとに繰り返す
}catch(InterruptedException e){
return;
}
Red=Red+er; //Redは2ずつ増やす
Green=Green+eg; //Greenは2ずつ増やす
Blue=Blue-eb; //Blueは2ずつ減らす
if(Red>=254) er=-2; //Redは255になったら2ずつ減らす
if(Red<=0) Red=0; //0になったらストップ
if(Green>=254) eg=-2; //Greenは255になったら2ずつ減らす
if(Green<=0) Green=0; //0になったらストップ
if(Blue<=0) Blue=0; //Blueは0になったらストップ
d=d+0.5; //太陽の位置を0.5度動かす
if(d>=90.0) d=90.0; //太陽が山に消えたらその位置のまま
repaint(); //paintをよぶ。コンポネートを再描画する。
}
}
}
|