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 ECE2035 Spring 2015 TA

Files at this revision

API Documentation at this revision

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

Game_Synchronizer.lib Show annotated file Show diff for this revision Revisions of this file
Game_Synchronizer/game_synchronizer.cpp Show diff for this revision Revisions of this file
Game_Synchronizer/game_synchronizer.h Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- /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;