Un jeu pong simple pour jouer à deux

Dependencies:   TS_DISCO_F746NG mbed LCD_DISCO_F746NG BSP_DISCO_F746NG

Committer:
skichenaradjou
Date:
Tue Jun 04 14:19:14 2019 +0000
Revision:
0:6efb56851ed3
PONG_Sylvestre_Kichenaradjou

Who changed what in which revision?

UserRevisionLine numberNew contents of line
skichenaradjou 0:6efb56851ed3 1 #include "mbed.h"
skichenaradjou 0:6efb56851ed3 2 #include "math.h"
skichenaradjou 0:6efb56851ed3 3 #include "LCD_DISCO_F746NG.h"
skichenaradjou 0:6efb56851ed3 4 #include "TS_DISCO_F746NG.h"
skichenaradjou 0:6efb56851ed3 5
skichenaradjou 0:6efb56851ed3 6 #define PI 3.14159265358979323846
skichenaradjou 0:6efb56851ed3 7
skichenaradjou 0:6efb56851ed3 8 LCD_DISCO_F746NG lcd;
skichenaradjou 0:6efb56851ed3 9 TS_DISCO_F746NG ts;
skichenaradjou 0:6efb56851ed3 10
skichenaradjou 0:6efb56851ed3 11 AnalogIn a1(A1);
skichenaradjou 0:6efb56851ed3 12 AnalogIn a2(A5);
skichenaradjou 0:6efb56851ed3 13
skichenaradjou 0:6efb56851ed3 14 int P1x1 = 0, P1x2 = 3, P1y1 = 100, P1y2;
skichenaradjou 0:6efb56851ed3 15 int P2x1 = 480, P2x2 = 477, P2y1 = 100, P2y2;
skichenaradjou 0:6efb56851ed3 16 float joueur_1;
skichenaradjou 0:6efb56851ed3 17 float joueur_2;
skichenaradjou 0:6efb56851ed3 18
skichenaradjou 0:6efb56851ed3 19 // Fonction pour afficher le jeu
skichenaradjou 0:6efb56851ed3 20
skichenaradjou 0:6efb56851ed3 21 void menu_jeu(void);
skichenaradjou 0:6efb56851ed3 22 void affihage_jeu(void);
skichenaradjou 0:6efb56851ed3 23 void jeu(void);
skichenaradjou 0:6efb56851ed3 24
skichenaradjou 0:6efb56851ed3 25
skichenaradjou 0:6efb56851ed3 26 // Tactile
skichenaradjou 0:6efb56851ed3 27
skichenaradjou 0:6efb56851ed3 28 TS_StateTypeDef TS_State;
skichenaradjou 0:6efb56851ed3 29 uint8_t init;
skichenaradjou 0:6efb56851ed3 30 int x, y;
skichenaradjou 0:6efb56851ed3 31 uint8_t idx;
skichenaradjou 0:6efb56851ed3 32
skichenaradjou 0:6efb56851ed3 33 //Score des joueurs
skichenaradjou 0:6efb56851ed3 34
skichenaradjou 0:6efb56851ed3 35 uint8_t score_texte[30];
skichenaradjou 0:6efb56851ed3 36 uint8_t score_texte_2[30];
skichenaradjou 0:6efb56851ed3 37 int score_P1 = 0;
skichenaradjou 0:6efb56851ed3 38 int score_P2 = 0;
skichenaradjou 0:6efb56851ed3 39
skichenaradjou 0:6efb56851ed3 40 // Déclaration pour gérer la balle
skichenaradjou 0:6efb56851ed3 41
skichenaradjou 0:6efb56851ed3 42 float bx = 200;
skichenaradjou 0:6efb56851ed3 43 float by = 135;
skichenaradjou 0:6efb56851ed3 44 float speed = 0;
skichenaradjou 0:6efb56851ed3 45 float angle = 25;
skichenaradjou 0:6efb56851ed3 46
skichenaradjou 0:6efb56851ed3 47 // Booleen pour gérer les differents interface
skichenaradjou 0:6efb56851ed3 48
skichenaradjou 0:6efb56851ed3 49 bool start = false;
skichenaradjou 0:6efb56851ed3 50 bool score = false;
skichenaradjou 0:6efb56851ed3 51
skichenaradjou 0:6efb56851ed3 52
skichenaradjou 0:6efb56851ed3 53 //***********************************************************************************
skichenaradjou 0:6efb56851ed3 54
skichenaradjou 0:6efb56851ed3 55 void affichage_jeu()
skichenaradjou 0:6efb56851ed3 56 {
skichenaradjou 0:6efb56851ed3 57
skichenaradjou 0:6efb56851ed3 58 // Initialisation du jeu
skichenaradjou 0:6efb56851ed3 59 lcd.SetTextColor(LCD_COLOR_WHITE);
skichenaradjou 0:6efb56851ed3 60 lcd.FillCircle(bx, by, 5);
skichenaradjou 0:6efb56851ed3 61 lcd.DrawRect(10, 10, 350, 260);
skichenaradjou 0:6efb56851ed3 62 lcd.FillRect(15, P1y1, 5, 40);
skichenaradjou 0:6efb56851ed3 63 lcd.FillRect(345, P2y1, 5, 40);
skichenaradjou 0:6efb56851ed3 64
skichenaradjou 0:6efb56851ed3 65 // Inscrire les scores
skichenaradjou 0:6efb56851ed3 66 lcd.SetTextColor(LCD_COLOR_BLACK);
skichenaradjou 0:6efb56851ed3 67 lcd.SetFont(& Font20);
skichenaradjou 0:6efb56851ed3 68 lcd.DisplayStringAt(0, LINE(1), (uint8_t *)"SCORE P1", RIGHT_MODE);
skichenaradjou 0:6efb56851ed3 69 sprintf((char*)score_texte, "%d", score_P1);
skichenaradjou 0:6efb56851ed3 70 lcd.DisplayStringAt(0, LINE(3), (uint8_t *)&score_texte, RIGHT_MODE);
skichenaradjou 0:6efb56851ed3 71
skichenaradjou 0:6efb56851ed3 72 lcd.DisplayStringAt(0, LINE(7), (uint8_t *)"SCORE P2", RIGHT_MODE);
skichenaradjou 0:6efb56851ed3 73 sprintf((char*)score_texte_2, "%d", score_P2);
skichenaradjou 0:6efb56851ed3 74 lcd.DisplayStringAt(0, LINE(9), (uint8_t *)&score_texte_2, RIGHT_MODE);
skichenaradjou 0:6efb56851ed3 75
skichenaradjou 0:6efb56851ed3 76 // Tactile sur le raquette
skichenaradjou 0:6efb56851ed3 77 while(start == false) {
skichenaradjou 0:6efb56851ed3 78 ts.GetState(&TS_State);
skichenaradjou 0:6efb56851ed3 79 x = TS_State.touchX[idx];
skichenaradjou 0:6efb56851ed3 80 y = TS_State.touchY[idx];
skichenaradjou 0:6efb56851ed3 81
skichenaradjou 0:6efb56851ed3 82 if (TS_State.touchDetected) {
skichenaradjou 0:6efb56851ed3 83
skichenaradjou 0:6efb56851ed3 84 if ((x>280) && (x<400) && (y>15) && (y<250)) {
skichenaradjou 0:6efb56851ed3 85 lcd.SetTextColor(LCD_COLOR_WHITE);
skichenaradjou 0:6efb56851ed3 86 lcd.FillRect(345, TS_State.touchY[0], 5, 40);
skichenaradjou 0:6efb56851ed3 87 lcd.DrawRect(10, 10, 350, 260);
skichenaradjou 0:6efb56851ed3 88 lcd.SetTextColor(LCD_COLOR_BLACK);
skichenaradjou 0:6efb56851ed3 89 lcd.FillRect(345, 0, 5, TS_State.touchY[0]-1);
skichenaradjou 0:6efb56851ed3 90 lcd.FillRect(345, TS_State.touchY[0]+40, 5, 100);
skichenaradjou 0:6efb56851ed3 91 }
skichenaradjou 0:6efb56851ed3 92 }
skichenaradjou 0:6efb56851ed3 93
skichenaradjou 0:6efb56851ed3 94 // Tactile sur la nalle pour démarrer le jeu
skichenaradjou 0:6efb56851ed3 95 if (TS_State.touchDetected) {
skichenaradjou 0:6efb56851ed3 96 if ( (x>190) && (x<210) && (y>125) && (y<145)) {
skichenaradjou 0:6efb56851ed3 97 start = true;
skichenaradjou 0:6efb56851ed3 98 jeu();
skichenaradjou 0:6efb56851ed3 99 }
skichenaradjou 0:6efb56851ed3 100 }
skichenaradjou 0:6efb56851ed3 101
skichenaradjou 0:6efb56851ed3 102 joueur_1 = a1.read();
skichenaradjou 0:6efb56851ed3 103 // joueur_2 = a2.read();
skichenaradjou 0:6efb56851ed3 104
skichenaradjou 0:6efb56851ed3 105 P1y1 = (joueur_1*212+8);
skichenaradjou 0:6efb56851ed3 106 P1y2 = P1y1 + 40;
skichenaradjou 0:6efb56851ed3 107 // P2y1 = (joueur_2*212+8);
skichenaradjou 0:6efb56851ed3 108 // P2y2 = P2y1 + 40;
skichenaradjou 0:6efb56851ed3 109
skichenaradjou 0:6efb56851ed3 110 lcd.SetTextColor(LCD_COLOR_WHITE);
skichenaradjou 0:6efb56851ed3 111 lcd.FillRect(15, P1y1, 5, 40);
skichenaradjou 0:6efb56851ed3 112 lcd.SetTextColor(LCD_COLOR_BLACK);
skichenaradjou 0:6efb56851ed3 113 lcd.FillRect(15, 0, 5, P1y1-1);
skichenaradjou 0:6efb56851ed3 114 lcd.FillRect(15, P1y2+1, 5, 200);
skichenaradjou 0:6efb56851ed3 115
skichenaradjou 0:6efb56851ed3 116
skichenaradjou 0:6efb56851ed3 117
skichenaradjou 0:6efb56851ed3 118 }
skichenaradjou 0:6efb56851ed3 119 }
skichenaradjou 0:6efb56851ed3 120
skichenaradjou 0:6efb56851ed3 121 //***********************************************************************************
skichenaradjou 0:6efb56851ed3 122
skichenaradjou 0:6efb56851ed3 123 //***********************************************************************************
skichenaradjou 0:6efb56851ed3 124 void jeu()
skichenaradjou 0:6efb56851ed3 125
skichenaradjou 0:6efb56851ed3 126 {
skichenaradjou 0:6efb56851ed3 127 while(score == false) {
skichenaradjou 0:6efb56851ed3 128
skichenaradjou 0:6efb56851ed3 129
skichenaradjou 0:6efb56851ed3 130
skichenaradjou 0:6efb56851ed3 131 joueur_1 = a1.read();
skichenaradjou 0:6efb56851ed3 132 // joueur_2 = a2.read();
skichenaradjou 0:6efb56851ed3 133
skichenaradjou 0:6efb56851ed3 134 P1y1 = (joueur_1*212+8);
skichenaradjou 0:6efb56851ed3 135 P1y2 = P1y1 + 40;
skichenaradjou 0:6efb56851ed3 136 // P2y1 = (joueur_2*212+8);
skichenaradjou 0:6efb56851ed3 137 // P2y2 = P2y1 + 40;
skichenaradjou 0:6efb56851ed3 138
skichenaradjou 0:6efb56851ed3 139 ts.GetState(&TS_State);
skichenaradjou 0:6efb56851ed3 140 x = TS_State.touchX[idx];
skichenaradjou 0:6efb56851ed3 141 y = TS_State.touchY[idx];
skichenaradjou 0:6efb56851ed3 142
skichenaradjou 0:6efb56851ed3 143 if (TS_State.touchDetected) {
skichenaradjou 0:6efb56851ed3 144
skichenaradjou 0:6efb56851ed3 145 if ((x>280) && (x<400) && (y>15) && (y<250)) {
skichenaradjou 0:6efb56851ed3 146 lcd.SetTextColor(LCD_COLOR_WHITE);
skichenaradjou 0:6efb56851ed3 147 lcd.FillRect(345, TS_State.touchY[0], 5, 40);
skichenaradjou 0:6efb56851ed3 148 lcd.DrawRect(10, 10, 350, 260);
skichenaradjou 0:6efb56851ed3 149 lcd.SetTextColor(LCD_COLOR_BLACK);
skichenaradjou 0:6efb56851ed3 150 lcd.FillRect(345, 0, 5, TS_State.touchY[0]-1);
skichenaradjou 0:6efb56851ed3 151 lcd.FillRect(345, TS_State.touchY[0]+40, 5, 100);
skichenaradjou 0:6efb56851ed3 152 }
skichenaradjou 0:6efb56851ed3 153 }
skichenaradjou 0:6efb56851ed3 154
skichenaradjou 0:6efb56851ed3 155
skichenaradjou 0:6efb56851ed3 156 lcd.SetTextColor(LCD_COLOR_WHITE);
skichenaradjou 0:6efb56851ed3 157 lcd.FillRect(15, P1y1, 5, 40);
skichenaradjou 0:6efb56851ed3 158 lcd.SetTextColor(LCD_COLOR_BLACK);
skichenaradjou 0:6efb56851ed3 159 lcd.FillRect(15, 0, 5, P1y1-1);
skichenaradjou 0:6efb56851ed3 160 lcd.FillRect(15, P1y2+1, 5, 200);
skichenaradjou 0:6efb56851ed3 161
skichenaradjou 0:6efb56851ed3 162
skichenaradjou 0:6efb56851ed3 163 // Gérer la physique de la balle
skichenaradjou 0:6efb56851ed3 164 lcd.SetTextColor(LCD_COLOR_BLACK);
skichenaradjou 0:6efb56851ed3 165 lcd.FillCircle(bx, by, 5);
skichenaradjou 0:6efb56851ed3 166 wait_ms(5);
skichenaradjou 0:6efb56851ed3 167 speed = 2;
skichenaradjou 0:6efb56851ed3 168 bx = bx + speed * cos(angle*2*PI/360);
skichenaradjou 0:6efb56851ed3 169 by = by - speed * sin(angle*2*PI/360);
skichenaradjou 0:6efb56851ed3 170
skichenaradjou 0:6efb56851ed3 171 // On gére les rebonds sur les raquettes
skichenaradjou 0:6efb56851ed3 172 if (((by>TS_State.touchY[0]-5 && by <TS_State.touchY[0]+40) && bx > 340) || ((by>P1y1 && by <P1y2+1) && bx < 25) ) {
skichenaradjou 0:6efb56851ed3 173 angle = 180-angle;
skichenaradjou 0:6efb56851ed3 174 } else if ( bx > 360 ) {
skichenaradjou 0:6efb56851ed3 175 start = false;
skichenaradjou 0:6efb56851ed3 176 bx = 200;
skichenaradjou 0:6efb56851ed3 177 by = 135;
skichenaradjou 0:6efb56851ed3 178 angle = angle+210;
skichenaradjou 0:6efb56851ed3 179 score_P1++;
skichenaradjou 0:6efb56851ed3 180 lcd.Clear(LCD_COLOR_BLACK);
skichenaradjou 0:6efb56851ed3 181 affichage_jeu();
skichenaradjou 0:6efb56851ed3 182 } else if (bx < 15) {
skichenaradjou 0:6efb56851ed3 183 start = false;
skichenaradjou 0:6efb56851ed3 184 bx = 200;
skichenaradjou 0:6efb56851ed3 185 by = 135;
skichenaradjou 0:6efb56851ed3 186 angle = angle+210;
skichenaradjou 0:6efb56851ed3 187 score_P2++;
skichenaradjou 0:6efb56851ed3 188 lcd.Clear(LCD_COLOR_BLACK);
skichenaradjou 0:6efb56851ed3 189 affichage_jeu();
skichenaradjou 0:6efb56851ed3 190 }
skichenaradjou 0:6efb56851ed3 191 // On gére les rebonds sur les murs
skichenaradjou 0:6efb56851ed3 192 if (((bx>15 && bx <345) && by > 250) || ((bx>15 && bx <340) && by < 25) ) {
skichenaradjou 0:6efb56851ed3 193 angle = -angle;
skichenaradjou 0:6efb56851ed3 194 }
skichenaradjou 0:6efb56851ed3 195
skichenaradjou 0:6efb56851ed3 196 lcd.SetTextColor(LCD_COLOR_WHITE);
skichenaradjou 0:6efb56851ed3 197 lcd.FillCircle(bx, by, 5);
skichenaradjou 0:6efb56851ed3 198 lcd.FillCircle(bx, by, 5);
skichenaradjou 0:6efb56851ed3 199 wait_ms(5);
skichenaradjou 0:6efb56851ed3 200
skichenaradjou 0:6efb56851ed3 201 }
skichenaradjou 0:6efb56851ed3 202 }
skichenaradjou 0:6efb56851ed3 203
skichenaradjou 0:6efb56851ed3 204 //***********************************************************************************
skichenaradjou 0:6efb56851ed3 205
skichenaradjou 0:6efb56851ed3 206 //***********************************************************************************
skichenaradjou 0:6efb56851ed3 207
skichenaradjou 0:6efb56851ed3 208 void menu_jeu()
skichenaradjou 0:6efb56851ed3 209 {
skichenaradjou 0:6efb56851ed3 210 bool debut_jeu = false;
skichenaradjou 0:6efb56851ed3 211
skichenaradjou 0:6efb56851ed3 212 lcd.DisplayStringAt(0, LINE(1), (uint8_t *)"PONG", CENTER_MODE);
skichenaradjou 0:6efb56851ed3 213 lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"Start", CENTER_MODE);
skichenaradjou 0:6efb56851ed3 214
skichenaradjou 0:6efb56851ed3 215 while(debut_jeu == false) {
skichenaradjou 0:6efb56851ed3 216
skichenaradjou 0:6efb56851ed3 217 ts.GetState(&TS_State);
skichenaradjou 0:6efb56851ed3 218 if (TS_State.touchDetected) {
skichenaradjou 0:6efb56851ed3 219
skichenaradjou 0:6efb56851ed3 220 x = TS_State.touchX[idx];
skichenaradjou 0:6efb56851ed3 221 y = TS_State.touchY[idx];
skichenaradjou 0:6efb56851ed3 222
skichenaradjou 0:6efb56851ed3 223 if ((x>195) && (x<255) && (y>110) && (y<155)) {
skichenaradjou 0:6efb56851ed3 224 lcd.Clear(LCD_COLOR_BLACK);
skichenaradjou 0:6efb56851ed3 225 affichage_jeu();
skichenaradjou 0:6efb56851ed3 226 debut_jeu = true;
skichenaradjou 0:6efb56851ed3 227
skichenaradjou 0:6efb56851ed3 228 }
skichenaradjou 0:6efb56851ed3 229 }
skichenaradjou 0:6efb56851ed3 230 }
skichenaradjou 0:6efb56851ed3 231 }
skichenaradjou 0:6efb56851ed3 232
skichenaradjou 0:6efb56851ed3 233 //*********************************************************************************
skichenaradjou 0:6efb56851ed3 234
skichenaradjou 0:6efb56851ed3 235
skichenaradjou 0:6efb56851ed3 236 int main()
skichenaradjou 0:6efb56851ed3 237 {
skichenaradjou 0:6efb56851ed3 238 init = ts.Init(lcd.GetXSize(), lcd.GetYSize());
skichenaradjou 0:6efb56851ed3 239 menu_jeu();
skichenaradjou 0:6efb56851ed3 240
skichenaradjou 0:6efb56851ed3 241 while(1) {
skichenaradjou 0:6efb56851ed3 242
skichenaradjou 0:6efb56851ed3 243
skichenaradjou 0:6efb56851ed3 244 }
skichenaradjou 0:6efb56851ed3 245 }
skichenaradjou 0:6efb56851ed3 246
skichenaradjou 0:6efb56851ed3 247 //*********************************************************************************