-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathJPGioco.java
444 lines (342 loc) · 15.6 KB
/
JPGioco.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
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
/**
* JPGioco è il pannello di gioco dove sono gestite le animazioni del moto del proiettile
* e del moto del velivolo.
*/
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Area;
import java.awt.geom.Ellipse2D;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Shape;
import java.util.Random;
import javax.swing.JPanel;
import javax.swing.Timer;
/**
* Classe del pannello di gioco del velivolo e del proiettile
* @author Ferrari Vincenzo e Iadarola Barbara.
*
*/
public class JPGioco extends JPanel implements ActionListener{
/**
* Costruttore del Pannello di gioco
* @param l_velivolo Larghezza del velivolo
* @param h_velivolo Altezza del velivolo
* @param millisecondiA Tempo di scansione dell'aereo
* @param raggio_proiettile Raggio del proiettile
* @param millisecondiP Tempo di scansione del proiettile
*/
public JPGioco (int l_velivolo, int h_velivolo, int millisecondiA, double raggio_proiettile, int millisecondiP){
// inizializzo le variabili del velivolo
numVelivoli = 0;
// inizializzo le due pause che dovrà fare il velivolo
pausa1 = genRandom.nextInt(LARGHEZZA_JPGIOCO/2);
pausa2 = genRandom.nextInt(LARGHEZZA_JPGIOCO/2) + LARGHEZZA_JPGIOCO/2;
contatorePause = 0;
pausaDx = false;
pausaSx = false;
// attivo la sentinella della forma simbolica
simbolica = true;
// disattivo la sentinella per lo sparo
sentinellaFuoco = false;
// imposto l'altezza e la larghezza del velivolo
larVelivolo = l_velivolo;
altVelivolo = h_velivolo;
periodoVelivolo = millisecondiA;
// imposto la direzione iniziale del velivolo, se destra o sinistra
randomDirezione = genRandom.nextInt(2);
impostaDir(randomDirezione);
yVelivolo = genRandom.nextInt((ALTEZZA_JPGIOCO/2)/2);
// inizializzo il timer del velivolo e lo faccio partire
timerVelivolo = new Timer(periodoVelivolo, this);
timerVelivolo.start();
// inizializzo le variabili del proiettile
numColpi = 0;
velColpi = 0;
angColpi = 0;
contaColpi = 0;
// imposto la raffica dei proiettili a -1 per il controllo sul contaColpi
rafficaColpi = -1;
// imposto lo step del proiettile e la sua costante di gravità
step = 0.1;
gConst = 9.8;
raggio = raggio_proiettile;
periodoProiettile = millisecondiP;
inixProiettile = 0;
xProiettile = inixProiettile;
iniyProiettile = ALTEZZA_JPGIOCO - (2 * raggio);
yProiettile = iniyProiettile;
timerProiettile = new Timer(periodoProiettile, this);
// attivo il double buffered
this.setDoubleBuffered(true);
}
/**
* Metodo che permette di impostare la direzione del velivolo, casualmente
* utilizzando genRandom come intero.
* @param dirVel : direzione del velivolo, se sx o dx
*/
public void impostaDir(int dirVel){
// se è 0 parte da dx, se è 1 parte da sx
if (dirVel == 0)
{
// il velivolo non deve esserci al momento della partenza
xVelivolo = -(larVelivolo + (larVelivolo/2));
versoDestra = true;
}
else
{
xVelivolo = (ALTEZZA_JPGIOCO + larVelivolo);
versoDestra = false;
}
}
/**
* Metodo che permette di re-impostare tutti i valori allo stato originale
*/
public void azzera(){
// fermo l'animazione del proiettile
timerProiettile.stop();
// velivolo
numVelivoli = 0;
// reimposto le due pause del velivolo
pausa1 = genRandom.nextInt(LARGHEZZA_JPGIOCO/2);
pausa2 = genRandom.nextInt(LARGHEZZA_JPGIOCO/2) + LARGHEZZA_JPGIOCO/2;
// la forma iniziale
simbolica = true;
contatorePause = 0;
pausaDx = false;
pausaSx = false;
sentinellaFuoco = false;
xVelivolo = -(larVelivolo + (larVelivolo/2));
yVelivolo = genRandom.nextInt((ALTEZZA_JPGIOCO/2)/2);
randomDirezione = genRandom.nextInt(2);
impostaDir(randomDirezione);
// proiettile
numColpi = 0;
velColpi = 0;
angColpi = 0;
contaColpi = 0;
rafficaColpi = -1;
xProiettile = inixProiettile;
yProiettile = iniyProiettile;
}
/**
* Imposta la velocità del proiettile
* @param v Velocità inserita dal giocatore
*/
public void setVel(double v){
velProiettile = v;
// inserisco nella variabile di supporto la velocità del proiettile
velPTemporanea = velProiettile;
VyProiettile = -(velProiettile) * Math.sin(angProiettile);
}
/**
* Imposta l'angolo di alzo rispetto all'orizzonte
* @param angolo Angolo di alzo
*/
public void setAng(double angolo){
// trasformo il valore dell'angolo in radianti
angProiettile = Math.toRadians(angolo);
}
/**
* Metodo con cui gestire le due animazioni: quella del velivolo e quella del moto
* @param e : evento dell'animazione
*/
public void actionPerformed(ActionEvent e){
// l'actionPerformed parte col Proiettile
VxProiettile = velProiettile * Math.cos(angProiettile);
// se non sono ancora stati sparati tutti i colpi
if (contaColpi < rafficaColpi){
// se il proiettile raggiunge le estremità
if ((xProiettile >= LARGHEZZA_JPGIOCO) || (xProiettile <= (-(raggio * 2))) || (yProiettile >= ALTEZZA_JPGIOCO))
{
// faccio partire il proiettile dall'angolo in basso a sinistra
xProiettile = inixProiettile;
yProiettile = iniyProiettile;
VyProiettile = -(velProiettile) * Math.sin(angProiettile);
// aggiorno il contaColpi per vedere se ho finito di sparare
contaColpi++;
// aggiungo il quantitativo (se ve n'è) alla velocità e all'angolatura
velProiettile = velProiettile + (velPTemporanea * velColpi / 100);
angProiettile = angProiettile + Math.toRadians(angColpi/10);
numColpi++;
}
// altrimenti continua
else
{
yProiettile = yProiettile + (step * VyProiettile);
VyProiettile = VyProiettile + (step * gConst);
xProiettile = xProiettile + (step * VxProiettile);
}
} // altrimenti finisce
else{
timerProiettile.stop();
contaColpi = 0;
rafficaColpi = -1;
sentinellaFuoco = false;
}
// E prosegue col Velivolo
// se sto andando verso destra
if (versoDestra)
{
// se incontro la prima pausa da dx
if (pausaDx){
// fermo il velivolo e disattivo la prima sentinella
timerVelivolo.setDelay(periodoVelivolo);
pausaDx = false;
}
switch (contatorePause)
{
case 0 : { // pausa nella prima metà
if (xVelivolo == pausa1)
{
timerVelivolo.stop();
timerVelivolo.setDelay(5000);
pausaDx = true;
timerVelivolo.restart();
contatorePause++;
}
}
case 1 : { // pausa nella seconda metà
if (xVelivolo == pausa2)
{
timerVelivolo.stop();
timerVelivolo.setDelay(5000);
pausaDx = true;
timerVelivolo.restart();
contatorePause++;
}
}
}
// controlla se xPos > bordo destro (compresa dimensione sfera)
if (xVelivolo > (ALTEZZA_JPGIOCO + (altVelivolo/2)))
{
// annulla direzione e decrementa coordinata x
versoDestra = false;
pausa1 = genRandom.nextInt(LARGHEZZA_JPGIOCO/2) + LARGHEZZA_JPGIOCO/2;
pausa2 = genRandom.nextInt(LARGHEZZA_JPGIOCO/2);
yVelivolo = genRandom.nextInt((ALTEZZA_JPGIOCO/2)/2);
xVelivolo--;
}
// in caso contrario incrementa coordinata x
else xVelivolo++;
}
// se sto andando verso sinistra
else
{
if (pausaSx){
timerVelivolo.setDelay(periodoVelivolo);
pausaSx = false;
}
switch (contatorePause)
{
case 2 : { // pausa nella seconda metà
if (xVelivolo == pausa1)
{
timerVelivolo.stop();
timerVelivolo.setDelay(5000);
pausaSx = true;
timerVelivolo.restart();
contatorePause++;
}
}
case 3 : { // pausa nella prima metà
if (xVelivolo == pausa2)
{
timerVelivolo.stop();
timerVelivolo.setDelay(5000);
pausaSx = true;
timerVelivolo.restart();
contatorePause = 0;
}
}
}
// se ho passato bordo sinistro
if (xVelivolo < (-(larVelivolo)))
{
// ritorna verso destra e incrementa coordinata x
versoDestra = true;
pausa1 = genRandom.nextInt(LARGHEZZA_JPGIOCO/2);
pausa2 = genRandom.nextInt(LARGHEZZA_JPGIOCO/2) + LARGHEZZA_JPGIOCO/2;
yVelivolo = genRandom.nextInt((ALTEZZA_JPGIOCO/2)/2);
xVelivolo++;
}
// se invece sono nella finestra decrementa coordinata x
else xVelivolo--;
}
repaint();
}
/**
* Metodo che consente di disegnare le due animazioni e che controlla l'intersezione
* delle stesse
* @param gra : oggetto grafico del pannello
*/
public void paintComponent(Graphics gra){
//Si disegna il velivolo
Graphics2D gra2D = (Graphics2D) gra;
super.paintComponent(gra2D);
// se la forma è simbolica
if (simbolica)
{
// la costruisco
gra2D.setColor(Color.red);
gra2D.fillRect(xVelivolo, yVelivolo, larVelivolo, altVelivolo);
}
else
// altrimenti vi inserisco l'immagine
gra2D.drawImage(immagine, xVelivolo, yVelivolo, this);
//Si disegna il proiettile
gra2D.setColor(Color.yellow);
forma = new Ellipse2D.Double(xProiettile, yProiettile, 2*raggio, 2*raggio);
gra2D.fill(forma);
this.area = new Area(forma);
// se il velivolo e il proiettile si intersecano
if (area.intersects(xVelivolo, yVelivolo, larVelivolo, altVelivolo)){
// posiziono il proiettile nell'angolo in basso a sinistra
xProiettile = inixProiettile;
yProiettile = iniyProiettile;
// fermo la sua animazione
timerProiettile.stop();
// reimposto la partenza del velivolo (se dx o sx)
randomDirezione = genRandom.nextInt(2);
impostaDir(randomDirezione);
yVelivolo = genRandom.nextInt((ALTEZZA_JPGIOCO/2)/2);
// aggiorno i vari contatori e sentinelle
sentinellaFuoco = false;
contaColpi = rafficaColpi;
numColpi++;
numVelivoli++;
}
}
private Random genRandom = new Random(); // generatore di numeri casuali per le coordinate x e y del velivolo
public Area area; //calcola l'area del proiettile
public Image immagine; // immagine del velivolo
public Shape forma; //passa la forma del proiettile
public String formaVelivolo; // forma del velivolo
public Timer timerVelivolo, timerProiettile; //timer di aereo e proiettile
private boolean versoDestra; //decide il movimento dell'aereo
private boolean pausaDx, pausaSx; // sentinelle delle 2 pause
private double step; //step del proiettile
private double gConst; //costante di gravità
private double raggio; //raggio del proiettile
private double xProiettile, yProiettile, iniyProiettile, inixProiettile, VxProiettile, VyProiettile; //coordinate e velocità del proiettile
private double angProiettile, velProiettile; //angolo di alzo impostato dall'utente e velocità impostata dall'utente
private double velPTemporanea; // variabile di supporto per la velocità temporanea del proiettile
private int periodoVelivolo, periodoProiettile; //tempo di scansione di aereo e proiettile
private int xVelivolo, yVelivolo; //coordinata x dell'aereo
private int contatorePause; // contatore delle pause
private int pausa1, pausa2; // valori "x" delle pauseù
private int randomDirezione; // scelta casuale da dove partirà il velivolo, se dx o sx
public boolean simbolica; // sentinella della forma simbolica
public boolean sentinellaFuoco; // sentinella se si sta sparando
public int altVelivolo,larVelivolo; //altezza e larghezza forma simbolica
public int rafficaColpi; // numero dei colpi in una raffica
public int contaColpi; // contatore dei colpi della raffica dei colpi (1, 2, 3, 4)
public int velColpi; // velocità dei colpi data dal valore dello slider nelle Preferenze
public double angColpi; // angolatura dei colpi data dal valore dello slider nelle Preferenze
public int numColpi, numVelivoli; // numero dei colpi sparati e numero dei velivoli abbattuti, utili per il punteggio
// dimensioni pannello di gioco
private static final int ALTEZZA_JPGIOCO = 550;
private static final int LARGHEZZA_JPGIOCO = 600;
}