//package Applet1_obj; import java.applet.Applet; import java.awt.Graphics; import java.awt.*; import java.awt.event.*; import javax.swing.*; //ボールの情報・描画を持ったクラス。 public class Boll{ int WIDTH = 20; int HEIGHT = 20; final Color col = new Color(255,255,0); int x; int y; //速度 int speed = 4; //角度関係 final double PI = 3.14; double angle = 50; double hozon_x,hozon_y; //がんがんぶつからないように時間を(当たった場所の一番近い地点への座標復帰が本当は望ましい) int hit_time = 10; Boll(int p_x,int p_y){ x = p_x; y = p_y; hozon_x = x; hozon_y = y; } void move(){ //座標はint型なので1に達しなかったら切り捨てられちゃう事に注意、 //座標は→が90なのに、cosなどの計算上では→が0°だったりするので hozon_x += Math.cos((angle +90)* PI / 180)*speed; hozon_y -= Math.sin((angle +90)* PI / 180)*speed; if(x != (int)hozon_x){ x = (int)hozon_x; hozon_x = x; } if(y != (int)hozon_y){ y = (int)hozon_y; hozon_y = y; } } void draw(Graphics g){ g.setColor(col); g.fillOval(x,y,WIDTH,HEIGHT); } //画面外に出ようとしたら void screenOut(int sc_max_x,int sc_max_y){ int sc_low_x = 0,sc_low_y = 0; if(sc_max_x < x){ x = sc_max_x; angle = kakudo_cal(1); } if(x < sc_low_x){ x = sc_low_x; angle = kakudo_cal(1); } /* if(sc_max_y < y){ y = sc_max_y; angle = kakudo_cal(1); } */ if(y < sc_low_y){ y = sc_low_y; angle = kakudo_cal(0); } } //バーに当たったら(オーバーライドで量産? 他のクラスではどうするの?) void hitObj(Bar this_class){ boolean ishit; ishit = hit_cal(this_class.x,this_class.y,this_class.WIDTH,this_class.HEIGHT); if(ishit){ /*d int aaa = (int)(angle % 360); //System.out.println(angle); if(x > this_class.x){ if(aaa > 90)angle += 90; else angle -= 90; } else{ if(aaa > 90)angle -= 90; else angle += 90; } hit_time = 60; */ angle = kakudo_cal(0); } } //対ブロック void hitObj(Block this_class){ boolean ishit; ishit = hit_cal(this_class.x,this_class.y,this_class.WIDTH,this_class.HEIGHT); if(ishit){ angle = kakudo_cal(0); this_class.die(); } } //あと斜めが弱い? boolean hit_cal(int obj_x,int obj_y,int obj_width,int obj_height){ if(x + WIDTH/2 > obj_x - obj_width/2 && x - WIDTH/2< obj_x + obj_width/2){ if(y + HEIGHT/2 > obj_y - obj_height/2 && y - HEIGHT/2 < obj_y + obj_height/2){ //当たりました。 return true; /* if(x < obj_x && y < obj_y)return 1;//左上 if(x < obj_x && y > obj_y)return 2;//左下 if(x > obj_x && y > obj_y)return 3;//右上 if(x > obj_x && y < obj_y)return 4;//右下 */ } } return false; } //角度はぶつかった時の角度にもよるのだ・・・ double kakudo_cal(int kabe){ if(hit_time < 0){ //なす角的な計算 hit_time = 10; double bbb = angle % 360; double ccc = 0.0; //kabe=0上下の壁 kabe=1左右の壁 180 360 if(kabe == 0)ccc = 175 - bbb + Math.random() * 10; if(kabe == 1)ccc = 355 - bbb + Math.random() * 10; return ccc; } else{ return angle; } } void hit_time_cal(){ hit_time--; } }