12/9 課題


ソースと説明は以下の通りです。
なお、イメージファイルとして超手抜きの手書き(マウス書き?)お肉(./niku.png)を使ってます。

//<applet code="Kadai1209" width="400" height="434"></applet>
//木戸 浩正
//340331J
//月と雪だるまを描いて雪だるまをいぢめるプログラム version2003.12.09
//ドラッグで指定した範囲に肉が出現。
//お腹を空かせた雪だるまは思わずよだれを垂らします。が、
//雪だるまなので動けません。だから食えません。嗚呼。
//右ボタンで肉をクリックすると消せます。
//
//version2003.12.09の変更点
//アプレット化
//メニューバー消滅
//終了系の機能全滅
//
//version2003.12.02の変更点
//肉全消しボタン、終了ボタン、よだれ引っ込めろボタン追加
//雪チェックボックスをオンにすると雪出現。オフにすると消滅
//メニューバー追加
//その他細かい手直し

import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

class Niku{
    private int x,y,w,h;
    private static Image nikuimg;
    //雪だるまの視線の色は肉の味に依存すると言われている
    private Color aji;
    public Niku(int xx,int yy,Color ajia){
	x=xx;y=yy;
	w=0;h=0;
	aji=ajia;
    }
    public int getX(){
	return x;
    }
    public int getY(){
	return y;
    }
    public int getW(){
	return w;
    }
    public int getH(){
	return h;
    }
    public void setW(int ww){
	w=ww;
    }
    public void setH(int hh){
	h=hh;
    }
    public static void setImage(Image i){
        nikuimg=i;
    }
    public void draw(Graphics g, Kyanbasu k){
	g.drawImage(nikuimg,x,y,w,h,k);
	g.setColor(aji);
	g.drawLine(92,202,x+w/2,y+h/2);
	g.drawLine(122,198,x+w/2,y+h/2);
    }
}

class Yuki{
    private int x,y,l;
    public Yuki(int xx,int yy,int ll){
	x=xx;y=yy;l=ll;
    }
    public void setX(int xx){
	x=xx;
    }
    public void setY(int yy){
	y=yy;
    }
    public void setL(int ll){
	l=ll;
    }
    public void draw(Graphics g){
	g.setColor(Color.white);
	g.fillOval(x,y,l,l);
    }
}

//おえかき板
class Kyanbasu extends Canvas{
    //乱数生成のもと
    private static Random r=new Random();
    //左ボタン押してるかどうか、雪を描くか否か
    private boolean lpressed, yukiari;
    //唾のたれぐあい
    private int yodarel;
    //肉の配列を管理
    private Vector nikuniku;
    //雪の配列
    private Yuki[] yukis;
    //オフスクリーンイメージ
    private Image offimg;
    //オフスクリーングラフィックス
    private Graphics offgra;

    //こんすとらくた
    public Kyanbasu(){
	super();
	setSize(400,400);
	lpressed=false;
	yukiari=false;
	yukis=new Yuki[100];
	nikuniku=new Vector();
	yodarel=0;

	//GUI部品とEvent Listenerを関連づける。
	addMouseListener(new MouseAdapter(){
	    //マウスを押すと新しい肉を出す。再描画なし。
	    public void mousePressed(MouseEvent e){
		if(e.getModifiers()==16){
		    lpressed=true;
		    nikuniku.addElement(new Niku(e.getX(),e.getY(),new Color(r.nextInt(255),r.nextInt(255),r.nextInt(255))));
		}
		System.out.println(e);
		System.out.println(e.getModifiers());
	    }

	    //マウスをはなすとよだれを垂らす。
	    public void mouseReleased(MouseEvent e){
		if(e.getModifiers()==16){
		    lpressed=false;
		    yodarel+=r.nextInt(10);
		    repaint();
		}
		System.out.println(e);
		System.out.println(e.getModifiers());
	    }

	    //右クリックされた場所で一番手前にある肉を消す
	    public void mouseClicked(MouseEvent e){
		//こらそこ、左ドラッグしながら右クリックするんじゃない
		if(e.getModifiers()==4 && !lpressed){
		    for(int i=nikuniku.size()-1;0<=i;i--){
			Niku n=(Niku)nikuniku.elementAt(i);
			int xm=Math.min(n.getX(), n.getX()+n.getW());
			int xM=Math.max(n.getX(), n.getX()+n.getW());
			int ym=Math.min(n.getY(), n.getY()+n.getH());
			int yM=Math.max(n.getY(), n.getY()+n.getH());
			if(xm<=e.getX() && e.getX()<=xM && ym<=e.getY() && e.getY()<=yM){
			    nikuniku.removeElementAt(i);
			    repaint();
			    break;
			}
		    }
		}
		System.out.println(e);
		System.out.println(e.getModifiers());
	    }
	});

	addMouseMotionListener(new MouseMotionAdapter(){
	    //ドラッグで肉の幅と高さをいぢる。
	    public void mouseDragged(MouseEvent e){
		if(e.getModifiers()==16){
		    Niku n=(Niku)nikuniku.elementAt(nikuniku.size()-1);
		    n.setW(e.getX()-n.getX()); n.setH(e.getY()-n.getY());
		    repaint();
		}
		System.out.println(e);
		System.out.println(e.getModifiers());
	    }
	});
    }

    //おえかき
    public void update(Graphics g){
	if(offimg==null){
	    offimg=createImage(400,400);
	    offgra=offimg.getGraphics();
	}
	paint(offgra);
	g.drawImage(offimg,0,0,this);
    }

    public void paint(Graphics g){
	//夜空
	g.setColor(Color.black);
	g.fillRect(0,0,400,200);
	//地面
	g.setColor(Color.darkGray);
	g.fillRect(0,200,400,200);
	//月(三日月)
	g.setColor(Color.yellow);
	g.fillArc(350,50,30,30,135,180);
	g.setColor(Color.black);
	g.fillOval(354,36,40,40);
	//雪だるま
	g.setColor(Color.white);
	g.fillOval(50,170,90,90);
	g.fillOval(46,250,120,120);
	//不気味に目の色が変わる
	g.setColor(new Color(r.nextInt(255),r.nextInt(255),r.nextInt(255)));
	g.fillOval(90,200,5,5);
	g.fillOval(120,196,5,5);
	g.setColor(Color.red);
	g.fillArc(102,210,20,20,190,180);
	g.setColor(new Color(200,150,0));
	g.drawLine(35,260,70,280);
	g.drawLine(155,258,134,278);
	//唾
	g.setColor(new Color(100,255,255));
	g.fillRoundRect(108,228,8,yodarel,4,4);
	//肉
	for(int i=0;i<nikuniku.size();i++){
	    Niku n=(Niku)nikuniku.elementAt(i);
	    n.draw(g,this);
	}
	//雪
	if(yukiari){
	    for(int i=0;i<100;i++){
		yukis[i].draw(g);
	    }
	}
    }

    //全消し
    public void zenkeshi(){
	nikuniku.removeAllElements();
	repaint();
    }
    //雪出したり消したり
    public void yukidashikeshi(boolean b){
	yukiari=b;
	//雪がないなら作れ
	if(yukis[0]==null){
	    for(int i=0;i<100;i++){
		yukis[i]=new Yuki(r.nextInt(400),r.nextInt(400),r.nextInt(10));
	    }
	}
	//雪があってもオンしたときは雪の具合いをでたらまいず
	else if(b){
	    for(int i=0;i<100;i++){
		yukis[i].setX(r.nextInt(400));
		yukis[i].setY(r.nextInt(400));
		yukis[i].setL(r.nextInt(10));
	    }
	}
	repaint();
    }
    //よだれ引っ込めろ
    public void oshikari(){
	yodarel=0;
	repaint();
    }
}

//ぱぶりっくくらす
public class Kadai1209 extends Applet implements ActionListener, ItemListener{
    private Kyanbasu kyanbasu;
    private Button kesubutton, shikarubutton;
    private Checkbox yukibox;
    private static KAdap kadap=new KAdap();

    //こんすとらくたじゃなくてinit
    public void init(){
	kesubutton=new Button("全消し");
	shikarubutton=new Button("はしたない!");
	yukibox=new Checkbox("雪");
	kyanbasu=new Kyanbasu();
	nikuimg=getImage(getCodeBase(),"niku.png");

	//イベントを渡しなさいと言わんばかりに
	kesubutton.addActionListener(this);
	shikarubutton.addActionListener(this);
	yukibox.addItemListener(this);

	//総員配置につけと
	setLayout(new BorderLayout());
	Panel paneru=new Panel();
	paneru.setLayout(new FlowLayout());
	paneru.add(kesubutton);
	paneru.add(shikarubutton);
	paneru.add(yukibox);
	add(paneru,"North");
	add(kyanbasu,"South");
	setSize(getPreferredSize());
	setVisible(true);
	System.out.println(getPreferredSize());
    }

    //ぼたんをポチっとな
    public void actionPerformed(ActionEvent e){
	System.out.println(e);
	Object s=e.getSource();
	System.out.println(s);
	if(s.equals(kesubutton)){
	    kyanbasu.zenkeshi();
	}
	else if(s.equals(shikarubutton)){
	    kyanbasu.oshikari();
	}
    }

    //チェキ箱をチェキ
    public void itemStateChanged(ItemEvent e){
	System.out.println(e);
	Object s=e.getSource();
	if(s.equals(yukibox)){
	    kyanbasu.yukidashikeshi(yukibox.getState());
	}
    }
}