ECE2035 class project

Dependencies:   4DGL-uLCD-SE SDFileSystem mbed wave_player

Fork of missile_command by ECE 2035 TA

Committer:
slin77
Date:
Mon Nov 17 21:23:02 2014 +0000
Revision:
5:3f356592ee9c
Parent:
4:0dc720aa3c71
add big_shoot

Who changed what in which revision?

UserRevisionLine numberNew contents of line
arvahsu 0:532cb55d6136 1 /* Gatech ECE2035 2014 FALL missile command
arvahsu 0:532cb55d6136 2 * Copyright (c) 2014 Gatech ECE2035
arvahsu 0:532cb55d6136 3 *
arvahsu 0:532cb55d6136 4 * Permission is hereby granted, free of charge, to any person obtaining a copy
arvahsu 0:532cb55d6136 5 * of this software and associated documentation files (the "Software"), to deal
arvahsu 0:532cb55d6136 6 * in the Software without restriction, including without limitation the rights
arvahsu 0:532cb55d6136 7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
arvahsu 0:532cb55d6136 8 * copies of the Software, and to permit persons to whom the Software is
arvahsu 0:532cb55d6136 9 * furnished to do so, subject to the following conditions:
arvahsu 0:532cb55d6136 10 *
arvahsu 0:532cb55d6136 11 * The above copyright notice and this permission notice shall be included in
arvahsu 0:532cb55d6136 12 * all copies or substantial portions of the Software.
arvahsu 0:532cb55d6136 13 *
arvahsu 0:532cb55d6136 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
arvahsu 0:532cb55d6136 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
arvahsu 0:532cb55d6136 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
arvahsu 0:532cb55d6136 17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
arvahsu 0:532cb55d6136 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
arvahsu 0:532cb55d6136 19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
arvahsu 0:532cb55d6136 20 * SOFTWARE.
arvahsu 0:532cb55d6136 21 */
arvahsu 0:532cb55d6136 22
arvahsu 0:532cb55d6136 23 // Template of player implementation
arvahsu 0:532cb55d6136 24 #include "mbed.h"
arvahsu 0:532cb55d6136 25 #include "uLCD_4DGL.h"
arvahsu 0:532cb55d6136 26 #include "globals.h"
arvahsu 0:532cb55d6136 27 #include "player.h"
slin77 5:3f356592ee9c 28 #include <math.h>
arvahsu 0:532cb55d6136 29
arvahsu 0:532cb55d6136 30 // Example of drawing the player
slin77 2:d39a6a36e0c0 31
slin77 2:d39a6a36e0c0 32 void player_init() {
slin77 2:d39a6a36e0c0 33 current_player.x = 60;
slin77 2:d39a6a36e0c0 34 current_player.y = 100;
slin77 2:d39a6a36e0c0 35 current_player.am_remain = 5;
slin77 2:d39a6a36e0c0 36 current_player.max_am = 5;
slin77 2:d39a6a36e0c0 37 current_player.status = PLAYER_ACTIVE;
slin77 2:d39a6a36e0c0 38 current_player.score = 0;
slin77 2:d39a6a36e0c0 39 current_player.current_level = 0;
slin77 4:0dc720aa3c71 40 current_player.life = 1;//inital 1 hp
slin77 4:0dc720aa3c71 41 current_player.protector_num = 3;
slin77 4:0dc720aa3c71 42 current_player.is_diagnoal = 0;
slin77 4:0dc720aa3c71 43 current_player.timer = 0;
slin77 2:d39a6a36e0c0 44 }
slin77 2:d39a6a36e0c0 45
slin77 2:d39a6a36e0c0 46 void update_protector() {
slin77 2:d39a6a36e0c0 47 if (current_player.protector.is_active) {
slin77 2:d39a6a36e0c0 48 current_player.protector.timer++;
slin77 2:d39a6a36e0c0 49 uLCD.line(0, 80, 128, 80, WHITE);
slin77 2:d39a6a36e0c0 50 int i,k;
slin77 2:d39a6a36e0c0 51 for (i = 0; i < MAX_NUM_MISSILE; i++) {
slin77 2:d39a6a36e0c0 52 if (missile_record[i].status == MISSILE_ACTIVE && missile_record[i].y < 80) {
slin77 2:d39a6a36e0c0 53 for (k = 0; k < current_player.max_am; k++) {
slin77 2:d39a6a36e0c0 54 if (ex[k].exploded == NO) {
slin77 2:d39a6a36e0c0 55 //find a unused explosion activate it
slin77 2:d39a6a36e0c0 56 ex[k].x = missile_record[i].x;
slin77 2:d39a6a36e0c0 57 ex[k].y = missile_record[i].y;
slin77 2:d39a6a36e0c0 58 ex[k].exploded = YES;
slin77 2:d39a6a36e0c0 59 ex[k].color = WHITE;
slin77 2:d39a6a36e0c0 60 break;
slin77 2:d39a6a36e0c0 61 }
slin77 2:d39a6a36e0c0 62 }
slin77 2:d39a6a36e0c0 63 missile_record[i].status = MISSILE_EXPLODED;
slin77 2:d39a6a36e0c0 64 }
slin77 2:d39a6a36e0c0 65 }
slin77 2:d39a6a36e0c0 66 if (current_player.protector.timer == 10) {
slin77 2:d39a6a36e0c0 67 current_player.protector.is_active = 0;
slin77 2:d39a6a36e0c0 68 uLCD.line(0, 80, 128, 80, BACKGROUND_COLOR);
slin77 2:d39a6a36e0c0 69 }
slin77 2:d39a6a36e0c0 70 }
slin77 2:d39a6a36e0c0 71 }
slin77 2:d39a6a36e0c0 72
slin77 2:d39a6a36e0c0 73 void explosion_init() {
slin77 2:d39a6a36e0c0 74 int i;
slin77 2:d39a6a36e0c0 75 for (i = 0; i < current_player.max_am;i++) {
slin77 2:d39a6a36e0c0 76 ex[i].x = 0;
slin77 2:d39a6a36e0c0 77 ex[i].y = 0;
slin77 2:d39a6a36e0c0 78 ex[i].tick = 0;
slin77 2:d39a6a36e0c0 79 ex[i].radius = 3;
slin77 2:d39a6a36e0c0 80 ex[i].exploded = NO;
slin77 2:d39a6a36e0c0 81 ex[i].color = PLAYER_COLOR;
slin77 2:d39a6a36e0c0 82 }
slin77 2:d39a6a36e0c0 83 }
slin77 2:d39a6a36e0c0 84
slin77 2:d39a6a36e0c0 85 void update_explosion() {
slin77 2:d39a6a36e0c0 86 int i;
slin77 2:d39a6a36e0c0 87 for (i = 0;i < current_player.max_am;i++) {
slin77 2:d39a6a36e0c0 88 if (ex[i].exploded == YES) {
slin77 2:d39a6a36e0c0 89 ex[i].tick++;
slin77 2:d39a6a36e0c0 90 uLCD.circle(ex[i].x, ex[i].y, ex[i].radius - 2, BACKGROUND_COLOR);
slin77 2:d39a6a36e0c0 91 uLCD.circle(ex[i].x, ex[i].y, ex[i].radius, BACKGROUND_COLOR);
slin77 2:d39a6a36e0c0 92 draw_landscape();
slin77 2:d39a6a36e0c0 93 if (ex[i].tick <= 5) {
slin77 2:d39a6a36e0c0 94 ex[i].radius = ex[i].radius + 2;
slin77 2:d39a6a36e0c0 95 } else {
slin77 2:d39a6a36e0c0 96 ex[i].tick = 0;
slin77 2:d39a6a36e0c0 97 ex[i].radius = 0;
slin77 2:d39a6a36e0c0 98 ex[i].exploded = NO;
slin77 2:d39a6a36e0c0 99 }
slin77 2:d39a6a36e0c0 100 }
slin77 2:d39a6a36e0c0 101 }
slin77 2:d39a6a36e0c0 102 }
slin77 2:d39a6a36e0c0 103
slin77 2:d39a6a36e0c0 104 void draw_explosion() {
slin77 2:d39a6a36e0c0 105 int i;
slin77 2:d39a6a36e0c0 106 for (i = 0;i < current_player.max_am;i++) {
slin77 2:d39a6a36e0c0 107 if (ex[i].exploded == YES) {
slin77 2:d39a6a36e0c0 108 uLCD.circle(ex[i].x, ex[i].y, ex[i].radius - 2, ex[i].color);
slin77 2:d39a6a36e0c0 109 uLCD.circle(ex[i].x, ex[i].y, ex[i].radius, ex[i].color);
slin77 2:d39a6a36e0c0 110 }
slin77 2:d39a6a36e0c0 111 }
slin77 2:d39a6a36e0c0 112 }
slin77 2:d39a6a36e0c0 113
slin77 2:d39a6a36e0c0 114 void antimissile_init() {
slin77 2:d39a6a36e0c0 115 int i;
slin77 2:d39a6a36e0c0 116 for (i = 0; i < current_player.max_am;i++) {
slin77 2:d39a6a36e0c0 117 am[i].x = current_player.x;
slin77 2:d39a6a36e0c0 118 am[i].y = current_player.y;
slin77 2:d39a6a36e0c0 119 am[i].speed = 5;
slin77 2:d39a6a36e0c0 120 am[i].tick = 0;
slin77 2:d39a6a36e0c0 121 am[i].status = DEACTIVE;
slin77 2:d39a6a36e0c0 122 }
arvahsu 0:532cb55d6136 123 }
slin77 2:d39a6a36e0c0 124 //(x,y) is the top left corner
slin77 2:d39a6a36e0c0 125 void player_draw() {
slin77 2:d39a6a36e0c0 126 int x = current_player.x;
slin77 2:d39a6a36e0c0 127 int y = current_player.y;
slin77 2:d39a6a36e0c0 128 uLCD.filled_rectangle(x - 5, y, x- 5 + PLAYER_WIDTH, y+PLAYER_HEIGHT, PLAYER_COLOR);
slin77 2:d39a6a36e0c0 129 uLCD.line(x - 5, y - 3, x - 5, y + PLAYER_HEIGHT + 3, PLAYER_COLOR);
slin77 2:d39a6a36e0c0 130 uLCD.line(x- 5 + PLAYER_WIDTH, y - 3, x- 5 + PLAYER_WIDTH, y + PLAYER_HEIGHT + 3, PLAYER_COLOR);
slin77 2:d39a6a36e0c0 131 uLCD.line(x, y - 3, x, y + PLAYER_HEIGHT + 3, PLAYER_COLOR);
slin77 2:d39a6a36e0c0 132 //uLCD.filled_rectangle(x+PLAYER_DELTA, y-PLAYER_DELTA, x+PLAYER_WIDTH-PLAYER_DELTA, y+PLAYER_HEIGHT, PLAYER_COLOR);
slin77 2:d39a6a36e0c0 133 }
slin77 2:d39a6a36e0c0 134
slin77 2:d39a6a36e0c0 135 void player_move_left() {
slin77 2:d39a6a36e0c0 136 int x = current_player.x;
slin77 2:d39a6a36e0c0 137 int y = current_player.y;
slin77 2:d39a6a36e0c0 138 uLCD.filled_rectangle(x - 5, y, x- 5 + PLAYER_WIDTH, y+PLAYER_HEIGHT, BACKGROUND_COLOR);
slin77 2:d39a6a36e0c0 139 uLCD.line(x - 5, y - 3, x - 5, y + PLAYER_HEIGHT + 3, BACKGROUND_COLOR);
slin77 2:d39a6a36e0c0 140 uLCD.line(x- 5 + PLAYER_WIDTH, y - 3, x- 5 + PLAYER_WIDTH, y + PLAYER_HEIGHT + 3, BACKGROUND_COLOR);
slin77 2:d39a6a36e0c0 141 uLCD.line(x, y - 3, x, y + PLAYER_HEIGHT + 3, BACKGROUND_COLOR);
slin77 5:3f356592ee9c 142 if (current_player.x - PLAYER_DELTA > 0 && !current_player.is_diagnoal) {
slin77 2:d39a6a36e0c0 143 current_player.x = current_player.x - PLAYER_DELTA;
slin77 5:3f356592ee9c 144 }
slin77 2:d39a6a36e0c0 145 }
slin77 2:d39a6a36e0c0 146
slin77 2:d39a6a36e0c0 147 void player_move_right() {
slin77 2:d39a6a36e0c0 148 int x = current_player.x;
slin77 2:d39a6a36e0c0 149 int y = current_player.y;
slin77 2:d39a6a36e0c0 150 uLCD.filled_rectangle(x - 5, y, x- 5 + PLAYER_WIDTH, y+PLAYER_HEIGHT, BACKGROUND_COLOR);
slin77 2:d39a6a36e0c0 151 uLCD.line(x - 5, y - 3, x - 5, y + PLAYER_HEIGHT + 3, BACKGROUND_COLOR);
slin77 2:d39a6a36e0c0 152 uLCD.line(x- 5 + PLAYER_WIDTH, y - 3, x- 5 + PLAYER_WIDTH, y + PLAYER_HEIGHT + 3, BACKGROUND_COLOR);
slin77 2:d39a6a36e0c0 153 uLCD.line(x, y - 3, x, y + PLAYER_HEIGHT + 3, BACKGROUND_COLOR);
slin77 2:d39a6a36e0c0 154 if(current_player.x + PLAYER_DELTA < 126) {
slin77 2:d39a6a36e0c0 155 current_player.x = current_player.x + PLAYER_DELTA;
slin77 2:d39a6a36e0c0 156 }
slin77 2:d39a6a36e0c0 157 }
slin77 2:d39a6a36e0c0 158
slin77 2:d39a6a36e0c0 159 PLAYER get_player_info() {
slin77 2:d39a6a36e0c0 160 return current_player;
slin77 2:d39a6a36e0c0 161 }
slin77 2:d39a6a36e0c0 162
slin77 2:d39a6a36e0c0 163 //find a available antimissile and set it active
slin77 2:d39a6a36e0c0 164 void shoot() {
slin77 2:d39a6a36e0c0 165 int i;
slin77 2:d39a6a36e0c0 166 if (current_player.am_remain > 0) {
slin77 2:d39a6a36e0c0 167 for(i = 0; i < current_player.max_am; i++) {
slin77 2:d39a6a36e0c0 168 if (am[i].status == DEACTIVE) {
slin77 2:d39a6a36e0c0 169 am[i].status = ACTIVE;
slin77 2:d39a6a36e0c0 170 am[i].x = current_player.x;
slin77 2:d39a6a36e0c0 171 am[i].y = current_player.y;
slin77 2:d39a6a36e0c0 172 am[i].speed = 5; // need to be improved
slin77 2:d39a6a36e0c0 173 am[i].tick = 0;
slin77 4:0dc720aa3c71 174 am[i].is_diagnoal = current_player.is_diagnoal;
slin77 2:d39a6a36e0c0 175 current_player.am_remain--;
slin77 2:d39a6a36e0c0 176 break;
slin77 2:d39a6a36e0c0 177 }
slin77 2:d39a6a36e0c0 178 }
slin77 2:d39a6a36e0c0 179 }
slin77 2:d39a6a36e0c0 180 }
slin77 5:3f356592ee9c 181
slin77 5:3f356592ee9c 182 void big_shoot() {
slin77 5:3f356592ee9c 183 int i, count = 0;
slin77 5:3f356592ee9c 184 if (current_player.am_remain > 0) {
slin77 5:3f356592ee9c 185 for(i = 0; i < current_player.max_am; i++) {
slin77 5:3f356592ee9c 186 if (am[i].status == DEACTIVE) {
slin77 5:3f356592ee9c 187 count++;
slin77 5:3f356592ee9c 188 am[i].status = ACTIVE;
slin77 5:3f356592ee9c 189 am[i].x = (current_player.x * 2 + count * 32) % 128 ;
slin77 5:3f356592ee9c 190 am[i].y = 100;
slin77 5:3f356592ee9c 191 am[i].speed = 5;
slin77 5:3f356592ee9c 192 am[i].tick = 0;
slin77 5:3f356592ee9c 193 am[i].is_diagnoal = current_player.is_diagnoal;
slin77 5:3f356592ee9c 194 current_player.am_remain--;
slin77 5:3f356592ee9c 195 }
slin77 5:3f356592ee9c 196 }
slin77 5:3f356592ee9c 197 }
slin77 5:3f356592ee9c 198 }
slin77 2:d39a6a36e0c0 199 //update all active missiles position
slin77 2:d39a6a36e0c0 200 void update_antimissile_positions() {
slin77 2:d39a6a36e0c0 201 int i, rate;
slin77 2:d39a6a36e0c0 202 for(i = 0; i < current_player.max_am;i++) {
slin77 2:d39a6a36e0c0 203 if(am[i].status == ACTIVE) {
slin77 2:d39a6a36e0c0 204 am[i].tick++;
slin77 2:d39a6a36e0c0 205 rate = 5 / am[i].speed;
slin77 2:d39a6a36e0c0 206 if (am[i].y - 2 <= 0) {
slin77 2:d39a6a36e0c0 207 //when the missile flies out of the screen
slin77 2:d39a6a36e0c0 208 am[i].status = DEACTIVE;
slin77 3:fd1f794b7f5d 209 uLCD.line(am[i].x, am[i].y, am[i].x, 100, BACKGROUND_COLOR);
slin77 2:d39a6a36e0c0 210 am[i].y = current_player.y;
slin77 2:d39a6a36e0c0 211 am[i].x = current_player.x;
slin77 2:d39a6a36e0c0 212 current_player.am_remain++;
slin77 2:d39a6a36e0c0 213
slin77 2:d39a6a36e0c0 214 } else if (am[i].tick % rate == 0) {
slin77 3:fd1f794b7f5d 215 uLCD.line(am[i].x, am[i].y, am[i].x, 100, BACKGROUND_COLOR);
slin77 2:d39a6a36e0c0 216 am[i].y = am[i].y - 2;
slin77 2:d39a6a36e0c0 217 }
slin77 2:d39a6a36e0c0 218
slin77 2:d39a6a36e0c0 219 }
slin77 2:d39a6a36e0c0 220 }
slin77 2:d39a6a36e0c0 221 }
slin77 2:d39a6a36e0c0 222 //find all active antimissiles and draw their current position
slin77 2:d39a6a36e0c0 223 void draw_antimissiles() {
slin77 2:d39a6a36e0c0 224 int i;
slin77 2:d39a6a36e0c0 225 for(i = 0; i < current_player.max_am;i++) {
slin77 2:d39a6a36e0c0 226 if (am[i].status == ACTIVE ) {
slin77 3:fd1f794b7f5d 227 uLCD.line(am[i].x, am[i].y, am[i].x, 100, PLAYER_COLOR);
slin77 2:d39a6a36e0c0 228 }
slin77 2:d39a6a36e0c0 229 }
slin77 2:d39a6a36e0c0 230 }
slin77 2:d39a6a36e0c0 231
slin77 2:d39a6a36e0c0 232
arvahsu 0:532cb55d6136 233
arvahsu 0:532cb55d6136 234 // ... You need to implement your own functions for player ...
arvahsu 0:532cb55d6136 235
arvahsu 0:532cb55d6136 236