program
//アプレットを使うため
import java.applet.*;
//AWTを使うため
import java.awt.*;
//イベント駆動関係のため
import java.awt.event.*;
public class Kadai1216 extends Applet implements Runnable{
int width=300,height=600;
int arrow_x=150,arrow_y=550,arrow_vx=0,arrow_vy=0;
int target_x=150,target_y=50,target_vx=10;
int target_width=120,target_height=10;
int hit=0;
int total=0;
//Kadai1216クラスのコンストラクタ
//アニメーションを行うためのスレッド
public Thread th=null;
//wwwブラウザがアプレットを含むページに来たときに呼ばれる
public void init(){
System.out.println("init is called");
addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e){
System.out.println("keyPressed("+e+")");
int key=e.getKeyChar();
if(key=='w'){
target_width=target_width+10;
}
if(key=='n'){
target_width=target_width-10;
}
else if(key=='h'){
arrow_vy=-30;
}
else if(key=='l'){
arrow_vy=-15;
}
else if(key=='r'){
hit=0;
total=0;
}
}
});
addMouseListener(new MouseAdapter(){
public void mousePressed(MouseEvent e){
System.out.println(e);
}
});
requestFocus();
}
public void start(){
System.out.println("start is called");
if(th==null){ th=new Thread(this); th.start();}
}
public void stop(){
System.out.println("stop is called");
th=null;
}
public void run(){
Thread thisThread=Thread.currentThread();
while(th==thisThread){
try{ Thread.sleep(100); }
catch(Exception e){}
timeTick();
}
}
void timeTick(){
//的の移動
target_x=target_x+target_vx;
//的が左端まで行ったら戻ってくる
if(target_x<0){
target_vx=-target_vx;
}
//的が右端まで行ったら戻ってくる
else if(target_x>width-target_width){
target_vx=-target_vx;
}
//矢の移動、古い座標を保存
int old_x=arrow_x;
int old_y=arrow_y;
arrow_x=arrow_x+arrow_vx;
arrow_y=arrow_y+arrow_vy;
//矢が的に近づいてきたら
if(arrow_y=target_y){
//的と矢の交差するx座標を計算
int x=old_x+(arrow_x-old_x)*(target_y-old_y)/(arrow_y-old_y);
//的に当たったら
if(target_x <= x && x<=target_x+target_width){
arrow_x=150;
arrow_y=550;
arrow_vx=0;
arrow_vy=0;
hit=hit+1;
total=total+1;
}
}
if(arrow_y<0){
arrow_x=150;
arrow_y=550;
arrow_vx=0;
arrow_vy=0;
total=total+1;
}
repaint();
}
Image offScreenImage;
Graphics offScreenGraphics;
public void update(Graphics g){
if(offScreenImage==null){
//オフスクリーンイメージを600x400のサイズで作成
offScreenImage=createImage(getWidth(),getHeight());
//オフスクリーンイメージに描画するための Graphics オブジェクト
offScreenGraphics=offScreenImage.getGraphics();
}
//次の画面のイメージを作る
paint(offScreenGraphics);
//イメージを本物のスクリーンに書き込む
g.drawImage(offScreenImage,0,0,this);
}
public void paint(Graphics g){
//描画色を白にする.
g.setColor(Color.white);
//全体を塗り潰す
g.fillRect(0,0,width,height);
//描画色を黒にする
g.setColor(Color.black);
//矢を描く
int[] xs={arrow_x,arrow_x-4,arrow_x-2,arrow_x-2,arrow_x+2,arrow_x+2,arrow_x+4};
int[] ys={arrow_y,arrow_y+4,arrow_y+4,arrow_y+16,arrow_y+16,arrow_y+4,arrow_y+4};
g.fillPolygon(xs,ys,7);
//的を描く
g.fillRect(target_x,target_y,target_width,target_height);
g.drawString("命中率 "+hit+"/"+total,130,450);
}
}