Un jeu pong simple pour jouer à deux
Dependencies: TS_DISCO_F746NG mbed LCD_DISCO_F746NG BSP_DISCO_F746NG
main.cpp
- Committer:
- skichenaradjou
- Date:
- 2019-06-04
- Revision:
- 0:6efb56851ed3
File content as of revision 0:6efb56851ed3:
#include "mbed.h" #include "math.h" #include "LCD_DISCO_F746NG.h" #include "TS_DISCO_F746NG.h" #define PI 3.14159265358979323846 LCD_DISCO_F746NG lcd; TS_DISCO_F746NG ts; AnalogIn a1(A1); AnalogIn a2(A5); int P1x1 = 0, P1x2 = 3, P1y1 = 100, P1y2; int P2x1 = 480, P2x2 = 477, P2y1 = 100, P2y2; float joueur_1; float joueur_2; // Fonction pour afficher le jeu void menu_jeu(void); void affihage_jeu(void); void jeu(void); // Tactile TS_StateTypeDef TS_State; uint8_t init; int x, y; uint8_t idx; //Score des joueurs uint8_t score_texte[30]; uint8_t score_texte_2[30]; int score_P1 = 0; int score_P2 = 0; // Déclaration pour gérer la balle float bx = 200; float by = 135; float speed = 0; float angle = 25; // Booleen pour gérer les differents interface bool start = false; bool score = false; //*********************************************************************************** void affichage_jeu() { // Initialisation du jeu lcd.SetTextColor(LCD_COLOR_WHITE); lcd.FillCircle(bx, by, 5); lcd.DrawRect(10, 10, 350, 260); lcd.FillRect(15, P1y1, 5, 40); lcd.FillRect(345, P2y1, 5, 40); // Inscrire les scores lcd.SetTextColor(LCD_COLOR_BLACK); lcd.SetFont(& Font20); lcd.DisplayStringAt(0, LINE(1), (uint8_t *)"SCORE P1", RIGHT_MODE); sprintf((char*)score_texte, "%d", score_P1); lcd.DisplayStringAt(0, LINE(3), (uint8_t *)&score_texte, RIGHT_MODE); lcd.DisplayStringAt(0, LINE(7), (uint8_t *)"SCORE P2", RIGHT_MODE); sprintf((char*)score_texte_2, "%d", score_P2); lcd.DisplayStringAt(0, LINE(9), (uint8_t *)&score_texte_2, RIGHT_MODE); // Tactile sur le raquette while(start == false) { ts.GetState(&TS_State); x = TS_State.touchX[idx]; y = TS_State.touchY[idx]; if (TS_State.touchDetected) { if ((x>280) && (x<400) && (y>15) && (y<250)) { lcd.SetTextColor(LCD_COLOR_WHITE); lcd.FillRect(345, TS_State.touchY[0], 5, 40); lcd.DrawRect(10, 10, 350, 260); lcd.SetTextColor(LCD_COLOR_BLACK); lcd.FillRect(345, 0, 5, TS_State.touchY[0]-1); lcd.FillRect(345, TS_State.touchY[0]+40, 5, 100); } } // Tactile sur la nalle pour démarrer le jeu if (TS_State.touchDetected) { if ( (x>190) && (x<210) && (y>125) && (y<145)) { start = true; jeu(); } } joueur_1 = a1.read(); // joueur_2 = a2.read(); P1y1 = (joueur_1*212+8); P1y2 = P1y1 + 40; // P2y1 = (joueur_2*212+8); // P2y2 = P2y1 + 40; lcd.SetTextColor(LCD_COLOR_WHITE); lcd.FillRect(15, P1y1, 5, 40); lcd.SetTextColor(LCD_COLOR_BLACK); lcd.FillRect(15, 0, 5, P1y1-1); lcd.FillRect(15, P1y2+1, 5, 200); } } //*********************************************************************************** //*********************************************************************************** void jeu() { while(score == false) { joueur_1 = a1.read(); // joueur_2 = a2.read(); P1y1 = (joueur_1*212+8); P1y2 = P1y1 + 40; // P2y1 = (joueur_2*212+8); // P2y2 = P2y1 + 40; ts.GetState(&TS_State); x = TS_State.touchX[idx]; y = TS_State.touchY[idx]; if (TS_State.touchDetected) { if ((x>280) && (x<400) && (y>15) && (y<250)) { lcd.SetTextColor(LCD_COLOR_WHITE); lcd.FillRect(345, TS_State.touchY[0], 5, 40); lcd.DrawRect(10, 10, 350, 260); lcd.SetTextColor(LCD_COLOR_BLACK); lcd.FillRect(345, 0, 5, TS_State.touchY[0]-1); lcd.FillRect(345, TS_State.touchY[0]+40, 5, 100); } } lcd.SetTextColor(LCD_COLOR_WHITE); lcd.FillRect(15, P1y1, 5, 40); lcd.SetTextColor(LCD_COLOR_BLACK); lcd.FillRect(15, 0, 5, P1y1-1); lcd.FillRect(15, P1y2+1, 5, 200); // Gérer la physique de la balle lcd.SetTextColor(LCD_COLOR_BLACK); lcd.FillCircle(bx, by, 5); wait_ms(5); speed = 2; bx = bx + speed * cos(angle*2*PI/360); by = by - speed * sin(angle*2*PI/360); // On gére les rebonds sur les raquettes if (((by>TS_State.touchY[0]-5 && by <TS_State.touchY[0]+40) && bx > 340) || ((by>P1y1 && by <P1y2+1) && bx < 25) ) { angle = 180-angle; } else if ( bx > 360 ) { start = false; bx = 200; by = 135; angle = angle+210; score_P1++; lcd.Clear(LCD_COLOR_BLACK); affichage_jeu(); } else if (bx < 15) { start = false; bx = 200; by = 135; angle = angle+210; score_P2++; lcd.Clear(LCD_COLOR_BLACK); affichage_jeu(); } // On gére les rebonds sur les murs if (((bx>15 && bx <345) && by > 250) || ((bx>15 && bx <340) && by < 25) ) { angle = -angle; } lcd.SetTextColor(LCD_COLOR_WHITE); lcd.FillCircle(bx, by, 5); lcd.FillCircle(bx, by, 5); wait_ms(5); } } //*********************************************************************************** //*********************************************************************************** void menu_jeu() { bool debut_jeu = false; lcd.DisplayStringAt(0, LINE(1), (uint8_t *)"PONG", CENTER_MODE); lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"Start", CENTER_MODE); while(debut_jeu == false) { ts.GetState(&TS_State); if (TS_State.touchDetected) { x = TS_State.touchX[idx]; y = TS_State.touchY[idx]; if ((x>195) && (x<255) && (y>110) && (y<155)) { lcd.Clear(LCD_COLOR_BLACK); affichage_jeu(); debut_jeu = true; } } } } //********************************************************************************* int main() { init = ts.Init(lcd.GetXSize(), lcd.GetYSize()); menu_jeu(); while(1) { } } //*********************************************************************************