-
Notifications
You must be signed in to change notification settings - Fork 0
/
Asteroid.java
203 lines (176 loc) · 5.33 KB
/
Asteroid.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
package asteroidymodyfikacja;
//martapalka
import java.util.Random;
import java.util.Vector;
/**
*KLASA: Asteroid
*OPIS: Dziedziczy po klasie będącej bazą dla każdego obiektu gry (oprócz pocisku) Polygon
* 1.Położenie początkowe asteroidy ma charakter losowy (metoda rand())
* 2.Dostępne są asteroida mała i duża
* 3.Prędkość asteroidy pobierana jest z pliku konfiguracyjnego
*/
public class Asteroid extends Polygon{
Random random = new Random();
double speed =0;
boolean hit;
/**
* Konstruktor Asteroidy
* Defaultowo zmienna typu boolean mówiąca czy asteroida została trafiona pociskiem jest ustawiona na false
* @param pos - pozycja
*/
public Asteroid(Point pos) {
super(astShape(), pos, setRot(pos));
hit=false;
}
/**
* Metoda, która umożliwia zresetwanie asteroidy (Po zderzeniu ze statkiem lub z pociskiem)
*/
public void reset(){
//need to update this
this.position = Asteroid.pos();
this.rotation = setRot(this.position);
this.shape = astShape();
}
/**
* Metoda używana do zmiany kształtu asteroidy (w moim kodzie uzyskujemy małą asteroidę )
*/
public void changeShape(){
this.shape=smallAstShape();
}
/**
* astShap: tu tworzony jest kształt dużej asteroidy (ma on charakter losowy)
* @return
*/
public static Point[] astShape(){
Random random = new Random();
Point[] randAsteroid = {
new Point(0,0),
new Point(random.nextInt(11-5)+5, -(random.nextInt(16-10)+10)),
new Point(random.nextInt(21-15)+15, -(random.nextInt(5))),
new Point(random.nextInt(31-25)+25, (random.nextInt(5-(-10)-10))),
new Point(random.nextInt(21-15)+15, (random.nextInt(21-15)+15)),
new Point(random.nextInt(0-(-5))-5, (random.nextInt(15-10)+10))
};
return randAsteroid;
}
/**
* smallAstShap: tu tworzony jest kształt małej asteroidy (ma on charakter losowy)
* @return
*/
public static Point[] smallAstShape(){
Random random = new Random();
Point[] randAsteroid = {
new Point(0,0),
new Point(random.nextInt(11-5)+1, -(random.nextInt(16-10)+6)),
new Point(random.nextInt(21-15)+9, -(random.nextInt(5))),
new Point(random.nextInt(31-25)+21, (random.nextInt(5-(-10)-10))),
new Point(random.nextInt(21-15)+11, (random.nextInt(21-15)+15)),
new Point(random.nextInt(0-(-5))-1, (random.nextInt(15-10)+10))
};
return randAsteroid;
}
/**
*Asteroidy są umieszczane w randomowych pozycjach- zazwyczaj poza płótnem gry
*returns Point
* @return
*/
public static Point pos(){
Random random = new Random();
int x = 0;
int y = 0;
int pos = random.nextInt(4);
//lewo
if(pos == 0){
x = 0;
y = random.nextInt(Asteroids.h + 1);
}
//góra
else if(pos == 1){
x = random.nextInt(Asteroids.w + 1);
y = 0;
}
//prawo
else if(pos == 2){
x = Asteroids.w;
y = random.nextInt(Asteroids.h + 1);
}
//dół
else if(pos == 3){
x = random.nextInt(Asteroids.w + 1);
y = Asteroids.h;
}
Point p = new Point(x,y);
return p;
}
/**
*method: rotację ustawiamy w zależności od pozycji asteroidy
*w ten sposób unikamy sytuacji, że asteroida się nie pojawi albo odrazu skieruje się po za płótno gry
* @param position
* @return
*/
public static double setRot(Point position){
Random random = new Random();
//prawa część płótna
if(position.x < (Asteroids.w/2)){
//góra
if(position.y < (Asteroids.h/2)){
return random.nextInt(63-29) + 30;
}
//dół
else{
return random.nextInt(329-300) + 300;
}
}
//lewa część płótna
else{
//góra
if(position.y < (Asteroids.h/2)){
return random.nextInt(151-120) + 120;
}
//dół
else{
return random.nextInt(241-210) + 210;
}
}
}
/**
* asT tworzy wektor asteroid potrzebny w metodzie paint w klasie Asteroids()
* @param n liczba asteroid w wektorze
* @return wektor złożony z asteroid
*/
public static Vector astV(int n){
Vector v = new Vector();
for(int i = 0; i < n; i++){
Asteroid ast = new Asteroid(pos());
v.add(ast);
}
return v;
}
/**
* move sprawia, że asteroida zaczyna się poruszać z prędkością zależną od poziomu
* jeśli asteroida wyleci po za ekran, pojawi się symetrycznie z drugiej strony
* @param level
*/
public void move(int level){
double prevPosX = position.x;
double prevPosY = position.y;
ReadFile rf = new ReadFile();
rf.openFile();
rf.readFile();
speed=(rf.GetObjectlVelocity(level, "asteroid")*(random.nextInt(3) + 1));
position = new Point(position.x + (speed*Math.cos(Math.toRadians(rotation))),
position.y + (speed* Math.sin(Math.toRadians(rotation))));
if(position.x > Asteroids.w && prevPosX < position.x){
position = new Point(-10,position.y);
}
else if(position.x < 0 && prevPosX > position.x){
position = new Point(Asteroids.w + 10,position.y);
}
if(position.y > Asteroids.h && prevPosY < position.y){
position = new Point(position.x, -10);
}
else if(position.y < 0 && prevPosY > position.y){
position = new Point(position.x, Asteroids.h + 10);
}
}
}