1st half of mbed DDR game
Dependencies: 4DGL-uLCD-SE PinDetect mbed
main.cpp
- Committer:
- jmelliadis3
- Date:
- 2014-04-29
- Revision:
- 0:5a54aaccd065
File content as of revision 0:5a54aaccd065:
#include "mbed.h" #include "uLCD_4DGL.h" #include "PinDetect.h" #include <mpr121.h> uLCD_4DGL uLCD(p28, p27, p29); // create a global lcd object // Create the interrupt receiver object on pin 26 InterruptIn interrupt(p26); // Setup the i2c bus on pins 28 and 27 I2C i2c(p9, p10); // Setup the Mpr121: // constructor(i2c object, i2c address of the mpr121) Mpr121 mpr121(&i2c, Mpr121::ADD_VSS); DigitalOut start (p21); DigitalOut stop (p22); InterruptIn songOver (p23); //PinDetect pb1(p26); int volatile score = 0; int volatile meter = 15; int scrollSpeed = 6; int volatile rightPressed = 0; int volatile leftPressed = 0; int volatile upPressed = 0; int volatile downPressed = 0; struct arrow { int yPos; int alive; arrow *next; }; arrow* leftRoot = NULL; arrow* rightRoot = NULL; arrow* upRoot = NULL; arrow* downRoot = NULL; enum gameState{ begin, playing, over}; int volatile state; enum node{ up, down, left, right, none }; enum difficultyLevels{ easy, medium, hard }; int volatile nodeToDelete(none); int volatile difficulty(easy); void deleteRoot (arrow* &root, int direction) { arrow* temp = root; switch(direction) { case 0: uLCD.line(4, root->yPos-scrollSpeed,24, root->yPos-scrollSpeed,0x0000FF); uLCD.line(4, root->yPos-scrollSpeed, 14, root->yPos+10-scrollSpeed, 0x0000FF); uLCD.line(4, root->yPos-scrollSpeed, 14, root->yPos-10-scrollSpeed, 0x0000FF); break; case 1: uLCD.line(47,root->yPos-scrollSpeed-10,47,root->yPos-scrollSpeed+10,0x0000FF); uLCD.line(47, root->yPos-scrollSpeed-10, 37, root->yPos-scrollSpeed, 0x0000FF); uLCD.line(47, root->yPos-scrollSpeed-10, 57, root->yPos-scrollSpeed, 0x0000FF); break; case 2: uLCD.line(80,root->yPos-scrollSpeed-10,80,root->yPos-scrollSpeed+10,0x0000FF); uLCD.line(80, root->yPos-scrollSpeed+10, 70, root->yPos-scrollSpeed, 0x0000FF); uLCD.line(80, root->yPos-scrollSpeed+10, 90, root->yPos-scrollSpeed, 0x0000FF); break; case 3: uLCD.line(104,root->yPos-scrollSpeed,124,root->yPos-scrollSpeed,0x0000FF); uLCD.line(124, root->yPos-scrollSpeed, 114, root->yPos-scrollSpeed+10, 0x0000FF); uLCD.line(124, root->yPos-scrollSpeed, 114, root->yPos-scrollSpeed-10, 0x0000FF); break; } root = root->next; delete temp; } void addToEnd (arrow* &root) { arrow * temp = root; if (root == NULL) { root = new arrow; root->yPos = 10; root->alive = 1; root->next = 0; } else { while (temp->next) { temp = temp->next; } temp->next = new arrow; temp = temp->next; temp->yPos = 10; temp->alive = 1; temp->next = 0; } } void fallInterrupt() { int key_code=0; int i=0; int value=mpr121.read(0x00); value +=mpr121.read(0x01)<<8; i=0; // puts key number out to LEDs for demo for (i=0; i<12; i++) { if (((value>>i)&0x01)==1) key_code=i+1; } switch (key_code) { case 2: upPressed = 1; if (upRoot) { if (upRoot->yPos > 100 && upRoot->yPos < 120) { score++; meter+=2; } if (upRoot->yPos > 95) { nodeToDelete = up; } } break; case 5: leftPressed = 1; if (leftRoot) { if (leftRoot->yPos > 100 && leftRoot->yPos < 120) { score++; meter+=2; } if (leftRoot->yPos > 95) { nodeToDelete = left; } } break; case 6: switch (state) { case begin: state = playing; break; case playing: break; case over: state = begin; break; } break; case 7: rightPressed = 1; if (rightRoot) { if (rightRoot->yPos > 100 && rightRoot->yPos < 120) { score++; meter+=2; } if (rightRoot->yPos > 95) { nodeToDelete = right; } } break; case 10: downPressed = 1; if (downRoot) { if (downRoot->yPos > 100 && downRoot->yPos < 120) { score++; meter+=2; } if (downRoot->yPos > 95) { nodeToDelete = down; } } break; case 4: if (state == begin) { difficulty = easy; } break; case 8: if (state == begin) { difficulty = medium; } break; case 12: if (state == begin) { difficulty = hard; } break; } } void pb1_hit_callback() { switch (state) { case begin: state = playing; break; case playing: break; case over: state = begin; break; } } void drawLeftArrow (int y) { uLCD.line(4,y-scrollSpeed,24,y-scrollSpeed,0x0000FF); uLCD.line(4, y-scrollSpeed, 14, y-scrollSpeed+10, 0x0000FF); uLCD.line(4, y-scrollSpeed, 14, y-scrollSpeed-10, 0x0000FF); uLCD.line(4,y,24,y,0x000000); uLCD.line(4, y, 14, y+10, 0x000000); uLCD.line(4, y, 14, y-10, 0x000000); } void drawUpArrow (int y) { uLCD.line(47,y-scrollSpeed-10,47,y-scrollSpeed+10,0x0000FF); uLCD.line(47, y-scrollSpeed-10, 37, y-scrollSpeed, 0x0000FF); uLCD.line(47, y-scrollSpeed-10, 57, y-scrollSpeed, 0x0000FF); uLCD.line(47,y-10,47,y+10,0x000000); uLCD.line(47, y-10, 37, y, 0x000000); uLCD.line(47, y-10, 57, y, 0x000000); } void drawDownArrow (int y) { uLCD.line(80,y-scrollSpeed-10,80,y-scrollSpeed+10,0x0000FF); uLCD.line(80, y-scrollSpeed+10, 70, y-scrollSpeed, 0x0000FF); uLCD.line(80, y-scrollSpeed+10, 90, y-scrollSpeed, 0x0000FF); uLCD.line(80,y-10,80,y+10,0x000000); uLCD.line(80, y+10, 70, y, 0x000000); uLCD.line(80, y+10, 90, y, 0x000000); } void drawRightArrow (int y) { uLCD.line(104,y-scrollSpeed,124,y-scrollSpeed,0x0000FF); uLCD.line(124, y-scrollSpeed, 114, y-scrollSpeed+10, 0x0000FF); uLCD.line(124, y-scrollSpeed, 114, y-scrollSpeed-10, 0x0000FF); uLCD.line(104,y,124,y,0x000000); uLCD.line(124, y, 114, y+10, 0x000000); uLCD.line(124, y, 114, y-10, 0x000000); } void songOverInterrupt () { state = over; } int main() { state = begin; srand(time(NULL)); interrupt.fall(&fallInterrupt); interrupt.mode(PullUp); songOver.rise(&songOverInterrupt); uLCD.baudrate(3000000); uLCD.cls(); uLCD.filled_rectangle(0,0,128,128,0x0000FF); int go = 1; int scoreWrite = 1; int ready; int leftCounter; int rightCounter; int upCounter; int downCounter; int deleted = 0; int drawArrow = 1; Timer t; float time = 0.0; arrow * temp; while(go) { t.reset(); t.start(); drawArrow = 1; switch (state) { case begin: uLCD.locate(5,2); uLCD.color(WHITE); uLCD.textbackground_color(BLUE); uLCD.text_mode(OPAQUE); uLCD.set_font(FONT_7X8); uLCD.printf("MBED DDR"); uLCD.locate(0,4); uLCD.printf("Difficulty: 3,7,11"); uLCD.locate(1,10); uLCD.printf("Press 5 to Start"); switch (difficulty) { case easy: leftCounter = rand()%200 + 75; rightCounter = rand()%200 + 75; upCounter = rand()%200 + 75; downCounter = rand()%200 + 75; scrollSpeed = 2; uLCD.locate(7,6); uLCD.printf("Easy "); break; case medium: leftCounter = rand()%150 + 50; rightCounter = rand()%150 + 50; upCounter = rand()%150 + 50; downCounter = rand()%150 + 50; scrollSpeed = 4; uLCD.locate(7,6); uLCD.printf("Medium"); break; case hard: leftCounter = rand()%100 + 25; rightCounter = rand()%100 + 25; upCounter = rand()%100 + 25; downCounter = rand()%100 + 25; scrollSpeed = 6; uLCD.locate(7,6); uLCD.printf("Hard "); break; } ready = 0; break; case playing: if (!ready) { uLCD.cls(); uLCD.filled_rectangle(0,0,128,128,0x0000FF); uLCD.filled_rectangle(0,100,3,120,0xFFFFFF); uLCD.filled_rectangle(25,100,36,120,0xFFFFFF); uLCD.filled_rectangle(58,100,69,120,0xFFFFFF); uLCD.filled_rectangle(91,100,103,120,0xFFFFFF); uLCD.filled_rectangle(125,100,128,120,0xFFFFFF); ready = 1; start = 1; stop = 0; } if (leftCounter <= 0){ addToEnd(leftRoot); switch (difficulty) { case easy: leftCounter = rand()%200 + 75; break; case medium: leftCounter = rand()%150 + 50; break; case hard: leftCounter = rand()%100 + 25; break; } drawArrow = 0; } leftCounter-=scrollSpeed; temp = leftRoot; while (temp != NULL) { drawLeftArrow(temp->yPos); (temp->yPos)+=scrollSpeed; temp = temp->next; } if (leftRoot != NULL) { if (leftRoot->yPos >= 120 || nodeToDelete == left) { meter--; deleteRoot(leftRoot, 0); deleted = 1; } } if (downCounter <= 0 && drawArrow){ addToEnd(downRoot); switch (difficulty) { case easy: downCounter = rand()%200 + 75; break; case medium: downCounter = rand()%150 + 50; break; case hard: downCounter = rand()%100 + 25; break; } drawArrow = 0; } downCounter-=scrollSpeed; temp = downRoot; while (temp != NULL) { drawDownArrow(temp->yPos); (temp->yPos)+=scrollSpeed; temp = temp->next; } if (downRoot != NULL) { if (downRoot->yPos >= 120 || nodeToDelete == down) { meter--; deleteRoot(downRoot, 2); deleted = 1; } } if (rightCounter <= 0 && drawArrow){ addToEnd(rightRoot); switch (difficulty) { case easy: rightCounter = rand()%200 + 75; break; case medium: rightCounter = rand()%150 + 50; break; case hard: rightCounter = rand()%100 + 25; break; } drawArrow = 0; } rightCounter-=scrollSpeed; temp = rightRoot; while (temp != NULL) { drawRightArrow(temp->yPos); (temp->yPos)+=scrollSpeed; temp = temp->next; } if (rightRoot != NULL) { if (rightRoot->yPos >= 120 || nodeToDelete == right) { meter--; deleteRoot(rightRoot, 3); deleted = 1; } } if (upCounter <= 0 && drawArrow){ addToEnd(upRoot); switch (difficulty) { case easy: upCounter = rand()%200 + 75; break; case medium: upCounter = rand()%150 + 50; break; case hard: upCounter = rand()%100 + 25; break; } drawArrow = 0; } upCounter-=scrollSpeed; temp = upRoot; while (temp != NULL) { drawUpArrow(temp->yPos); (temp->yPos)+=scrollSpeed; temp = temp->next; } if (upRoot != NULL) { if (upRoot->yPos >= 120 || nodeToDelete == up) { meter--; deleteRoot(upRoot, 1); deleted = 1; } } break; case over: if (ready) { stop = 1; start = 0; while (leftRoot) { deleteRoot(leftRoot,0); } while (upRoot) { deleteRoot(upRoot,1); } while (downRoot) { deleteRoot(downRoot,2); } while (rightRoot) { deleteRoot(rightRoot,3); } uLCD.locate(5,8); uLCD.color(WHITE); uLCD.textbackground_color(BLUE); uLCD.text_mode(OPAQUE); uLCD.set_font(FONT_7X8); uLCD.printf("Game Over"); uLCD.locate(14,0); uLCD.printf("%04d", score); ready = 0; score = 0; meter = 15; } break; } t.stop(); time = .1-t.read(); if (time < 0) time = 0; uLCD.locate(0,0); uLCD.printf("%04d", score); if (meter > 15) meter = 15; uLCD.locate(14,0); uLCD.printf("%4d", meter); if (meter < 0) state = over; if (deleted) { nodeToDelete = none; deleted = 0; } wait(time); } }