-
Notifications
You must be signed in to change notification settings - Fork 0
/
block.cpp
161 lines (146 loc) · 4.9 KB
/
block.cpp
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
#include "board.cpp"
//The 2 states of a block's orientation
#define BLOCK_VERTICAL true //The block
#define BLOCK_HORIZONTAL false
//The 2 states of a block's direction
#define DIRECTION_X true
#define DIRECTION_Z false
//The distance between the block's center of mass and the board
#define BLOCK_HAB 1.12
/**
* A class representing the dimensions of a block
*
* @fields x, y, z: the width, height, and depth of the block
* @field orientation: Whether this block is vertical or horizontal (used only for the controllable block)
* @field direction Whether this block is parrallel to the X-axis or Z-axis (used only for the controllable block when it's horizontal)
*/
class Dimensions{
public:
double x; double y; double z;
bool orientation;
bool direction;
Dimensions() {x = 0; y = 0; z = 0;}
Dimensions(double x, double y, double z, bool orientation, bool direction){
this->x = x;
this->y = y;
this->z = z;
this->orientation = orientation;
this->direction = direction;
}
//Switches the current orientation. Horizontal -> Vertical and Vertical -> Horizontal
void flipOrientation() { this->orientation = !(this->orientation); }
/**
* Flip the dimensions around the Z-axis
* If the block is vertical, simply call {@link #flipOrientation()} method and set {@link #orientation} to be prallel to the Z-axis
* Otherwise, if the block is horizontal and parallel to the Z-axis, then just call {@link #flipOrientation()}
*/
void flipZ(){
double temp = this->y;
this->y = this->z;
this->z = temp;
if(this->orientation == BLOCK_VERTICAL){
flipOrientation();
this->direction = DIRECTION_Z;
}
else if(this->direction == DIRECTION_Z) flipOrientation();
}
/**
* Flip the dimensions around the X-axis
* If the block is vertical, simply call {@link #flipOrientation()} method and set {@link #orientation} to be prallel to the X-axis
* Otherwise, if the block is horizontal and parallel to the X-axis, then just call {@link #flipOrientation()}
*/
void flipX(){
double temp = this->y;
this->y = this->x;
this->x = temp;
if(this->orientation == BLOCK_VERTICAL){
flipOrientation();
this->direction = DIRECTION_X;
}
else if(this->direction == DIRECTION_X) flipOrientation();
}
};
/**
* A class representation of a 3D block
*
* @field blockPosition: The position of the absolute center of the block
* @field blockDimens: The dimensions of the block (width, height, depth)
* @field blockColror: The color of the block in RGB
*/
class Block{
public:
Position blockPosition;
Dimensions blockDimens;
double blockColors[3];
Block() {}
Block(Position p, Dimensions d, double colors[3]){
this->blockPosition = p;
this->blockDimens = d;
this->blockColors[0] = colors[0];
this->blockColors[1] = colors[1];
this->blockColors[2] = colors[2];
}
//This method is called whenever the block's {@link #blockDimens.orientation} is changed
void updateY(){
if(this->blockDimens.orientation == BLOCK_VERTICAL)
this->blockPosition.y = BLOCK_HAB;
else
this->blockPosition.y = BLOCK_HAB - 0.5;
}
/**
* Moves the block forward by changing the z coordinate
* Change is originally -1.5
* If the block is horizontal and parallel to X-axis (flipping on it's side), modify that value by +0.5
* Then call {@link #blockDimens.flipZ()}
*/
void moveForwards() {
double c = -1.5;
if(this->blockDimens.orientation == BLOCK_HORIZONTAL &&
this->blockDimens.direction == DIRECTION_X) c += 0.5;
this->blockPosition.z += c;
this->blockDimens.flipZ();
updateY();
}
/**
* Moves the block to the left by changing the x coordinate
* Change is originally -1.5
* If the block is horizontal and parallel to Z-axis (flipping on it's side), modify that value by +0.5
* Then call {@link #blockDimens.flipX()}
*/
void moveLeft() {
double c = -1.5;
if(this->blockDimens.orientation == BLOCK_HORIZONTAL &&
this->blockDimens.direction == DIRECTION_Z) c += 0.5;
this->blockPosition.x += c;
this->blockDimens.flipX();
updateY();
}
/**
* Moves the block backwards by changing the z coordinate
* Change is originally +1.5
* If the block is horizontal and parallel to X-axis (flipping on it's side), modify that value by -0.5
* Then call {@link #blockDimens.flipZ()}
*/
void moveBackwards() {
double c = 1.5;
if(this->blockDimens.orientation == BLOCK_HORIZONTAL &&
this->blockDimens.direction == DIRECTION_X) c += -0.5;
this->blockPosition.z += c;
this->blockDimens.flipZ();
updateY();
}
/**
* Moves the block to the right by changing the x coordinate
* Change is originally +1.5
* If the block is horizontal and parallel to Z-axis (flipping on it's side), modify that value by -0.5
* Then call {@link #blockDimens.flipX()}
*/
void moveRight() {
double c = 1.5;
if(this->blockDimens.orientation == BLOCK_HORIZONTAL &&
this->blockDimens.direction == DIRECTION_Z) c += -0.5;
this->blockPosition.x += c;
this->blockDimens.flipX();
updateY();
}
};