-
Notifications
You must be signed in to change notification settings - Fork 0
/
Obstacle.java
94 lines (83 loc) · 3.55 KB
/
Obstacle.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
package endlessrunningtcf;
import java.util.Vector;
public class Obstacle extends Object{
/**
* dati i parametri, costruisce la box dell'ostacolo e inizializza i parametri del moto
*/
public Obstacle(int y_, int width_, int lenght_, double speedx_,double speedy_, double accx_, Vector<Vector<Point>> map){
width = width_;
lenght = lenght_;
speedx = speedx_;
speedy = speedy_;
accx = accx_;
accy = -9.81;
box = new Vector<Vector<Point>>();
x = 0;
y = y_;
// qui inizializzo box
int mapl = map.size()-1; //la dimensione del vector "esterno" (width)
int mapw = map.firstElement().size()-1; //la dimensione del vector "interno" (andava bene un elemento qualsiasi)(lenght)
for(int i=mapl;i>mapl-lenght;i--){
Vector<Point> r = new Vector<Point>();
for(int j=mapw;j>mapw-width;j--){
map.get(i).get(j).setObstacle(true);
r.add(map.get(i).get(j));
}
box.add(r);
}
}
@Override
public void UpdatePosition(Vector<Vector<Point>> map, double time){
//calcolo del moto
int mapl = map.firstElement().size()-1;
int mapw = map.size()-1;
int newx = mapl;
int newy = mapw;
speedy = speedy + (accy * (time/1000));
y = y + ((speedy * (time/1000))+(.5 * accy * (time/1000) * (time/1000)));
speedx = speedx + (accx * (time/1000));
x = x + ((speedx * (time/1000))+(.5 * accx * (time/1000) * (time/1000)));
newy = mapw - 2*(int)(y); //il 2X riscala la map da 1m a quadretto a 0,5m a quadretto (personaggio di 2m e non 4)
newx = mapl - 2*(int)(x); //(int) fa il casting
if(newx-lenght<0){ //questi 2 if permettono agli ostacoli di scomparire se escono dalla map
lenght=newx;
}
if(newy-width<0){
width=newy;
}
if(y==0 || y<0){ //urto totalmente elastico con il pavimento (di massa infinita)
if(speedy<0.){ //se la velocità basta a risollevarsi conserva la quantità di moto
speedy = -speedy;
}
else if(speedy==0. || Math.abs(speedy)<0.5){ //annulliamo le volecità troppo basse
y = 0;
speedy = 0;
accy = 0;
}
}
//elimino l'ostacolo dalla mappa
for (Vector<Point> vb : box) {
for (Point pb : vb) {
pb.setObstacle(false);
}
}
box.removeAllElements();
//sposto i punti della box del personaggio
for(int i=newy;i>newy-width;i--){
Vector<Point> r = new Vector<Point>();
for(int j=newx;j>newx-lenght;j--){
r.add(map.get(i).get(j));
}
box.add(r);
}
//reinserisco l'ostacolo spostato
for (Vector<Point> vb : box) {
for (Point pb : vb) {
pb.setObstacle(true);
}
}
//l'operazione di mettere e togliere l'ostacolo è necassaria, non posso semplicemente svuotare tutta la mappa
//perché altrimenti eliminerei anche gli altri ostacoli, pur rimettendone solo uno, di conseguenza, preso un generico
//vettore di ostacoli, a ogni Update non ne rimarrebbe che l'ultimo
}
}