Uses accompanying Basket, Objects and Fruit libraries to create Fruit Basket game. If an object is caught, points are added; if an object in missed, a 'life' is lost.

Dependents:   Game_Controller_Project

Committer:
Nathanj94
Date:
Fri Apr 28 17:15:01 2017 +0000
Revision:
15:1a0bd800f1f1
Parent:
14:6764bb61d413
Child:
16:dae98691cc0e
Added an extra function called final_score that displays the game over screen with the correct score to fix an issue where the final score displayed would be incorrect or '0000'

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Nathanj94 0:8d02400f792a 1 #include "Catch_Model.h"
Nathanj94 0:8d02400f792a 2
Nathanj94 0:8d02400f792a 3 Catch_Model::Catch_Model()
Nathanj94 0:8d02400f792a 4 {
Nathanj94 0:8d02400f792a 5
Nathanj94 0:8d02400f792a 6 }
Nathanj94 0:8d02400f792a 7
Nathanj94 0:8d02400f792a 8 Catch_Model::~Catch_Model()
Nathanj94 0:8d02400f792a 9 {
Nathanj94 0:8d02400f792a 10
Nathanj94 0:8d02400f792a 11 }
Nathanj94 13:ae2dac4ab786 12 //INITILISATION FUNCTIONS//
Nathanj94 14:6764bb61d413 13 //Sets values used to initialise Basket and Objects, sets number of lives
Nathanj94 4:84e29254b988 14 void Catch_Model::init(int basket_y, int basket_width, int objects_speed, int lives)
Nathanj94 0:8d02400f792a 15 {
Nathanj94 0:8d02400f792a 16 _basket_y = basket_y;
Nathanj94 0:8d02400f792a 17 _basket_width = basket_width;
Nathanj94 1:43fbcc3584d6 18 _objects_speed = objects_speed;
Nathanj94 4:84e29254b988 19 _lives = lives;
Nathanj94 14:6764bb61d413 20 _delay = 1; //if this equals 1, check_a and check_b can be called
Nathanj94 1:43fbcc3584d6 21
Nathanj94 4:84e29254b988 22 basket.init(_basket_y, _basket_width);
Nathanj94 4:84e29254b988 23 objects.init(_objects_speed);
Nathanj94 0:8d02400f792a 24 }
Nathanj94 0:8d02400f792a 25
Nathanj94 14:6764bb61d413 26 //UPDATE FUNCTIONS//
Nathanj94 14:6764bb61d413 27 //Read input of joystick and assign the direction and magnitude to variables
Nathanj94 0:8d02400f792a 28 void Catch_Model::input(Gamepad &pad)
Nathanj94 0:8d02400f792a 29 {
Nathanj94 0:8d02400f792a 30 _d = pad.get_direction();
Nathanj94 0:8d02400f792a 31 _mag = pad.get_mag();
Nathanj94 0:8d02400f792a 32 }
Nathanj94 0:8d02400f792a 33
Nathanj94 14:6764bb61d413 34 //Update the game score/lives and move the basket/objects
Nathanj94 3:fc9133faec7a 35 void Catch_Model::update(N5110 &lcd, Gamepad &pad)
Nathanj94 0:8d02400f792a 36 {
Nathanj94 14:6764bb61d413 37 check_basket_catch(lcd, pad); //check for basket catch/miss before updating positions
Nathanj94 14:6764bb61d413 38 check_basket_miss(lcd, pad); //as that aspect must take priority
Nathanj94 3:fc9133faec7a 39
Nathanj94 10:6605cd9d374b 40 basket.move_stick(_d, _mag);
Nathanj94 10:6605cd9d374b 41 basket.move_LR(pad);
Nathanj94 12:f7d6003e5c6b 42 objects.move(_objects_speed);
Nathanj94 0:8d02400f792a 43 }
Nathanj94 0:8d02400f792a 44
Nathanj94 13:ae2dac4ab786 45 //GAME RULES FUNCTIONS//
Nathanj94 14:6764bb61d413 46 //Check if the object is caught
Nathanj94 3:fc9133faec7a 47 void Catch_Model::check_basket_catch(N5110 &lcd, Gamepad &pad)
Nathanj94 2:8410e09b77aa 48 {
Nathanj94 4:84e29254b988 49 int b_x_pos = basket.get_x();
Nathanj94 4:84e29254b988 50 int b_y_pos = basket.get_y();
Nathanj94 4:84e29254b988 51 int o_x_pos = objects.get_x();
Nathanj94 4:84e29254b988 52 int o_y_pos = objects.get_y();
Nathanj94 14:6764bb61d413 53
Nathanj94 14:6764bb61d413 54 //object y greater than/equal to basket y...
Nathanj94 14:6764bb61d413 55 //...and object x greater than/equal to basket x...
Nathanj94 14:6764bb61d413 56 //...and object x less than/equal to basket x+6 to compensate for width of object beyond x+6
Nathanj94 3:fc9133faec7a 57 if(
Nathanj94 14:6764bb61d413 58 (o_y_pos >= b_y_pos) &&
Nathanj94 14:6764bb61d413 59 (o_x_pos >= b_x_pos) &&
Nathanj94 14:6764bb61d413 60 (o_x_pos <= (b_x_pos + 6))
Nathanj94 3:fc9133faec7a 61 ) {
Nathanj94 8:db24c475f64f 62 pad.tone(1000, 0.2);
Nathanj94 14:6764bb61d413 63 objects.undraw(lcd); //FILL_WHITE so object disappears
Nathanj94 14:6764bb61d413 64 add_score(); //object has a variable that adds correct amount of score
Nathanj94 14:6764bb61d413 65 objects.init(_objects_speed); //drop another object upon contact
Nathanj94 3:fc9133faec7a 66 }
Nathanj94 2:8410e09b77aa 67 }
Nathanj94 2:8410e09b77aa 68
Nathanj94 14:6764bb61d413 69 //Check if the object is not caught
Nathanj94 3:fc9133faec7a 70 void Catch_Model::check_basket_miss(N5110 &lcd, Gamepad &pad)
Nathanj94 2:8410e09b77aa 71 {
Nathanj94 14:6764bb61d413 72 int b_y_pos = basket.get_y(); //x co-ordinates unnecessary
Nathanj94 14:6764bb61d413 73 int o_y_pos = objects.get_y(); //if x does not satisfy check_basket_catch, it will satisfy this
Nathanj94 3:fc9133faec7a 74
Nathanj94 6:61bcf98e0a88 75 int score_var;
Nathanj94 14:6764bb61d413 76 score_var = objects.get_score_var();
Nathanj94 6:61bcf98e0a88 77
Nathanj94 3:fc9133faec7a 78 if (o_y_pos > b_y_pos) {
Nathanj94 4:84e29254b988 79 objects.undraw(lcd);
Nathanj94 14:6764bb61d413 80 if (score_var != 5) { //if antifruit misses do nothing, otherwise reduce lives
Nathanj94 6:61bcf98e0a88 81 _lives--;
Nathanj94 14:6764bb61d413 82 }
Nathanj94 8:db24c475f64f 83 pad.tone(100, 0.2);
Nathanj94 14:6764bb61d413 84 objects.init(_objects_speed); //drop another object upon contact
Nathanj94 9:902b67101cdc 85 }
Nathanj94 3:fc9133faec7a 86 }
Nathanj94 3:fc9133faec7a 87
Nathanj94 14:6764bb61d413 88 //Check which object is current and add appropriate score
Nathanj94 13:ae2dac4ab786 89 void Catch_Model::add_score()
Nathanj94 13:ae2dac4ab786 90 {
Nathanj94 13:ae2dac4ab786 91 int score_var;
Nathanj94 13:ae2dac4ab786 92 score_var = objects.get_score_var();
Nathanj94 13:ae2dac4ab786 93
Nathanj94 14:6764bb61d413 94 if (score_var == 1) { //strawberry = 1
Nathanj94 13:ae2dac4ab786 95 basket.add_score_1();
Nathanj94 14:6764bb61d413 96 } else if (score_var == 2) { //pineapple = 2
Nathanj94 13:ae2dac4ab786 97 basket.add_score_2();
Nathanj94 14:6764bb61d413 98 } else if (score_var == 3) { //pear = 5
Nathanj94 13:ae2dac4ab786 99 basket.add_score_5();
Nathanj94 14:6764bb61d413 100 } else if (score_var == 4) { //melon = 10
Nathanj94 13:ae2dac4ab786 101 basket.add_score_10();
Nathanj94 14:6764bb61d413 102 } else { //antifruit - if caught, reduce lives instead of add score
Nathanj94 13:ae2dac4ab786 103 _lives--;
Nathanj94 13:ae2dac4ab786 104 }
Nathanj94 13:ae2dac4ab786 105 }
Nathanj94 13:ae2dac4ab786 106
Nathanj94 14:6764bb61d413 107 //Return number of lives
Nathanj94 13:ae2dac4ab786 108 int Catch_Model::get_lives()
Nathanj94 13:ae2dac4ab786 109 {
Nathanj94 13:ae2dac4ab786 110 return _lives;
Nathanj94 13:ae2dac4ab786 111 }
Nathanj94 13:ae2dac4ab786 112
Nathanj94 13:ae2dac4ab786 113 //BUTTON FUNCTIONS//
Nathanj94 14:6764bb61d413 114 //If A is pressed, reset the object
Nathanj94 8:db24c475f64f 115 void Catch_Model::check_a(N5110 &lcd, Gamepad &pad)
Nathanj94 7:ec6dc66ee196 116 {
Nathanj94 7:ec6dc66ee196 117 if (
Nathanj94 7:ec6dc66ee196 118 (pad.check_event(Gamepad::A_PRESSED) == true) &&
Nathanj94 14:6764bb61d413 119 (_delay == 1) //delay stops powerups from being over-used
Nathanj94 7:ec6dc66ee196 120 ) {
Nathanj94 9:902b67101cdc 121 objects.undraw(lcd);
Nathanj94 9:902b67101cdc 122 objects.init(_objects_speed);
Nathanj94 14:6764bb61d413 123
Nathanj94 14:6764bb61d413 124 //while _delay = 0, A and B can't be used...
Nathanj94 14:6764bb61d413 125 //...in 10 seconds _delay = 1, A and B can be used again
Nathanj94 14:6764bb61d413 126 _delay = 0;
Nathanj94 14:6764bb61d413 127 timeout.attach(this, &Catch_Model::set_delay, 10.0);
Nathanj94 14:6764bb61d413 128 }
Nathanj94 14:6764bb61d413 129
Nathanj94 14:6764bb61d413 130 }
Nathanj94 14:6764bb61d413 131
Nathanj94 14:6764bb61d413 132 //If B is pressed, give another life
Nathanj94 14:6764bb61d413 133 void Catch_Model::check_b(N5110 &lcd, Gamepad &pad)
Nathanj94 14:6764bb61d413 134 {
Nathanj94 14:6764bb61d413 135 if (
Nathanj94 14:6764bb61d413 136 (pad.check_event(Gamepad::B_PRESSED) == true) &&
Nathanj94 14:6764bb61d413 137 (_delay == 1) //delay stops powerups from being over-used
Nathanj94 14:6764bb61d413 138 ) {
Nathanj94 14:6764bb61d413 139 _lives++;
Nathanj94 14:6764bb61d413 140
Nathanj94 14:6764bb61d413 141 //while _delay = 0, A and B can't be used...
Nathanj94 14:6764bb61d413 142 //...in 10 seconds _delay = 1, A and B can be used again
Nathanj94 9:902b67101cdc 143 _delay = 0;
Nathanj94 9:902b67101cdc 144 timeout.attach(this, &Catch_Model::set_delay, 10.0);
Nathanj94 8:db24c475f64f 145 }
Nathanj94 8:db24c475f64f 146
Nathanj94 8:db24c475f64f 147 }
Nathanj94 8:db24c475f64f 148
Nathanj94 14:6764bb61d413 149 //10 seconds after A or B is pressed, _delay = 1
Nathanj94 7:ec6dc66ee196 150 void Catch_Model::set_delay()
Nathanj94 7:ec6dc66ee196 151 {
Nathanj94 7:ec6dc66ee196 152 _delay = 1;
Nathanj94 7:ec6dc66ee196 153 }
Nathanj94 8:db24c475f64f 154
Nathanj94 13:ae2dac4ab786 155 //DISPLAY FUNCTIONS//
Nathanj94 14:6764bb61d413 156 //Re-draw the screen after updates to positions, scores etc are made
Nathanj94 15:1a0bd800f1f1 157 void Catch_Model::draw(N5110 &lcd, Gamepad &pad)
Nathanj94 5:7db3e43e5aca 158 {
Nathanj94 13:ae2dac4ab786 159 basket.draw(lcd);
Nathanj94 13:ae2dac4ab786 160 objects.draw(lcd);
Nathanj94 13:ae2dac4ab786 161 print_score(lcd);
Nathanj94 13:ae2dac4ab786 162 print_lives(lcd);
Nathanj94 13:ae2dac4ab786 163 print_delay(lcd);
Nathanj94 15:1a0bd800f1f1 164
Nathanj94 15:1a0bd800f1f1 165 if(get_lives() == 0)
Nathanj94 15:1a0bd800f1f1 166 {
Nathanj94 15:1a0bd800f1f1 167 do{
Nathanj94 15:1a0bd800f1f1 168 lcd.clear();
Nathanj94 15:1a0bd800f1f1 169 final_score(lcd);
Nathanj94 15:1a0bd800f1f1 170 } while (pad.check_event(Gamepad::START_PRESSED) == false);
Nathanj94 15:1a0bd800f1f1 171 }
Nathanj94 4:84e29254b988 172 }
Nathanj94 4:84e29254b988 173
Nathanj94 14:6764bb61d413 174 //Get the number of lives and print on the display
Nathanj94 4:84e29254b988 175 void Catch_Model::print_lives(N5110 &lcd)
Nathanj94 4:84e29254b988 176 {
Nathanj94 4:84e29254b988 177 char buffer[14];
Nathanj94 4:84e29254b988 178 int lives = get_lives();
Nathanj94 4:84e29254b988 179
Nathanj94 4:84e29254b988 180 int print_lives = sprintf(buffer, "LIVES:%d", lives);
Nathanj94 4:84e29254b988 181 if (print_lives <= 14) {
Nathanj94 4:84e29254b988 182 lcd.printString(buffer,0,0);
Nathanj94 4:84e29254b988 183 lcd.refresh();
Nathanj94 4:84e29254b988 184 }
Nathanj94 4:84e29254b988 185 }
Nathanj94 4:84e29254b988 186
Nathanj94 14:6764bb61d413 187 //Get the score and print on the display
Nathanj94 3:fc9133faec7a 188 void Catch_Model::print_score(N5110 &lcd)
Nathanj94 3:fc9133faec7a 189 {
Nathanj94 3:fc9133faec7a 190 char buffer[14];
Nathanj94 4:84e29254b988 191 int score = basket.get_score();
Nathanj94 2:8410e09b77aa 192
Nathanj94 4:84e29254b988 193 int print_score;
Nathanj94 4:84e29254b988 194
Nathanj94 14:6764bb61d413 195 if ((score == 0)||(score <= 9)) { //if loop keeps the length of the string fixed...
Nathanj94 4:84e29254b988 196 print_score = sprintf(buffer, "000%d", score);
Nathanj94 4:84e29254b988 197 } else if (score <= 99) {
Nathanj94 4:84e29254b988 198 print_score = sprintf(buffer, "00%2d", score);
Nathanj94 4:84e29254b988 199 } else if (score <= 999 ) {
Nathanj94 4:84e29254b988 200 print_score = sprintf(buffer, "0%3d", score);
Nathanj94 4:84e29254b988 201 } else {
Nathanj94 4:84e29254b988 202 print_score = sprintf(buffer, "%4d", score);
Nathanj94 14:6764bb61d413 203 } //...with maximum printable score of 9999
Nathanj94 4:84e29254b988 204
Nathanj94 3:fc9133faec7a 205 if (print_score <= 14) {
Nathanj94 4:84e29254b988 206 lcd.printString(buffer,59,0);
Nathanj94 3:fc9133faec7a 207 lcd.refresh();
Nathanj94 3:fc9133faec7a 208 }
Nathanj94 3:fc9133faec7a 209 }
Nathanj94 14:6764bb61d413 210
Nathanj94 15:1a0bd800f1f1 211 void Catch_Model::final_score(N5110 &lcd)
Nathanj94 15:1a0bd800f1f1 212 {
Nathanj94 15:1a0bd800f1f1 213 char buffer[14];
Nathanj94 15:1a0bd800f1f1 214 int score = basket.get_score();
Nathanj94 15:1a0bd800f1f1 215
Nathanj94 15:1a0bd800f1f1 216 int print_score;
Nathanj94 15:1a0bd800f1f1 217
Nathanj94 15:1a0bd800f1f1 218 if ((score == 0)||(score <= 9)) { //if loop keeps the length of the string fixed...
Nathanj94 15:1a0bd800f1f1 219 print_score = sprintf(buffer, "000%d", score);
Nathanj94 15:1a0bd800f1f1 220 } else if (score <= 99) {
Nathanj94 15:1a0bd800f1f1 221 print_score = sprintf(buffer, "00%2d", score);
Nathanj94 15:1a0bd800f1f1 222 } else if (score <= 999 ) {
Nathanj94 15:1a0bd800f1f1 223 print_score = sprintf(buffer, "0%3d", score);
Nathanj94 15:1a0bd800f1f1 224 } else {
Nathanj94 15:1a0bd800f1f1 225 print_score = sprintf(buffer, "%4d", score);
Nathanj94 15:1a0bd800f1f1 226 } //...with maximum printable score of 9999
Nathanj94 15:1a0bd800f1f1 227
Nathanj94 15:1a0bd800f1f1 228 lcd.printString(" GAME OVER ",0,2);
Nathanj94 15:1a0bd800f1f1 229 if (print_score <= 14) {
Nathanj94 15:1a0bd800f1f1 230 lcd.printString(buffer,34,3);
Nathanj94 15:1a0bd800f1f1 231 lcd.refresh();
Nathanj94 15:1a0bd800f1f1 232 }
Nathanj94 15:1a0bd800f1f1 233 }
Nathanj94 15:1a0bd800f1f1 234
Nathanj94 14:6764bb61d413 235 //Print a tick if _delay = 1, otherwise print a cross
Nathanj94 8:db24c475f64f 236 void Catch_Model::print_delay(N5110 &lcd)
Nathanj94 8:db24c475f64f 237 {
Nathanj94 8:db24c475f64f 238 if (_delay == 1) {
Nathanj94 8:db24c475f64f 239 lcd.drawLine(46,4,50,8,1);
Nathanj94 8:db24c475f64f 240 lcd.drawLine(50,8,54,0,1);
Nathanj94 8:db24c475f64f 241 } else {
Nathanj94 8:db24c475f64f 242 lcd.drawLine(46,0,54,8,1);
Nathanj94 8:db24c475f64f 243 lcd.drawLine(46,8,54,0,1);
Nathanj94 13:ae2dac4ab786 244 }
Nathanj94 8:db24c475f64f 245 }