Un jeu pong simple pour jouer à deux
Dependencies: TS_DISCO_F746NG mbed LCD_DISCO_F746NG BSP_DISCO_F746NG
main.cpp@0:6efb56851ed3, 2019-06-04 (annotated)
- Committer:
- skichenaradjou
- Date:
- Tue Jun 04 14:19:14 2019 +0000
- Revision:
- 0:6efb56851ed3
PONG_Sylvestre_Kichenaradjou
Who changed what in which revision?
User | Revision | Line number | New 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 | //********************************************************************************* |