2 Player Tron

Dependencies:   4DGL-uLCD-SE SDFileSystem mbed-rtos mbed wave_player

Fork of 2PlayerTron by Martin Yeh

Committer:
myeh
Date:
Tue Oct 20 22:00:45 2015 +0000
Revision:
0:682f13c1e0b8
Version 1.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
myeh 0:682f13c1e0b8 1
myeh 0:682f13c1e0b8 2 // uLCD-144-G2 demo program for uLCD-4GL LCD driver library
myeh 0:682f13c1e0b8 3 //
myeh 0:682f13c1e0b8 4 #include "mbed.h"
myeh 0:682f13c1e0b8 5 #include "uLCD_4DGL.h"
myeh 0:682f13c1e0b8 6 #include "rtos.h"
myeh 0:682f13c1e0b8 7 #include "SDFileSystem.h"
myeh 0:682f13c1e0b8 8 #include "wave_player.h"
myeh 0:682f13c1e0b8 9
myeh 0:682f13c1e0b8 10 uLCD_4DGL uLCD(p9,p10,p8); // serial tx, serial rx, reset pin;
myeh 0:682f13c1e0b8 11 BusIn joy1(p11,p12,p13,p14,p15);
myeh 0:682f13c1e0b8 12 BusIn joy2(p16,p17,p19,p20,p21);
myeh 0:682f13c1e0b8 13
myeh 0:682f13c1e0b8 14 int player1_direction = 1;
myeh 0:682f13c1e0b8 15 int player2_direction = 2;
myeh 0:682f13c1e0b8 16 bool hitClick;
myeh 0:682f13c1e0b8 17 bool play1 = false;
myeh 0:682f13c1e0b8 18 int choice = 1;
myeh 0:682f13c1e0b8 19 FILE *wave_file;
myeh 0:682f13c1e0b8 20
myeh 0:682f13c1e0b8 21 SDFileSystem sd(p5, p6, p7, p27, "sd"); //SD card
myeh 0:682f13c1e0b8 22 AnalogOut DACout(p18);
myeh 0:682f13c1e0b8 23 wave_player waver(&DACout);
myeh 0:682f13c1e0b8 24
myeh 0:682f13c1e0b8 25 // Thread 1
myeh 0:682f13c1e0b8 26 // Joystick 1
myeh 0:682f13c1e0b8 27 void joy1_thread(void const *args) {
myeh 0:682f13c1e0b8 28 while(true) {
myeh 0:682f13c1e0b8 29 switch(joy1) {
myeh 0:682f13c1e0b8 30 case 0x1e:
myeh 0:682f13c1e0b8 31 if (player1_direction != 4) {
myeh 0:682f13c1e0b8 32 player1_direction = 3;
myeh 0:682f13c1e0b8 33 }
myeh 0:682f13c1e0b8 34 break;
myeh 0:682f13c1e0b8 35 case 0x1d: hitClick = true; break;
myeh 0:682f13c1e0b8 36 case 0x1b:
myeh 0:682f13c1e0b8 37 if (player1_direction != 1) {
myeh 0:682f13c1e0b8 38 player1_direction = 2;
myeh 0:682f13c1e0b8 39 }
myeh 0:682f13c1e0b8 40 break;
myeh 0:682f13c1e0b8 41 case 0x17:
myeh 0:682f13c1e0b8 42 if (player1_direction != 3) {
myeh 0:682f13c1e0b8 43 player1_direction = 4;
myeh 0:682f13c1e0b8 44 }
myeh 0:682f13c1e0b8 45 break;
myeh 0:682f13c1e0b8 46 case 0xf:
myeh 0:682f13c1e0b8 47 if (player1_direction != 2) {
myeh 0:682f13c1e0b8 48 player1_direction = 1;
myeh 0:682f13c1e0b8 49 }
myeh 0:682f13c1e0b8 50 break;
myeh 0:682f13c1e0b8 51 }
myeh 0:682f13c1e0b8 52
myeh 0:682f13c1e0b8 53 Thread::wait(50);
myeh 0:682f13c1e0b8 54 }
myeh 0:682f13c1e0b8 55 }
myeh 0:682f13c1e0b8 56
myeh 0:682f13c1e0b8 57 // Thread 2
myeh 0:682f13c1e0b8 58 // Joystick 2
myeh 0:682f13c1e0b8 59 void joy2_thread(void const *args) {
myeh 0:682f13c1e0b8 60 while(true) {
myeh 0:682f13c1e0b8 61 switch(joy2) {
myeh 0:682f13c1e0b8 62 case 0x1e:
myeh 0:682f13c1e0b8 63 if (player2_direction != 4) {
myeh 0:682f13c1e0b8 64 player2_direction = 3;
myeh 0:682f13c1e0b8 65 }
myeh 0:682f13c1e0b8 66 break;
myeh 0:682f13c1e0b8 67 case 0x1d: hitClick = true; break;
myeh 0:682f13c1e0b8 68 case 0x1b:
myeh 0:682f13c1e0b8 69 if (player2_direction != 1) {
myeh 0:682f13c1e0b8 70 player2_direction = 2;
myeh 0:682f13c1e0b8 71 }
myeh 0:682f13c1e0b8 72 break;
myeh 0:682f13c1e0b8 73 case 0x17:
myeh 0:682f13c1e0b8 74 if (player2_direction != 3) {
myeh 0:682f13c1e0b8 75 player2_direction = 4;
myeh 0:682f13c1e0b8 76 }
myeh 0:682f13c1e0b8 77 break;
myeh 0:682f13c1e0b8 78 case 0xf:
myeh 0:682f13c1e0b8 79 if (player2_direction != 2) {
myeh 0:682f13c1e0b8 80 player2_direction = 1;
myeh 0:682f13c1e0b8 81 }
myeh 0:682f13c1e0b8 82 break;
myeh 0:682f13c1e0b8 83 }
myeh 0:682f13c1e0b8 84
myeh 0:682f13c1e0b8 85 Thread::wait(50);
myeh 0:682f13c1e0b8 86 }
myeh 0:682f13c1e0b8 87 }
myeh 0:682f13c1e0b8 88
myeh 0:682f13c1e0b8 89 int main()
myeh 0:682f13c1e0b8 90 {
myeh 0:682f13c1e0b8 91 Thread thread(joy1_thread);
myeh 0:682f13c1e0b8 92 Thread thread2(joy2_thread);
myeh 0:682f13c1e0b8 93
myeh 0:682f13c1e0b8 94
myeh 0:682f13c1e0b8 95 while (true) {
myeh 0:682f13c1e0b8 96 uLCD.filled_rectangle(0, 0, 128, 128, 0x000000);
myeh 0:682f13c1e0b8 97 uLCD.text_width(4); //4X size text
myeh 0:682f13c1e0b8 98 uLCD.text_height(4);
myeh 0:682f13c1e0b8 99 uLCD.color(RED);
myeh 0:682f13c1e0b8 100
myeh 0:682f13c1e0b8 101
myeh 0:682f13c1e0b8 102 wave_file=fopen("/sd/wavfiles/dp_tron_start.wav","r");
myeh 0:682f13c1e0b8 103 waver.play(wave_file);
myeh 0:682f13c1e0b8 104 fclose(wave_file);
myeh 0:682f13c1e0b8 105
myeh 0:682f13c1e0b8 106 for (int i=4; i>=0; --i) {
myeh 0:682f13c1e0b8 107 uLCD.locate(1.9,1.9);
myeh 0:682f13c1e0b8 108 uLCD.printf("%d",i);
myeh 0:682f13c1e0b8 109 Thread::wait(400);
myeh 0:682f13c1e0b8 110 }
myeh 0:682f13c1e0b8 111 uLCD.cls();
myeh 0:682f13c1e0b8 112
myeh 0:682f13c1e0b8 113 player1_direction = 1;
myeh 0:682f13c1e0b8 114 player2_direction = 2;
myeh 0:682f13c1e0b8 115 int velocity = 2;
myeh 0:682f13c1e0b8 116 int p1x = 50;
myeh 0:682f13c1e0b8 117 int p1y = 50;
myeh 0:682f13c1e0b8 118 int p2x = 100;
myeh 0:682f13c1e0b8 119 int p2y = 100;
myeh 0:682f13c1e0b8 120 int size = 2;
myeh 0:682f13c1e0b8 121 int vel = 2;
myeh 0:682f13c1e0b8 122 int count = 0;
myeh 0:682f13c1e0b8 123 int p1xH[1000];
myeh 0:682f13c1e0b8 124 int p1yH[1000];
myeh 0:682f13c1e0b8 125 int p2xH[1000];
myeh 0:682f13c1e0b8 126 int p2yH[1000];
myeh 0:682f13c1e0b8 127 int lost_player = 0;
myeh 0:682f13c1e0b8 128
myeh 0:682f13c1e0b8 129
myeh 0:682f13c1e0b8 130
myeh 0:682f13c1e0b8 131 bool game = true;
myeh 0:682f13c1e0b8 132 uLCD.filled_rectangle(0, 0, 128, 128, 0x000000);
myeh 0:682f13c1e0b8 133 //draw walls
myeh 0:682f13c1e0b8 134 uLCD.line(0, 0, 127, 0, WHITE);
myeh 0:682f13c1e0b8 135 uLCD.line(127, 0, 127, 127, WHITE);
myeh 0:682f13c1e0b8 136 uLCD.line(127, 127, 0, 127, WHITE);
myeh 0:682f13c1e0b8 137 uLCD.line(0, 127, 0, 0, WHITE);
myeh 0:682f13c1e0b8 138
myeh 0:682f13c1e0b8 139 uLCD.filled_rectangle(p1x, p1y, p1x + size, p1y + size, 0xFF0000);
myeh 0:682f13c1e0b8 140 uLCD.filled_rectangle(p2x, p2y, p2x + size, p2y + size, 0x0000FF);
myeh 0:682f13c1e0b8 141
myeh 0:682f13c1e0b8 142 while(game) {
myeh 0:682f13c1e0b8 143 // check the previous paths
myeh 0:682f13c1e0b8 144 p1xH[count] = p1x;
myeh 0:682f13c1e0b8 145 p1yH[count] = p1y;
myeh 0:682f13c1e0b8 146 p2xH[count] = p2x;
myeh 0:682f13c1e0b8 147 p2yH[count] = p2y;
myeh 0:682f13c1e0b8 148
myeh 0:682f13c1e0b8 149 // Movement for Player 1
myeh 0:682f13c1e0b8 150 if (player1_direction == 1) { // moving right
myeh 0:682f13c1e0b8 151 if (p1x >= 126 - size) {
myeh 0:682f13c1e0b8 152 lost_player = 1;
myeh 0:682f13c1e0b8 153 game = false;
myeh 0:682f13c1e0b8 154 }
myeh 0:682f13c1e0b8 155 p1x = p1x + vel;
myeh 0:682f13c1e0b8 156
myeh 0:682f13c1e0b8 157 } else if (player1_direction == 2) { // moving left
myeh 0:682f13c1e0b8 158 if (p1x <= size + 1) {
myeh 0:682f13c1e0b8 159 lost_player = 1;
myeh 0:682f13c1e0b8 160 game = false;
myeh 0:682f13c1e0b8 161 }
myeh 0:682f13c1e0b8 162 p1x = p1x - vel;
myeh 0:682f13c1e0b8 163
myeh 0:682f13c1e0b8 164 } else if (player1_direction == 3) { // moving up
myeh 0:682f13c1e0b8 165 if (p1y <= size + 1) {
myeh 0:682f13c1e0b8 166 lost_player = 1;
myeh 0:682f13c1e0b8 167 game = false;
myeh 0:682f13c1e0b8 168 }
myeh 0:682f13c1e0b8 169 p1y = p1y - vel;
myeh 0:682f13c1e0b8 170
myeh 0:682f13c1e0b8 171 } else if (player1_direction == 4) { // moving down
myeh 0:682f13c1e0b8 172 if (p1y >= 126 - size) {
myeh 0:682f13c1e0b8 173 lost_player = 1;
myeh 0:682f13c1e0b8 174 game = false;
myeh 0:682f13c1e0b8 175 }
myeh 0:682f13c1e0b8 176 p1y = p1y + vel;
myeh 0:682f13c1e0b8 177 }
myeh 0:682f13c1e0b8 178
myeh 0:682f13c1e0b8 179
myeh 0:682f13c1e0b8 180 // Movement for Player 2
myeh 0:682f13c1e0b8 181 if (player2_direction == 1) { // moving right
myeh 0:682f13c1e0b8 182 if (p2x >= 126 - size) {
myeh 0:682f13c1e0b8 183 lost_player = 2;
myeh 0:682f13c1e0b8 184 game = false;
myeh 0:682f13c1e0b8 185 }
myeh 0:682f13c1e0b8 186 p2x = p2x + vel;
myeh 0:682f13c1e0b8 187 } else if (player2_direction == 2) { // moving left
myeh 0:682f13c1e0b8 188 if (p2x <= size + 1) {
myeh 0:682f13c1e0b8 189 lost_player = 2;
myeh 0:682f13c1e0b8 190 game = false;
myeh 0:682f13c1e0b8 191 }
myeh 0:682f13c1e0b8 192 p2x = p2x - vel;
myeh 0:682f13c1e0b8 193 } else if (player2_direction == 3) { // moving up
myeh 0:682f13c1e0b8 194 if (p2y <= size + 1) {
myeh 0:682f13c1e0b8 195 lost_player = 2;
myeh 0:682f13c1e0b8 196 game = false;
myeh 0:682f13c1e0b8 197 }
myeh 0:682f13c1e0b8 198 p2y = p2y - vel;
myeh 0:682f13c1e0b8 199
myeh 0:682f13c1e0b8 200 } else if (player2_direction == 4) { // moving down
myeh 0:682f13c1e0b8 201 if (p2y >= 126 - size) {
myeh 0:682f13c1e0b8 202 lost_player = 2;
myeh 0:682f13c1e0b8 203 game = false;
myeh 0:682f13c1e0b8 204 }
myeh 0:682f13c1e0b8 205 p2y = p2y + vel;
myeh 0:682f13c1e0b8 206 }
myeh 0:682f13c1e0b8 207
myeh 0:682f13c1e0b8 208 //collision check
myeh 0:682f13c1e0b8 209 bool found = false;
myeh 0:682f13c1e0b8 210 for (int i=0; (i < count+1 && !found); i++) {
myeh 0:682f13c1e0b8 211 // for player 1
myeh 0:682f13c1e0b8 212 if ((p2xH[i] > (p1x + size)) || ((p2xH[i] + size) < p1x) || ((p2yH[i] + size) < p1y) || (p2yH[i] > (p1y + size))) {
myeh 0:682f13c1e0b8 213
myeh 0:682f13c1e0b8 214 } else {
myeh 0:682f13c1e0b8 215 found = true;
myeh 0:682f13c1e0b8 216 game = false;
myeh 0:682f13c1e0b8 217 lost_player = 1;
myeh 0:682f13c1e0b8 218 }
myeh 0:682f13c1e0b8 219
myeh 0:682f13c1e0b8 220 if (i > 0) {
myeh 0:682f13c1e0b8 221 int j = i - 1;
myeh 0:682f13c1e0b8 222 if ((p1xH[j] >= (p1x + size)) || ((p1xH[j] + size) <= p1x) || ((p1yH[j] + size) <= p1y) || (p1yH[j] >= (p1y + size))) {
myeh 0:682f13c1e0b8 223
myeh 0:682f13c1e0b8 224 } else {
myeh 0:682f13c1e0b8 225 found = true;
myeh 0:682f13c1e0b8 226 game = false;
myeh 0:682f13c1e0b8 227 lost_player = 1;
myeh 0:682f13c1e0b8 228 }
myeh 0:682f13c1e0b8 229 }
myeh 0:682f13c1e0b8 230
myeh 0:682f13c1e0b8 231 // for player 2
myeh 0:682f13c1e0b8 232 if ((p1xH[i] > (p2x + size)) || ((p1xH[i] + size) < p2x) || ((p1yH[i] + size) < p2y) || (p1yH[i] > (p2y + size))) {
myeh 0:682f13c1e0b8 233 //test passed
myeh 0:682f13c1e0b8 234 } else {
myeh 0:682f13c1e0b8 235 found = true;
myeh 0:682f13c1e0b8 236 game = false;
myeh 0:682f13c1e0b8 237 lost_player = 2;
myeh 0:682f13c1e0b8 238 }
myeh 0:682f13c1e0b8 239
myeh 0:682f13c1e0b8 240 if (i > 0) {
myeh 0:682f13c1e0b8 241 int j = i - 1;
myeh 0:682f13c1e0b8 242 if ((p2xH[j] >= (p2x + size)) || ((p2xH[j] + size) <= p2x) || ((p2yH[j] + size) <= p2y) || (p2yH[j] >= (p2y + size))) {
myeh 0:682f13c1e0b8 243
myeh 0:682f13c1e0b8 244 } else {
myeh 0:682f13c1e0b8 245 found = true;
myeh 0:682f13c1e0b8 246 game = false;
myeh 0:682f13c1e0b8 247 lost_player = 2;
myeh 0:682f13c1e0b8 248 }
myeh 0:682f13c1e0b8 249 }
myeh 0:682f13c1e0b8 250 }
myeh 0:682f13c1e0b8 251
myeh 0:682f13c1e0b8 252
myeh 0:682f13c1e0b8 253 //Drawing the path.
myeh 0:682f13c1e0b8 254 uLCD.filled_rectangle(p1x, p1y, p1x + size, p1y + size, 0xFF0000);
myeh 0:682f13c1e0b8 255 uLCD.filled_rectangle(p2x, p2y, p2x + size, p2y + size, 0x0000FF);
myeh 0:682f13c1e0b8 256
myeh 0:682f13c1e0b8 257
myeh 0:682f13c1e0b8 258
myeh 0:682f13c1e0b8 259 if (!game) {
myeh 0:682f13c1e0b8 260 uLCD.filled_rectangle(0, 0, 128, 128, 0x000000);
myeh 0:682f13c1e0b8 261 choice = 2;
myeh 0:682f13c1e0b8 262 play1 = true;
myeh 0:682f13c1e0b8 263 uLCD.locate(5,2);
myeh 0:682f13c1e0b8 264 uLCD.printf("Game over");
myeh 0:682f13c1e0b8 265 uLCD.locate(3,4);
myeh 0:682f13c1e0b8 266 uLCD.printf("Player %d LOST", lost_player);
myeh 0:682f13c1e0b8 267 uLCD.locate(2,9);
myeh 0:682f13c1e0b8 268 uLCD.color(GREEN);
myeh 0:682f13c1e0b8 269 uLCD.printf("Click to start!");
myeh 0:682f13c1e0b8 270 wave_file=fopen("/sd/wavfiles/dp_tron_end.wav","r");
myeh 0:682f13c1e0b8 271 waver.play(wave_file);
myeh 0:682f13c1e0b8 272 fclose(wave_file);
myeh 0:682f13c1e0b8 273 hitClick = false;
myeh 0:682f13c1e0b8 274 while (!hitClick) {
myeh 0:682f13c1e0b8 275 Thread::wait(300);
myeh 0:682f13c1e0b8 276 }
myeh 0:682f13c1e0b8 277 }
myeh 0:682f13c1e0b8 278 count = count + 1;
myeh 0:682f13c1e0b8 279 Thread::wait(30);
myeh 0:682f13c1e0b8 280 }
myeh 0:682f13c1e0b8 281
myeh 0:682f13c1e0b8 282 }
myeh 0:682f13c1e0b8 283 /*if ((x<=radius+1) || (x>=126-radius)) vx = -.90*vx;
myeh 0:682f13c1e0b8 284 if ((y<=radius+1) || (y>=126-radius)) vy = -.90*vy;*/
myeh 0:682f13c1e0b8 285 //......more code demos can be found in main.cpp
myeh 0:682f13c1e0b8 286 }