11/22 簡単なグラフィクス(3)
前回までの補足
- 前回の課題の提出期限が 11/24(月)になっていたのは11/27(月)の誤り
前回の課題
以下の要素を備えたプログラムを作成しなさい.
- イベント処理
- ファイルからのイメージのロード
- Vectorクラス
解答例
締め切りよりかなり前だが,提出されたものがあるので,紹介する.
//010344H
//XXXX,東京大学文1,1年。E-mail:g010344@mail.ecc.u-tokyo.ac.jp
//ユーザが、画面上で、yを入力すると、ランダムに、ハートの絵を表示する
//プログラムです。 入力 を繰り返すと、ハートの数が増えます。
// y を入力しすぎると、ひびの入ったハートが、1つだけ表示されます。
//ラブレターに最適!!なわけないか。
import java.awt.*;
import java.awt.event.*;
import java.util.*;
//elementAt,addElementなどを使うときには、いちいち、このように、
//クラスを生成して、媒介としてやらなくては、いけないのでしょうか?
class Iruno{
public int iruno;
public Iruno(int hatena){
iruno=hatena;}
}
class Loveletter extends Frame implements KeyListener{
Vector v;
Image image;
Image brokenheart;
//イメージをロードし、vectorクラスのオブジェクトを生成する。
public Loveletter(String title){
super(title);
v=new Vector();
image=Toolkit.getDefaultToolkit().getImage("heart.gif");
brokenheart=Toolkit.getDefaultToolkit().getImage("brokenheart.gif");
addKeyListener(this);
}
public static void main(String[] args){
Loveletter frame=new Loveletter("Loveletter");
frame.setSize(600,400);
frame.setVisible(true);
}
public void paint(Graphics g){
g.setColor(Color.white);
g.fillRect(0,0,600,400);
g.setColor(Color.black);
//文章。
g.drawString("Do You Want More Love?",10,50);
g.drawString("If yes,type y.If no,type n." ,10,70);
g.drawString("But remember,too many want will destroy yourself!",10,90);
int i;
//はじめに小さなハートを表示しておく。
g.drawImage(image,140,140,35 ,35,this);
//ランダムに、ハートを表示する。
if(v.size()<=14){
for(i=0;i< v.size();i++){
Iruno l=(Iruno)v.elementAt(i);
double l_1 =Math.random()*l.iruno*18.0;
double l_2 =Math.random()*l.iruno*14.0*Math.random()*2;
int firstl=(int)l_1;
int secondl=(int)l_2;
g.drawImage(image, 18 *firstl,12*secondl ,14 *firstl, 15 *secondl, this);
}
}
//壊れたハートの表示。
else
g.drawImage(brokenheart,140,100,300,300,this);
}
public void keyPressed(KeyEvent e){
int key=e.getKeyChar();
System.out.println("KeyPressed("+e+","+key+")");
if(key=='y'){
int a=1;
v.addElement(new Iruno(a));
repaint();}
else if(key=='n')System.exit(0);
}
public void keyReleased(KeyEvent e){}
public void keyTyped(KeyEvent e){}
}
コメント
基本型を保持するVectorを作りたい時は,自前で用意しなくてもシステムにラッ
パークラス(wrapper class)というものが用意されています.語源は食品を包
むのに使う「XXXラップ」と同じで,基本型のデータを包んでオブジェクトに
して使うものです.int型に対してはIntegerク
ラスが用意されているので,上のプログラムでは以下のように書き直すこ
とができます.
Iruno l=(Iruno)v.elementAt(i);
->
Integer l=(Integer)v.elementAt(i);
----------------------------------------------------------------------
l.iruno
->
l.intValue()
----------------------------------------------------------------------
v.addElement(new Iruno(a));
->
v.addElement(new Integer(a));
ただし,このプログラムではVectorを使っている意味がないプログラムなの
で,ちょっとつまらないですね.paintの度に毎回乱数で位置を決めるのでは
なくて,keyPressedの際に位置を乱数で決めて,それをVectorに記録してお
いた方がより有効な使い方になります.
上のプログラムで使われている疑似乱数の生成は,Math
クラスのrandomメソッドを使っていますが,Random
クラスを使う方法もあります.
今日の課題
駒場祭直前なのでなし.
次に進む