/
Material.java
222 lines (199 loc) · 7.18 KB
/
Material.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
import java.util.*;
import java.lang.Math;
import java.awt.*;
import java.applet.Applet;
//ゲームにおける物体のスーパークラス
public class Material extends DrawObject{
//敵フラグ
private boolean isEnemy;
//重力
public Pointer Gravity = new Pointer(Math.PI/2,0.5);
//消滅フラグ
private boolean Vanish=false;
//1度の角度
private static double rad1 = Math.PI/180;
//座標計算用
protected double x=0.0,y=0.0;
//ベクトルクラス
private Pointer Vector;
//接地接壁接天井検知用のセンサクラス
protected Sensor Sensor=new Sensor(0,0);
//当たり範囲群
private ManyHitters manyhitters = new ManyHitters();
//flying object flag
private boolean Flying;
//Material's Size
private int Width,Height;
//getter
public double getForce(){return Vector.getForce();}
public double getRad(){return Vector.getRad();}
public double getX(){return x;}
public double getY(){return y;}
public boolean getLanding(){return Sensor.getLanding();}
public boolean getRoofing(){return Sensor.getRoofing();}
public boolean getVanish(){return Vanish;}
public boolean getIsEnemy(){return isEnemy;}
public ManyHitters getManyHitters(){return manyhitters;}
public Sensor getSensor(){return Sensor;}
public boolean getFlying(){return Flying;}
public int getWidth(){return this.Sensor.getWidth();}
public int getHeight(){return this.Sensor.getHeight();}
public double getGravityLimit(){return this.Vector.getGravityLimit();}
//setter
public void setForce(double ForcePower){this.Vector.setForce(ForcePower);}
public void setRad(double ForceRad){this.Vector.setRad(ForceRad);}
public void setRad(int ForceRad){this.Vector.setRad(ForceRad*rad1);}
public void setX(double x){this.x=x;}
public void setY(double y){this.y=y;}
public void setVanish(boolean Vanish){this.Vanish=Vanish;}
public void setIsEnemy(boolean isEnemy){this.isEnemy=isEnemy;}
public void setFlying(boolean flying){this.Flying = flying;}
public void setWidth(int Width){this.Sensor.setWidth(Width);}
public void setHeight(int Height){this.Sensor.setHeight(Height);}
public void setGravityLimit(double GravityLimit){this.Vector.setGravityLimit(GravityLimit);}
public void setSize(int size){
setWidth(size);
setHeight(size);
}
//コンストラクタ
public Material(double x,double y,double rad,double force,boolean isEnemy){
super((int)x,(int)y);
setX(x);
setY(y);
this.Vector=new Pointer(rad,force);
setIsEnemy(isEnemy);
setSize(8);
manyhitters.add(new Hitter(getWidth()/2,getHeight()/2,(int)getX(),(int)getY(),3));
setFlying(false);
}
//あたり範囲を追加
public void addHitter(Hitter hitter){
manyhitters.add(hitter);
}
//接壁処理左
public void wallingLeftOperation(Stage Stage){
//左方向のベクトルを除去
//Vector.verticleExtractRight();
//X座標を補正
setX( (int)getX() + getWidth()-1 - (int)(getX()-1)%getWidth() );
//センサを更新
Sensor.updateCoordinate(Stage,(int)getX(),(int)getY());
}
//接壁処理右
public void wallingRightOperation(Stage Stage){
//左右どちらかのセンサがオブジェクト内部に合ったら接壁状態
//ベクトルの右方向成分を除去
//Vector.verticleExtractLeft();
//座標を補正
setX( (int)getX() - (int)(getX())%getWidth() );
//センサを更新
Sensor.updateCoordinate(Stage,(int)getX(),(int)getY());
}
//接天井処理
public void roofingOperation(Stage Stage){
//上2つの点がオブジェクト内に入っていたら接天井状態
//ベクトルの上方向成分を除去
Vector.sideExtractDown();
//座標をオブジェクトの下に固定
setY( (int)getY() + getHeight()-1 - (int)(getY()-1)%getHeight()) ;
//センサを更新
Sensor.updateCoordinate(Stage,(int)getX(),(int)getY());
}
//接地処理
public void landingOperation(Stage Stage){
//下2つの点がオブジェクトの内部に入っていたら接地状態
//下点が物質内部に入っていたらベクトルを操作、全てのベクトルを消してニュートラルにする。
//とりあえず今はニュートラル処理
setForce(0.0);
setRad(0.0);
//座標をオブジェクトの上に固定する
setY( ( (int)getY() - (int)(getY())%getHeight() ) );
//センサの値を更新
Sensor.updateCoordinate(Stage,(int)getX(),(int)getY());
}
//位置補正
public void moveRevision(Stage Stage){
//センサーの判定
Sensor.isInsideJudge(Stage);
//接地、接壁、接天井、それらの複合、それぞれの状態をによる処理を行う
if(Sensor.getLanding()){landingOperation(Stage);}
if(Sensor.getRoofing()){roofingOperation(Stage);}
if(Sensor.getWallingRight()){wallingRightOperation(Stage);}
if(Sensor.getWallingLeft()){wallingLeftOperation(Stage);}
}
//物理的移動
public void materialMove(){
//重力による補正、飛行状態でなく自由落下状態なら重力の影響を受ける
if(!Sensor.getLanding() && !getFlying()){
this.Vector.vectorCombination(Gravity);
}
//物理ベクトルに基づく移動
setX(getX()+getForce() * Math.cos(getRad()));
setY(getY()+getForce() * Math.sin(getRad()));
//センサの値を更新
Sensor.setParam((int)getX(),(int)getY());
//当たり範囲の座標を更新
manyhitters.setCoordinate((int)getX(),(int)getY());
}
//move draw coordinate
public void drawMove(int StageX,int StageY){
//描写座標の調整
updateDrawCoordinate(StageX,StageY,(int)getX(),(int)getY());
//XXX ここに、当たり判定とセンサーの座標を更新する処理を?それとも
//move Draw Coordinate for Hitter
getManyHitters().moveDrawCoordinate(StageX,StageY);
//move Draw Coordinate for SensorDots
getSensor().moveDrawCoordinate(StageX,StageY);
}
//移動と補正
public void move(){
//物理移動
materialMove();
}
//消滅判定
public boolean isVanish(){
//System.out.println(getVanish());
//消えてたらそのまま消滅フラグを返す
if(getVanish()){return getVanish();}
//消えてなかったら画面外に判定を行う。
return isOut();
}
//画面外判定
public boolean isOut(){
//画面外に出ていたら
if(x<0.0||x>10000.0||y<0.0||y>10000.0 ){
setVanish(true);
return getVanish();
}else{
setVanish(false);
return getVanish();
}
}
//物体描写
public void materialDraw(Graphics g){
manyhitters.draw(g);
}
//描写
public void draw(Graphics g){
g.setColor(Color.gray);
//g.fillOval(getDrawX(),getDrawY(),getWidth()-1,getHeight()-1);
//g.fillOval((int)x,(int)y,15,15);
materialDraw(g);
getSensor().draw(g);
}
//when hit
public void hited(Material material){
System.out.println("hit in Material with argument Material");
}
public void hited(Player Player){
System.out.println("hit in Material with argument Player");
}
//when hit
public void hited(Character Character){
System.out.println("hit in Material with argument Character");
}
//when hit
public void hited(Ballet Ballet){
System.out.println("hit in Material with argument Ballet");
}
}