ELEC2645 (2018/19) / Mbed 2 deprecated el17lw

Dependencies:   mbed

Committer:
lewisgw
Date:
Tue May 07 08:39:38 2019 +0000
Revision:
28:be77ad6c0bda
Parent:
27:c920c5ec31af
Child:
29:bdc4138b5171
Added a tests class to be run in main to test sprites on the LCD. Updated documentation.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lewisgw 2:16ae940b0aee 1 #include "Skateboarder.h"
lewisgw 21:20478f086bc2 2
lewisgw 21:20478f086bc2 3 // Define all sprite arrays.
lewisgw 9:fff2009f826e 4 int skate_right[17][10] = {
lewisgw 9:fff2009f826e 5 { 0,0,0,1,1,1,0,0,0,0 },
lewisgw 9:fff2009f826e 6 { 0,0,0,1,1,1,1,0,0,0 },
lewisgw 9:fff2009f826e 7 { 0,1,1,1,1,1,1,0,0,0 },
lewisgw 9:fff2009f826e 8 { 0,0,0,1,0,1,1,0,0,0 },
lewisgw 9:fff2009f826e 9 { 0,0,0,1,1,1,0,0,0,0 },
lewisgw 9:fff2009f826e 10 { 0,0,0,1,1,0,0,0,0,0 },
lewisgw 9:fff2009f826e 11 { 0,0,0,1,1,0,0,0,0,0 },
lewisgw 9:fff2009f826e 12 { 0,1,1,1,1,1,1,1,0,0 },
lewisgw 9:fff2009f826e 13 { 1,1,0,1,1,0,0,1,1,0 },
lewisgw 9:fff2009f826e 14 { 1,0,0,1,1,0,0,0,0,0 },
lewisgw 9:fff2009f826e 15 { 0,0,0,1,1,0,0,0,0,0 },
lewisgw 9:fff2009f826e 16 { 0,0,0,1,1,0,0,0,0,0 },
lewisgw 9:fff2009f826e 17 { 0,0,0,1,0,1,0,0,0,0 },
lewisgw 9:fff2009f826e 18 { 0,0,0,1,0,0,1,0,0,0 },
lewisgw 9:fff2009f826e 19 { 1,0,0,1,0,0,0,1,0,1 },
lewisgw 9:fff2009f826e 20 { 0,1,1,1,1,1,1,1,1,0 },
lewisgw 9:fff2009f826e 21 { 0,0,1,0,0,0,0,1,0,0 },
lewisgw 4:ce4eea1c2a28 22 };
lewisgw 4:ce4eea1c2a28 23
lewisgw 9:fff2009f826e 24 int skate_left[17][10] = {
lewisgw 9:fff2009f826e 25 { 0,0,0,0,1,1,1,0,0,0 },
lewisgw 9:fff2009f826e 26 { 0,0,0,1,1,1,1,0,0,0 },
lewisgw 9:fff2009f826e 27 { 0,0,0,1,1,1,1,1,1,0 },
lewisgw 9:fff2009f826e 28 { 0,0,0,1,1,0,1,0,0,0 },
lewisgw 9:fff2009f826e 29 { 0,0,0,0,1,1,1,0,0,0 },
lewisgw 9:fff2009f826e 30 { 0,0,0,0,0,1,1,0,0,0 },
lewisgw 28:be77ad6c0bda 31 { 0,0,0,0,0,1,1,0,0,0 },
lewisgw 9:fff2009f826e 32 { 0,1,1,1,1,1,1,1,0,0 },
lewisgw 28:be77ad6c0bda 33 { 0,0,0,0,1,1,1,1,1,0 },
lewisgw 9:fff2009f826e 34 { 0,0,0,0,1,1,0,0,1,0 },
lewisgw 28:be77ad6c0bda 35 { 0,0,0,0,1,1,0,0,1,0 },
lewisgw 9:fff2009f826e 36 { 0,0,0,0,1,1,0,0,0,0 },
lewisgw 9:fff2009f826e 37 { 0,0,0,1,0,1,0,0,0,0 },
lewisgw 9:fff2009f826e 38 { 0,0,1,0,0,1,0,0,0,0 },
lewisgw 9:fff2009f826e 39 { 1,1,0,0,0,1,0,0,0,1 },
lewisgw 9:fff2009f826e 40 { 0,1,1,1,1,1,1,1,1,0 },
lewisgw 9:fff2009f826e 41 { 0,0,0,1,0,0,0,0,1,0 },
lewisgw 3:28a3c118e071 42 };
lewisgw 3:28a3c118e071 43
lewisgw 9:fff2009f826e 44 int skate_stand_left[17][10] = {
lewisgw 9:fff2009f826e 45 { 0,0,0,0,1,1,0,0,0,0 },
lewisgw 9:fff2009f826e 46 { 0,0,0,1,1,1,1,0,0,0 },
lewisgw 9:fff2009f826e 47 { 0,0,0,1,1,1,1,1,1,0 },
lewisgw 9:fff2009f826e 48 { 0,0,0,1,0,0,1,0,0,0 },
lewisgw 9:fff2009f826e 49 { 0,0,0,1,1,1,1,0,0,0 },
lewisgw 9:fff2009f826e 50 { 0,0,0,0,1,1,0,0,0,0 },
lewisgw 9:fff2009f826e 51 { 0,0,0,1,1,1,1,0,0,0 },
lewisgw 9:fff2009f826e 52 { 0,0,1,1,1,1,0,1,0,0 },
lewisgw 9:fff2009f826e 53 { 1,1,0,1,1,1,0,1,0,0 },
lewisgw 9:fff2009f826e 54 { 0,0,0,1,1,1,0,0,0,0 },
lewisgw 9:fff2009f826e 55 { 0,0,1,1,1,1,0,0,0,0 },
lewisgw 9:fff2009f826e 56 { 1,0,1,0,0,1,0,0,0,0 },
lewisgw 9:fff2009f826e 57 { 1,1,0,0,0,1,0,0,0,0 },
lewisgw 9:fff2009f826e 58 { 0,1,0,0,0,1,0,0,0,0 },
lewisgw 9:fff2009f826e 59 { 1,0,1,0,0,1,0,0,0,0 },
lewisgw 9:fff2009f826e 60 { 0,0,0,1,0,1,0,0,0,0 },
lewisgw 9:fff2009f826e 61 { 0,0,1,0,1,1,1,0,0,0 },
lewisgw 3:28a3c118e071 62 };
lewisgw 3:28a3c118e071 63
lewisgw 9:fff2009f826e 64 int skate_stand_right[17][10] = {
lewisgw 9:fff2009f826e 65 { 0,0,0,1,1,0,0,0,0,0 },
lewisgw 9:fff2009f826e 66 { 0,0,1,1,1,1,0,0,0,0 },
lewisgw 9:fff2009f826e 67 { 1,1,1,1,1,1,0,0,0,0 },
lewisgw 9:fff2009f826e 68 { 0,0,1,0,0,1,0,0,0,0 },
lewisgw 9:fff2009f826e 69 { 0,0,1,1,1,1,0,0,0,0 },
lewisgw 9:fff2009f826e 70 { 0,0,0,1,1,0,0,0,0,0 },
lewisgw 9:fff2009f826e 71 { 0,0,1,1,1,1,0,0,0,0 },
lewisgw 9:fff2009f826e 72 { 0,1,1,1,1,0,1,0,0,0 },
lewisgw 9:fff2009f826e 73 { 1,0,1,1,1,0,0,1,0,0 },
lewisgw 9:fff2009f826e 74 { 1,0,1,1,1,0,0,0,0,0 },
lewisgw 9:fff2009f826e 75 { 0,0,1,1,1,1,1,0,0,0 },
lewisgw 9:fff2009f826e 76 { 0,0,1,0,0,0,1,0,1,0 },
lewisgw 9:fff2009f826e 77 { 0,0,1,0,0,0,1,1,0,0 },
lewisgw 9:fff2009f826e 78 { 0,0,1,0,0,0,1,0,1,0 },
lewisgw 9:fff2009f826e 79 { 0,0,1,0,0,1,0,0,0,0 },
lewisgw 9:fff2009f826e 80 { 0,0,1,0,1,0,0,0,0,0 },
lewisgw 9:fff2009f826e 81 { 0,1,1,1,0,1,0,0,0,0 },
lewisgw 3:28a3c118e071 82 };
lewisgw 3:28a3c118e071 83
lewisgw 9:fff2009f826e 84 int skate_duck_right[17][10] = {
lewisgw 9:fff2009f826e 85 { 0,0,0,0,0,0,0,0,0,0 },
lewisgw 9:fff2009f826e 86 { 0,0,0,0,0,0,0,0,0,0 },
lewisgw 9:fff2009f826e 87 { 0,0,0,0,0,0,0,0,0,0 },
lewisgw 9:fff2009f826e 88 { 0,0,0,0,0,0,0,0,0,0 },
lewisgw 9:fff2009f826e 89 { 0,0,0,0,1,1,0,0,0,0 },
lewisgw 9:fff2009f826e 90 { 0,0,0,1,1,1,1,0,0,0 },
lewisgw 9:fff2009f826e 91 { 0,1,1,1,1,1,1,0,0,0 },
lewisgw 9:fff2009f826e 92 { 0,0,0,1,0,0,1,0,0,0 },
lewisgw 9:fff2009f826e 93 { 0,0,0,0,1,1,0,0,0,0 },
lewisgw 9:fff2009f826e 94 { 0,0,1,1,1,1,1,1,0,0 },
lewisgw 9:fff2009f826e 95 { 0,1,0,1,1,1,1,0,1,1 },
lewisgw 9:fff2009f826e 96 { 1,0,0,1,1,1,1,0,0,0 },
lewisgw 9:fff2009f826e 97 { 0,0,0,1,1,1,1,0,0,0 },
lewisgw 9:fff2009f826e 98 { 0,0,1,1,0,0,1,1,0,0 },
lewisgw 9:fff2009f826e 99 { 1,0,1,1,0,0,1,1,0,1 },
lewisgw 9:fff2009f826e 100 { 0,1,1,1,1,1,1,1,1,0 },
lewisgw 9:fff2009f826e 101 { 0,0,1,0,0,0,0,1,0,0 },
lewisgw 4:ce4eea1c2a28 102 };
lewisgw 4:ce4eea1c2a28 103
lewisgw 4:ce4eea1c2a28 104 int skate_duck_left[17][10] = {
lewisgw 9:fff2009f826e 105 { 0,0,0,0,0,0,0,0,0,0 },
lewisgw 9:fff2009f826e 106 { 0,0,0,0,0,0,0,0,0,0 },
lewisgw 9:fff2009f826e 107 { 0,0,0,0,0,0,0,0,0,0 },
lewisgw 9:fff2009f826e 108 { 0,0,0,0,0,0,0,0,0,0 },
lewisgw 9:fff2009f826e 109 { 0,0,0,0,1,1,0,0,0,0 },
lewisgw 9:fff2009f826e 110 { 0,0,0,1,1,1,1,0,0,0 },
lewisgw 9:fff2009f826e 111 { 0,0,0,1,1,1,1,1,1,0 },
lewisgw 9:fff2009f826e 112 { 0,0,0,1,0,0,1,0,0,0 },
lewisgw 9:fff2009f826e 113 { 0,0,0,0,1,1,0,0,0,0 },
lewisgw 9:fff2009f826e 114 { 0,0,1,1,1,1,1,1,0,0 },
lewisgw 9:fff2009f826e 115 { 1,1,0,1,1,1,1,0,1,0 },
lewisgw 9:fff2009f826e 116 { 0,0,0,1,1,1,1,0,0,1 },
lewisgw 9:fff2009f826e 117 { 0,0,0,1,1,1,1,0,0,0 },
lewisgw 9:fff2009f826e 118 { 0,0,1,1,0,0,1,1,0,0 },
lewisgw 9:fff2009f826e 119 { 1,0,1,1,0,0,1,1,0,1 },
lewisgw 9:fff2009f826e 120 { 0,1,1,1,1,1,1,1,1,0 },
lewisgw 9:fff2009f826e 121 { 0,0,1,0,0,0,0,1,0,0 },
lewisgw 3:28a3c118e071 122 };
lewisgw 3:28a3c118e071 123
lewisgw 10:8bf3713d9e9c 124 // Constructor and destructor.
lewisgw 9:fff2009f826e 125 Skateboarder::Skateboarder() {}
lewisgw 2:16ae940b0aee 126
lewisgw 9:fff2009f826e 127 Skateboarder::~Skateboarder() {}
lewisgw 2:16ae940b0aee 128
lewisgw 9:fff2009f826e 129 void Skateboarder::set_x_position_and_sprite(
lewisgw 9:fff2009f826e 130 float joy_x,
lewisgw 9:fff2009f826e 131 int moving_counter,
lewisgw 21:20478f086bc2 132 Skate_direction direction,
lewisgw 14:9861fe85c803 133 float joy_y) {
lewisgw 9:fff2009f826e 134 _skate_direction = direction;
lewisgw 9:fff2009f826e 135 _moving_counter = moving_counter;
lewisgw 26:4253656c0755 136 process_x_variables(joy_x);
lewisgw 26:4253656c0755 137 _x = 40 + 0.4*_moving_counter; // Moving counter is scaled for speed control.
lewisgw 14:9861fe85c803 138 check_duck(joy_y);
lewisgw 9:fff2009f826e 139 }
lewisgw 9:fff2009f826e 140
lewisgw 21:20478f086bc2 141 void Skateboarder::process_x_variables(float joy_x) {
lewisgw 21:20478f086bc2 142 if (joy_x > float(0.1)) { // If skater is moving right.
lewisgw 21:20478f086bc2 143 _moving_counter = _moving_counter++; // To be added to current X position.
lewisgw 21:20478f086bc2 144 _skate_direction = Right; // skate direction enum keeps track of last
lewisgw 21:20478f086bc2 145 // direction for not moving situation.
lewisgw 2:16ae940b0aee 146 _sprite_value = Skate_right;
lewisgw 21:20478f086bc2 147 } else if (joy_x < float(-0.1)) { // If skater is moving left.
lewisgw 2:16ae940b0aee 148 _moving_counter = _moving_counter--;
lewisgw 2:16ae940b0aee 149 _skate_direction = Left;
lewisgw 2:16ae940b0aee 150 _sprite_value = Skate_left;
lewisgw 21:20478f086bc2 151 } else if (_skate_direction == Left) { // Skater is not moving.
lewisgw 2:16ae940b0aee 152 _sprite_value = Stand_left;
lewisgw 9:fff2009f826e 153 } else {
lewisgw 2:16ae940b0aee 154 _sprite_value = Stand_right;
lewisgw 9:fff2009f826e 155 }
lewisgw 9:fff2009f826e 156 }
lewisgw 9:fff2009f826e 157
lewisgw 9:fff2009f826e 158 void Skateboarder::check_duck(float joy_y) {
lewisgw 21:20478f086bc2 159 // Re-write Sprite_value with correct direction if the duck condition is met.
lewisgw 9:fff2009f826e 160 if (joy_y < -0.1 && _skate_direction == Right) {
lewisgw 4:ce4eea1c2a28 161 _sprite_value = Skate_duck_right;
lewisgw 9:fff2009f826e 162 } else if (joy_y < -0.1 && _skate_direction == Left) {
lewisgw 4:ce4eea1c2a28 163 _sprite_value = Skate_duck_left;
lewisgw 9:fff2009f826e 164 }
lewisgw 9:fff2009f826e 165 }
lewisgw 21:20478f086bc2 166
lewisgw 21:20478f086bc2 167 void Skateboarder::set_y_position(
lewisgw 21:20478f086bc2 168 bool jump,
lewisgw 21:20478f086bc2 169 int jump_counter,
lewisgw 21:20478f086bc2 170 int level_condition,
lewisgw 21:20478f086bc2 171 Gamepad &gamepad) {
lewisgw 9:fff2009f826e 172 _jump_counter = jump_counter;
lewisgw 10:8bf3713d9e9c 173 _level_condition = level_condition;
lewisgw 27:c920c5ec31af 174 // Jump condition. Jump from A button must be true and counter less than 35 to
lewisgw 27:c920c5ec31af 175 // limit double jump.
lewisgw 27:c920c5ec31af 176 if (jump && _jump_counter < 35) {
lewisgw 21:20478f086bc2 177 _jump_counter = 40; // Controls height and fall time.
lewisgw 21:20478f086bc2 178 gamepad.tone(440, 0.05); // Buzzer jump sound.
lewisgw 20:a8cad4e044ea 179 wait(0.05);
lewisgw 20:a8cad4e044ea 180 gamepad.tone(880, 0.05);
lewisgw 20:a8cad4e044ea 181 }
lewisgw 26:4253656c0755 182 if (_jump_counter !=0) _jump_counter--; // Keep falling until not jumping.
lewisgw 21:20478f086bc2 183 if (_level_condition == 1 && jump){ // If skater is under / on-top of upper
lewisgw 21:20478f086bc2 184 // platforms, will jump to / stay on upper platforms.
lewisgw 10:8bf3713d9e9c 185 _level = 5;
lewisgw 10:8bf3713d9e9c 186 } else if (_level_condition == 0) {
lewisgw 10:8bf3713d9e9c 187 _level = 23;
lewisgw 10:8bf3713d9e9c 188 }
lewisgw 21:20478f086bc2 189 _y = _level - 0.5*_jump_counter; // Level offsets Y for approprite platform
lewisgw 21:20478f086bc2 190 // and scaled jump counter to control height.
lewisgw 9:fff2009f826e 191 }
lewisgw 2:16ae940b0aee 192
lewisgw 9:fff2009f826e 193 int Skateboarder::get_x_position() {
lewisgw 9:fff2009f826e 194 return _x;
lewisgw 9:fff2009f826e 195 }
lewisgw 2:16ae940b0aee 196
lewisgw 9:fff2009f826e 197 int Skateboarder::get_moving_counter() {
lewisgw 9:fff2009f826e 198 return _moving_counter;
lewisgw 9:fff2009f826e 199 }
lewisgw 2:16ae940b0aee 200
lewisgw 9:fff2009f826e 201 int Skateboarder::get_y_position() {
lewisgw 9:fff2009f826e 202 return _y;
lewisgw 9:fff2009f826e 203 }
lewisgw 2:16ae940b0aee 204
lewisgw 9:fff2009f826e 205 int Skateboarder::get_jump_counter() {
lewisgw 9:fff2009f826e 206 return _jump_counter;
lewisgw 9:fff2009f826e 207 }
lewisgw 3:28a3c118e071 208
lewisgw 21:20478f086bc2 209 Skate_direction Skateboarder::get_direction() {
lewisgw 9:fff2009f826e 210 return _skate_direction;
lewisgw 9:fff2009f826e 211 }
lewisgw 2:16ae940b0aee 212
lewisgw 9:fff2009f826e 213 Sprite_value Skateboarder::get_sprite_value() {
lewisgw 9:fff2009f826e 214 return _sprite_value;
lewisgw 9:fff2009f826e 215 }
lewisgw 3:28a3c118e071 216
lewisgw 9:fff2009f826e 217 int * Skateboarder::get_sprite(Sprite_value sprite) {
lewisgw 26:4253656c0755 218 // Return correct sprite.
lewisgw 9:fff2009f826e 219 if (sprite == Skate_right) {
lewisgw 3:28a3c118e071 220 return *skate_right;
lewisgw 9:fff2009f826e 221 } else if (sprite == Skate_left) {
lewisgw 3:28a3c118e071 222 return *skate_left;
lewisgw 9:fff2009f826e 223 } else if (sprite == Stand_left) {
lewisgw 4:ce4eea1c2a28 224 return *skate_stand_left;
lewisgw 9:fff2009f826e 225 } else if (sprite == Skate_duck_right) {
lewisgw 4:ce4eea1c2a28 226 return *skate_duck_right;
lewisgw 9:fff2009f826e 227 } else if (sprite == Skate_duck_left) {
lewisgw 4:ce4eea1c2a28 228 return *skate_duck_left;
lewisgw 9:fff2009f826e 229 } else {
lewisgw 4:ce4eea1c2a28 230 return *skate_stand_right;
lewisgw 9:fff2009f826e 231 }
lewisgw 8:5327418f823a 232 }
lewisgw 8:5327418f823a 233
lewisgw 20:a8cad4e044ea 234 void Skateboarder::fall(bool fall_flag, Gamepad &gamepad) {
lewisgw 26:4253656c0755 235 // Falling sequence.
lewisgw 9:fff2009f826e 236 _fall_flag = fall_flag;
lewisgw 9:fff2009f826e 237 _y++;
lewisgw 21:20478f086bc2 238 gamepad.tone(int(-15.8*_y + 1363), 0.05); // Linear equation makes decending
lewisgw 21:20478f086bc2 239 // frequency sound.
lewisgw 21:20478f086bc2 240 wait(0.005); // Control fall time and fall sound speed.
lewisgw 26:4253656c0755 241 if (_y == 80) { // Stop falling when y = 80.
lewisgw 9:fff2009f826e 242 _fall_flag = false;
lewisgw 9:fff2009f826e 243 _reset_flag = true;
lewisgw 9:fff2009f826e 244 }
lewisgw 9:fff2009f826e 245 }
lewisgw 8:5327418f823a 246
lewisgw 8:5327418f823a 247 bool Skateboarder::get_fall_flag() {
lewisgw 9:fff2009f826e 248 return _fall_flag;
lewisgw 9:fff2009f826e 249 }
lewisgw 8:5327418f823a 250
lewisgw 8:5327418f823a 251 bool Skateboarder::get_reset_flag() {
lewisgw 9:fff2009f826e 252 return _reset_flag;
lewisgw 9:fff2009f826e 253 }
lewisgw 8:5327418f823a 254
lewisgw 8:5327418f823a 255 void Skateboarder::set_reset_flag(bool flag) {
lewisgw 9:fff2009f826e 256 if (flag) {
lewisgw 9:fff2009f826e 257 _reset_flag = true;
lewisgw 9:fff2009f826e 258 } else {
lewisgw 9:fff2009f826e 259 _reset_flag = false;
lewisgw 9:fff2009f826e 260 }
lewisgw 9:fff2009f826e 261 }
lewisgw 8:5327418f823a 262
lewisgw 8:5327418f823a 263