Revenge of the Mouse
Dependencies: 4DGL-uLCD-SE EthernetInterface Game_Synchronizer LCD_fonts MMA8452 SDFileSystem mbed-rtos mbed wave_player
Fork of 2035_Tanks_Shell by
Revision 9:ee330b1ba394, committed 2015-10-22
- Comitter:
- jford38
- Date:
- Thu Oct 22 21:34:00 2015 +0000
- Parent:
- 8:e6dd05393290
- Child:
- 10:5da9b27e050e
- Commit message:
- Added game_init() to set up buttons & leds (and eventually other stuff); Added game_menu() to display a splash screen and ask whether to play in single- or multi-player mode.; Fixed a bug in background_color().
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Game_Synchronizer.lib Thu Oct 22 21:34:00 2015 +0000 @@ -0,0 +1,1 @@ +http://developer.mbed.org/teams/ECE2035-Spring-2015-TA/code/Game_Synchronizer/#0d1343bfbfda
--- a/Game_Synchronizer/game_synchronizer.cpp Thu Oct 22 09:52:53 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,204 +0,0 @@ -#include "game_synchronizer.h" - -extern Serial pc; - -Game_Synchronizer::Game_Synchronizer(bool player) { - p1_p2 = player; -} - -void Game_Synchronizer::init(uLCD_4DGL* lcd, int mode) { - - // Save a pointer to the local lcd. - LCD = lcd; - // Save the play mode. (Multi-player or Single-player) - play_mode = mode; - - // Initialize the idx into the send_buffer to zero. - buffer_idx = 0; - - // buttons is the array containing player two's button (and accelerometer) values. - // Initialize it to zero. - memset(buttons, 0, sizeof(buttons)); - - switch (p1_p2) { - case PLAYER1: // If I am p1... - - // If play_mode is set to multi-player, establish the ethernet connection. - if(MULTI_PLAYER == play_mode) { - eth = new EthernetInterface(); - eth->init(PLAYER1_IP, "255.255.255.0", "0.0.0.0"); - eth->connect(); - - sock = new TCPSocketConnection(); - while(sock->connect(PLAYER2_IP, SERVER_PORT) < 0) { - //pc.printf("Trying to connect.\n"); - } - } - break; - case PLAYER2: // If I am p2... - - // If I am player 2, play_mode doesn't matter. I have to assume it's - // set to multi-player and try to connect to p1. - eth = new EthernetInterface(); - eth->init(PLAYER2_IP, "255.255.255.0", "0.0.0.0"); - eth->connect(); - - server = new TCPSocketServer(); - server->bind(SERVER_PORT); - server->listen(); - sock = new TCPSocketConnection(); - server->accept(*sock); - sock->set_blocking(false, 1500); - break; - } -} - -// Yes, this sucks. If you're smart, find a good way to do variable args and show me! -// Look into template metaprogramming! - -void Game_Synchronizer::draw(int CMD) {_draw(CMD, 0,0,0,0,0,0,0, 0); } -void Game_Synchronizer::draw(int CMD, int a) { _draw(CMD, a, 0,0,0,0,0,0, 1); } -void Game_Synchronizer::draw(int CMD, int a, int b) { _draw(CMD, a, b, 0,0,0,0,0, 2); } -void Game_Synchronizer::draw(int CMD, int a, int b, int c) { _draw(CMD, a, b, c, 0,0,0,0, 3); } -void Game_Synchronizer::draw(int CMD, int a, int b, int c, int d) { _draw(CMD, a, b, c, d, 0,0,0, 4); } -void Game_Synchronizer::draw(int CMD, int a, int b, int c, int d, int e) { _draw(CMD, a, b, c, d, e, 0,0, 5); } -void Game_Synchronizer::draw(int CMD, int a, int b, int c, int d, int e, int f) { _draw(CMD, a, b, c, d, e, f, 0, 6); } -void Game_Synchronizer::draw(int CMD, int a, int b, int c, int d, int e, int f, int g) { _draw(CMD, a, b, c, d, e, f, g, 7); } - -void Game_Synchronizer::_draw(int CMD, int a, int b, int c, int d, int e, int f, int g, char nArgs){ - - // I haven't had time to deal with overflows of the buffer. If you are pushing tons of draw calls into the buffer, - // you could overrun it. This will cause bad things. (At a minimum, your stuff won't be drawn.) - // If you have this problem, try calling update in the middle of your draw calls to flush the buffer. - // Alternatively, you can increase ETH_PACKET_SIZE. - - if(nArgs > 7) { - //pc.printf("Error in call to _draw(): nArgs > 7 not allowed!\n"); - return; - } - - buffer[buffer_idx] = CMD; - if(nArgs >= 1) buffer[buffer_idx+1] = a; - if(nArgs >= 2) buffer[buffer_idx+2] = b; - if(nArgs >= 3) buffer[buffer_idx+3] = c; - if(nArgs >= 4) buffer[buffer_idx+4] = d; - if(nArgs >= 5) buffer[buffer_idx+5] = e; - if(nArgs >= 6) buffer[buffer_idx+6] = f; - if(nArgs >= 7) buffer[buffer_idx+7] = g; - // ERROR: nArgs > 7 - - - buffer_idx += nArgs+1; -} - - -void Game_Synchronizer::background_color(int color) { draw(BG_COLOR_CMD, color); } -void Game_Synchronizer::line(int sx, int sy, int ex, int ey, int color) { draw(LINE_CMD, sx, sy, ex, ey, color); } -void Game_Synchronizer::circle(int x , int y , int radius, int color) { draw(CIRCLE_CMD, x, y, radius, color); } -void Game_Synchronizer::filled_circle(int x , int y , int radius, int color) { draw(FILLED_CIRCLE_CMD, x, y, radius, color); } -void Game_Synchronizer::triangle(int a, int b, int c, int d , int e, int f, int col) { draw(TRI_CMD, a, b, c, d, e, f, col); } -void Game_Synchronizer::rectangle(int a, int b, int c, int d, int col) { draw(RECT_CMD, a, b, c, d, col); } -void Game_Synchronizer::filled_rectangle(int a, int b, int c, int d, int col) { draw(FILLED_RECT_CMD, a, b, c, d, col); } -void Game_Synchronizer::pixel(int a, int b, int col) { draw(PIX_CMD, a, b, col); } -void Game_Synchronizer::cls(void) { draw(CLS_CMD); } - -/*void Game_Synchronizer::BLIT(int x1, int y1, int x2, int y2, int *colors) { - int size = abs((x1-x2)*(y1-y2)); - // pad to a multiple of 4 and memset buffer... - // I'll get to it later. -}*/ - -// Reads don't need to be done on the slave side. Hopefully both sides match! -int Game_Synchronizer::read_pixel(int x, int y) { return LCD->read_pixel(x, y); } - -void Game_Synchronizer::set_button_state(int a, int b, int c, int d, int e) { - buttons[0] = a; buttons[1] = b; buttons[2] = c; - buttons[3] = d; buttons[4] = e; -} - -int* Game_Synchronizer::get_button_state() { - return buttons; -} - -void Game_Synchronizer::update() { - int buffer_size = buffer_idx; - buffer_idx = 0; - - if(p1_p2 == PLAYER1 && MULTI_PLAYER == play_mode) { - sock->set_blocking(true, 100); - sock->send_all((char*)buffer, (buffer_size+1)*sizeof(buffer[0])); - - int n = sock->receive((char*)buttons, sizeof(buttons)); - //if(n < 0) {pc.printf("RECEIVE ERROR.\n");} - - }else if(p1_p2 == PLAYER2) { - sock->set_blocking(true, 100); - int n = sock->receive((char*)buffer, sizeof(buffer)); - //if(n < 0) {pc.printf("RECEIVE ERROR.\n");} - buffer[n] = '\0'; - buffer_size = n/sizeof(buffer[0]) - 1; - - sock->send_all((char*)buttons, sizeof(buttons)); - } - - int idx = 0; - while(idx < buffer_size) { - char cmd = buffer[idx]; - idx++; - - switch(cmd) { - case CLS_CMD: - LCD->cls(); - //pc.printf("Clear the screen!\n"); - break; - case BG_COLOR_CMD: - LCD->background_color(buffer[idx+1]); - //pc.printf("Change the background to 0x%X\n", buffer[idx]); - idx += 1; - break; - case LINE_CMD: - //pc.printf("LINE: (%d, %d) - (%d, %d) COLOR: 0x%X\n", buffer[idx], buffer[idx+1], buffer[idx+2], buffer[idx+3], buffer[idx+4]); - LCD->line(buffer[idx], buffer[idx+1], buffer[idx+2], buffer[idx+3], buffer[idx+4]); - idx += 5; - break; - case CIRCLE_CMD: - //pc.printf("CIRCLE: (%d, %d), r=%d\n", buffer[idx], buffer[idx+1], buffer[idx+2]); - LCD->circle(buffer[idx], buffer[idx+1], buffer[idx+2], buffer[idx+3]); - idx += 4; - break; - case FILLED_CIRCLE_CMD: - //pc.printf("CIRCLE: (%d, %d), r=%d\n", buffer[idx], buffer[idx+1], buffer[idx+2]); - LCD->filled_circle(buffer[idx], buffer[idx+1], buffer[idx+2], buffer[idx+3]); - idx += 4; - break; - case TRI_CMD: - //pc.printf("CIRCLE: (%d, %d), r=%d\n", buffer[idx], buffer[idx+1], buffer[idx+2]); - LCD->triangle(buffer[idx], buffer[idx+1], buffer[idx+2], buffer[idx+3], buffer[idx+4], buffer[idx+5], buffer[idx+6]); - idx += 7; - break; - case RECT_CMD: - LCD->rectangle(buffer[idx], buffer[idx+1], buffer[idx+2], buffer[idx+3], buffer[idx+4]); - idx += 5; - break; - case FILLED_RECT_CMD: - LCD->filled_rectangle(buffer[idx], buffer[idx+1], buffer[idx+2], buffer[idx+3], buffer[idx+4]); - idx += 5; - break; - case PIX_CMD: - LCD->pixel(buffer[idx], buffer[idx+1], buffer[idx+2]); - idx += 3; - break; - default: - //pc.printf("UNKNOWN CMD %d: This could get ugly!\n", cmd); - idx += 0; - } - } -} - -Game_Synchronizer::~Game_Synchronizer() { - sock->close(); - eth->disconnect(); - delete sock; - delete server; - delete eth; -}
--- a/Game_Synchronizer/game_synchronizer.h Thu Oct 22 09:52:53 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,96 +0,0 @@ -#ifndef GAME_SYNC_H__ -#define GAME_SYNC_H__ - -#include <cmath> -#include "uLCD_4DGL.h" -#include "EthernetInterface.h" - -#define PLAYER1 true -#define PLAYER2 false - -#define SINGLE_PLAYER 0 -#define MULTI_PLAYER 1 - -#define PLAYER1_IP "192.168.2.1" -#define PLAYER2_IP "192.168.2.2" -#define SERVER_PORT 7 -#define ETH_PACKET_SIZE 1024 - - -class Game_Synchronizer -{ - -public : - - int p1_p2; - - enum Color - { - CLS_CMD, - BG_COLOR_CMD, - LINE_CMD, - CIRCLE_CMD, - FILLED_CIRCLE_CMD, - TRI_CMD, - RECT_CMD, - FILLED_RECT_CMD, - PIX_CMD - }; - - Game_Synchronizer(bool player); - - void init(uLCD_4DGL*, int); - - // Yes, this sucks. If you're smart, find a good way to do variable args and show me! - // Look into template metaprogramming! - - void draw(int CMD); - void draw(int CMD, int a); - void draw(int CMD, int a, int b); - void draw(int CMD, int a, int b, int c); - void draw(int CMD, int a, int b, int c, int d); - void draw(int CMD, int a, int b, int c, int d, int e); - void draw(int CMD, int a, int b, int c, int d, int e, int f); - void draw(int CMD, int a, int b, int c, int d, int e, int f, int g); - void _draw(int CMD, int a, int b, int c, int d, int e, int f, int g, char nArgs); - - - void background_color(int color); - void line(int sx, int sy, int ex, int ey, int color); - void circle(int x , int y , int radius, int color); - void filled_circle(int x , int y , int radius, int color); - void triangle(int a, int b, int c, int d , int e, int f, int col); - void rectangle(int a, int b, int c, int d, int col); - void filled_rectangle(int a, int b, int c, int d, int col); - void pixel(int a, int b, int col); - void cls(void); - - //void BLIT(int x1, int y1, int x2, int y2, int *colors); // I'll get to this one later. - - // Reads don't need to be done on the slave side. Hopefully both sides match! - int read_pixel(int x, int y); - - void set_button_state(int a, int b, int c, int d, int e); - - int* get_button_state(); - - void update(void); - - ~Game_Synchronizer(); - - private: - - int play_mode; - int buffer[ETH_PACKET_SIZE]; - int buffer_idx; - - TCPSocketServer* server; - TCPSocketConnection* sock; - EthernetInterface* eth; - - uLCD_4DGL* LCD; - - int buttons[5]; -}; - -#endif \ No newline at end of file
--- a/main.cpp Thu Oct 22 09:52:53 2015 +0000 +++ b/main.cpp Thu Oct 22 21:34:00 2015 +0000 @@ -23,11 +23,22 @@ int game_menu(void) { // Figure out what mode the game will be run in. + + uLCD.locate(0,1); + uLCD.puts("Select Mode:"); + uLCD.locate(0,3); + uLCD.puts(" Single-Player:"); + uLCD.locate(0,4); + uLCD.puts(" Left Button"); + uLCD.locate(0,6); + uLCD.puts(" Multi-Player:"); + uLCD.locate(0,7); + uLCD.puts(" Right Button"); // Right button -> Multiplayer // Left button -> Single player while(1) { - if(!pb_r) { wait(1); return MULTI_PLAYER; } // Delay to allow user time to stop pushing the button before the game starts! - if(!pb_l) { wait(1); return SINGLE_PLAYER; } // return whichever game mode the user selected. + if(!pb_r) { return MULTI_PLAYER; } + if(!pb_l) { return SINGLE_PLAYER; } } } @@ -43,44 +54,42 @@ pc.printf("\033[2J\033[0;0H"); // Clear the terminal screen. pc.printf("I'm alive! Player 1\n"); // Let us know you made it this far. int mode = game_menu(); - sync.init(&uLCD, mode); // Connect to the other player. + sync.init(&uLCD, mode); // Connect to the other player. + //sync.cls(); pc.printf("Initialized...\n"); // Let us know you finished initializing. } int main (void) { int* p2_buttons; - long int tick, pre_tick; - srand (time(NULL)); - Timer timer; - - game_init(); - timer.start(); - tick = timer.read_ms(); - pre_tick = tick; - + float theta = 0; + bool first = true; - float theta = 0; while(1) { - sync.line(64,64,64+50*cos(theta),64+50*sin(theta), BLACK); + char howdy[] = "Howdy!"; + if(first) { + sync.background_color(BLUE); + sync.cls(); + + sync.locate(5,0); + sync.puts(howdy, sizeof(howdy)); + first = false; + } + sync.line(64,64,64+50*cos(theta),64+50*sin(theta), BLUE); theta += 0.05; sync.line(64,64,64+50*cos(theta),64+50*sin(theta), RED); sync.circle(10,10,100, GREEN); - sync.filled_circle(4,4,10, 0xAB); - sync.triangle(10,10, 20,20, 20,40, 0xAB); + sync.filled_circle(4,4,10, RED); + sync.triangle(10,10, 20,20, 20,40, RED); sync.rectangle(100,100, 90,90, GREEN); - sync.filled_rectangle(100,100, 110,110, 0xAB); + sync.filled_rectangle(100,100, 110,110, RED); sync.pixel(40, 40, WHITE); + sync.update(); - tick = timer.read_ms(); // Read current time - if(tick-pre_tick < 100){;} - pre_tick = tick; - - sync.update(); p2_buttons = sync.get_button_state(); led1 = p2_buttons[0] ^ !pb_u;