A note hitting game for the mbed LPC 1768. User uses a joystick to hit notes as they come down the screen in 3 different lanes.
Dependencies: 4DGL-uLCD-SE SDFileSystem mbed-rtos mbed wave_player
Diff: player.cpp
- Revision:
- 1:94b1ec213686
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/player.cpp Thu Mar 17 21:12:59 2016 +0000 @@ -0,0 +1,128 @@ +#include "mbed.h" +#include "uLCD_4DGL.h" +#include "player.h" +#include "note_public.h" +#include <math.h> + +extern int note_speed; // Note speed +extern int note_interval; // Interval on which notes are created +extern uLCD_4DGL uLCD; // LCD display +extern Serial pc; // For debugging + +PLAYER CURRENT_PLAYER; // Player object +NOTE note_array[MAX_NUM_NOTE]; // Structure containing the Note objects + +void player_init() { // Initializes the player object with default values + CURRENT_PLAYER.score = 0; + CURRENT_PLAYER.lives = 20; + CURRENT_PLAYER.status = ALIVE; +} + +void gui_init() { // Draws the GUI on the LCD + uLCD.locate(0,0); + uLCD.line(43,0,43,128,GREEN); //Lines separating the lanes + uLCD.line(86,0,86,128,GREEN); //Lines separating the lanes + uLCD.circle(108,128-15,10,WHITE); //Left note + uLCD.filled_circle(108,128-15,4,WHITE); //Left note + uLCD.circle(65,128-15,10,WHITE); //Middle note + uLCD.filled_circle(65,128-15,4,WHITE); //Middle note + uLCD.circle(22,128-15,10,WHITE); //Right note + uLCD.filled_circle(22,128-15,4,WHITE); //Right note + for(int i = 5;i<10;i++) //Loop used to fill in the notes with appropriate color + { + uLCD.circle(108,128-15,i,GREEN); + uLCD.circle(65,128-15,i,RED); + uLCD.circle(22,128-15,i,0xFFFF00); + } +} + +double get_player_lives() { // Gets number of lives player has remaining + + return(CURRENT_PLAYER.lives); +} + +int get_player_score() { // Gets score of player + pc.printf("Player's Score: %i\n\r",CURRENT_PLAYER.score); + return(CURRENT_PLAYER.score); + } + +void update_values(){ // Updates the structure containing the Note object data + for(int index=0;index<MAX_NUM_NOTE;index++) + { + note_array[index]=note_get_info(index); + //pc.printf("The y value of note %i is %d\n\r",index,note_array[index].y); FOR DEBUGGING PURPOSES + } +} + +bool detect_lose_conditions(){ // Detects when the game is over by checking the player's lives + bool game_over = false; + if(CURRENT_PLAYER.lives <= 0){ + game_over=true; + } + return(game_over); +} + +float get_distance(int index){ // Detects distance between notes in the lane and the note registration zone + float distance = 0; + int y2 = note_array[index].y; + distance = abs(y2-(128.0-15.0)); // 113.0 is the location of the center of the registration zone in the y direction + //pc.printf("The Y value for note %i is %i \n\r",index,y2); FOR DEBUGGING PURPOSES + //pc.printf("The distance between the note and the checkpoint is: %f\n\r",distance); FOR DEBUGGING PURPOSES + return (distance); + } + +bool detect_note_miss(){ // Detects when notes go past the checkpoint, also will check to see if player has lost all their lives + bool gameOver = false; // Assume the player has not lost the game yet + update_values(); // Make sure the location data for all notes is current + for(int index=0;index<5;index++){ + if((note_array[index].y >=(128-10)) && (note_array[index].y != 128)) // If the note has passed the registration/checkpoint zone + { + note_set_missed(index); // Set note as missed + note_update_position(); // Update its status + gui_init(); // Redraw the GUI + CURRENT_PLAYER.lives -= 2; // Lose 2 lives for a missed note + gameOver = detect_lose_conditions(); // Determine if this has lost the player the game + //pc.printf("Note went past registration zone!\n\r"); // FOR DEBUGGING PURPOSES + //break; + } + } + return(gameOver); +} + +bool detect_note_hit(int lane){ // Detects when a note is hit, is called whenever a direction is input on the joystick + bool gameOver = false; // Assume player has not lost the game yet + update_values(); // Make sure the location data for all notes is current + int minDistance = 128; // We only want to look at the closest note in the lane we care about + int indexToCheck; // We only need to look at one note per function call + for(int i=0;i<5;i++) + { + //pc.printf("Checking note %i, current lane: %i \n\r",i,note_array[i].lane); FOR DEBUGGING PURPOSES + if(note_array[i].lane+1 == (lane+1)) + { + if(get_distance(i) < minDistance) + { + minDistance = get_distance(i); // Make sure we get the note with the least distance to the checkpoint + indexToCheck=i; // This is the note we want to check if we hit + } + } + } + //pc.printf("Found a match!"); FOR DEBUGGING PURPOSES + double distance = get_distance(indexToCheck); // Check distance of selected note from checkpoint zone + if(distance <= 4.0){ // If note is close enough, proceed + note_set_played(indexToCheck); // Set note status to NOTE_PLAYED + note_update_position(); // Update note position + gui_init(); // Redraw the GUI + CURRENT_PLAYER.lives += 1.2; // Player gets 1.2 lives back for each note hit + CURRENT_PLAYER.score += 1.0; // Player gets 1 point for every note hit + //pc.printf("Note hit!\n\r"); FOR DEBUGGING PURPOSES + } + else if(distance > 4) // If note is not close enough, proceed with miss protocol + { + CURRENT_PLAYER.lives -=1.0; // If a note is missed in this manner, player loses 1 life + gameOver = detect_lose_conditions();// Check to see if this has caused the player to lose all their lives and the game + //pc.printf("Note missed...\n\r"); DEBUGGING PURPOSES + } + return(gameOver); +} + + \ No newline at end of file