ECE2035 class project
Dependencies: 4DGL-uLCD-SE SDFileSystem mbed wave_player
Fork of missile_command by
player.cpp
- Committer:
- slin77
- Date:
- 2014-11-17
- Revision:
- 5:3f356592ee9c
- Parent:
- 4:0dc720aa3c71
File content as of revision 5:3f356592ee9c:
/* Gatech ECE2035 2014 FALL missile command * Copyright (c) 2014 Gatech ECE2035 * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ // Template of player implementation #include "mbed.h" #include "uLCD_4DGL.h" #include "globals.h" #include "player.h" #include <math.h> // Example of drawing the player void player_init() { current_player.x = 60; current_player.y = 100; current_player.am_remain = 5; current_player.max_am = 5; current_player.status = PLAYER_ACTIVE; current_player.score = 0; current_player.current_level = 0; current_player.life = 1;//inital 1 hp current_player.protector_num = 3; current_player.is_diagnoal = 0; current_player.timer = 0; } void update_protector() { if (current_player.protector.is_active) { current_player.protector.timer++; uLCD.line(0, 80, 128, 80, WHITE); int i,k; for (i = 0; i < MAX_NUM_MISSILE; i++) { if (missile_record[i].status == MISSILE_ACTIVE && missile_record[i].y < 80) { for (k = 0; k < current_player.max_am; k++) { if (ex[k].exploded == NO) { //find a unused explosion activate it ex[k].x = missile_record[i].x; ex[k].y = missile_record[i].y; ex[k].exploded = YES; ex[k].color = WHITE; break; } } missile_record[i].status = MISSILE_EXPLODED; } } if (current_player.protector.timer == 10) { current_player.protector.is_active = 0; uLCD.line(0, 80, 128, 80, BACKGROUND_COLOR); } } } void explosion_init() { int i; for (i = 0; i < current_player.max_am;i++) { ex[i].x = 0; ex[i].y = 0; ex[i].tick = 0; ex[i].radius = 3; ex[i].exploded = NO; ex[i].color = PLAYER_COLOR; } } void update_explosion() { int i; for (i = 0;i < current_player.max_am;i++) { if (ex[i].exploded == YES) { ex[i].tick++; uLCD.circle(ex[i].x, ex[i].y, ex[i].radius - 2, BACKGROUND_COLOR); uLCD.circle(ex[i].x, ex[i].y, ex[i].radius, BACKGROUND_COLOR); draw_landscape(); if (ex[i].tick <= 5) { ex[i].radius = ex[i].radius + 2; } else { ex[i].tick = 0; ex[i].radius = 0; ex[i].exploded = NO; } } } } void draw_explosion() { int i; for (i = 0;i < current_player.max_am;i++) { if (ex[i].exploded == YES) { uLCD.circle(ex[i].x, ex[i].y, ex[i].radius - 2, ex[i].color); uLCD.circle(ex[i].x, ex[i].y, ex[i].radius, ex[i].color); } } } void antimissile_init() { int i; for (i = 0; i < current_player.max_am;i++) { am[i].x = current_player.x; am[i].y = current_player.y; am[i].speed = 5; am[i].tick = 0; am[i].status = DEACTIVE; } } //(x,y) is the top left corner void player_draw() { int x = current_player.x; int y = current_player.y; uLCD.filled_rectangle(x - 5, y, x- 5 + PLAYER_WIDTH, y+PLAYER_HEIGHT, PLAYER_COLOR); uLCD.line(x - 5, y - 3, x - 5, y + PLAYER_HEIGHT + 3, PLAYER_COLOR); uLCD.line(x- 5 + PLAYER_WIDTH, y - 3, x- 5 + PLAYER_WIDTH, y + PLAYER_HEIGHT + 3, PLAYER_COLOR); uLCD.line(x, y - 3, x, y + PLAYER_HEIGHT + 3, PLAYER_COLOR); //uLCD.filled_rectangle(x+PLAYER_DELTA, y-PLAYER_DELTA, x+PLAYER_WIDTH-PLAYER_DELTA, y+PLAYER_HEIGHT, PLAYER_COLOR); } void player_move_left() { int x = current_player.x; int y = current_player.y; uLCD.filled_rectangle(x - 5, y, x- 5 + PLAYER_WIDTH, y+PLAYER_HEIGHT, BACKGROUND_COLOR); uLCD.line(x - 5, y - 3, x - 5, y + PLAYER_HEIGHT + 3, BACKGROUND_COLOR); uLCD.line(x- 5 + PLAYER_WIDTH, y - 3, x- 5 + PLAYER_WIDTH, y + PLAYER_HEIGHT + 3, BACKGROUND_COLOR); uLCD.line(x, y - 3, x, y + PLAYER_HEIGHT + 3, BACKGROUND_COLOR); if (current_player.x - PLAYER_DELTA > 0 && !current_player.is_diagnoal) { current_player.x = current_player.x - PLAYER_DELTA; } } void player_move_right() { int x = current_player.x; int y = current_player.y; uLCD.filled_rectangle(x - 5, y, x- 5 + PLAYER_WIDTH, y+PLAYER_HEIGHT, BACKGROUND_COLOR); uLCD.line(x - 5, y - 3, x - 5, y + PLAYER_HEIGHT + 3, BACKGROUND_COLOR); uLCD.line(x- 5 + PLAYER_WIDTH, y - 3, x- 5 + PLAYER_WIDTH, y + PLAYER_HEIGHT + 3, BACKGROUND_COLOR); uLCD.line(x, y - 3, x, y + PLAYER_HEIGHT + 3, BACKGROUND_COLOR); if(current_player.x + PLAYER_DELTA < 126) { current_player.x = current_player.x + PLAYER_DELTA; } } PLAYER get_player_info() { return current_player; } //find a available antimissile and set it active void shoot() { int i; if (current_player.am_remain > 0) { for(i = 0; i < current_player.max_am; i++) { if (am[i].status == DEACTIVE) { am[i].status = ACTIVE; am[i].x = current_player.x; am[i].y = current_player.y; am[i].speed = 5; // need to be improved am[i].tick = 0; am[i].is_diagnoal = current_player.is_diagnoal; current_player.am_remain--; break; } } } } void big_shoot() { int i, count = 0; if (current_player.am_remain > 0) { for(i = 0; i < current_player.max_am; i++) { if (am[i].status == DEACTIVE) { count++; am[i].status = ACTIVE; am[i].x = (current_player.x * 2 + count * 32) % 128 ; am[i].y = 100; am[i].speed = 5; am[i].tick = 0; am[i].is_diagnoal = current_player.is_diagnoal; current_player.am_remain--; } } } } //update all active missiles position void update_antimissile_positions() { int i, rate; for(i = 0; i < current_player.max_am;i++) { if(am[i].status == ACTIVE) { am[i].tick++; rate = 5 / am[i].speed; if (am[i].y - 2 <= 0) { //when the missile flies out of the screen am[i].status = DEACTIVE; uLCD.line(am[i].x, am[i].y, am[i].x, 100, BACKGROUND_COLOR); am[i].y = current_player.y; am[i].x = current_player.x; current_player.am_remain++; } else if (am[i].tick % rate == 0) { uLCD.line(am[i].x, am[i].y, am[i].x, 100, BACKGROUND_COLOR); am[i].y = am[i].y - 2; } } } } //find all active antimissiles and draw their current position void draw_antimissiles() { int i; for(i = 0; i < current_player.max_am;i++) { if (am[i].status == ACTIVE ) { uLCD.line(am[i].x, am[i].y, am[i].x, 100, PLAYER_COLOR); } } } // ... You need to implement your own functions for player ...