12/9 課題
ソースと説明は以下の通りです。
なお、イメージファイルとして超手抜きの手書き(マウス書き?)お肉を使ってます。
//<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());
}
}
}