Simple Pong game on NokiaLCD with PS2
Dependencies: mbed PS2 NokiaLCD
main.cpp@0:93dce1e528b9, 2011-02-27 (annotated)
- Committer:
- wjohnsto
- Date:
- Sun Feb 27 23:35:17 2011 +0000
- Revision:
- 0:93dce1e528b9
- Child:
- 1:3cc8b1413557
Version 0.0
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
wjohnsto | 0:93dce1e528b9 | 1 | #include "mbed.h" |
wjohnsto | 0:93dce1e528b9 | 2 | #include "NokiaLCD.h" |
wjohnsto | 0:93dce1e528b9 | 3 | #include "PS2Keyboard.h" |
wjohnsto | 0:93dce1e528b9 | 4 | #include "ball.h" |
wjohnsto | 0:93dce1e528b9 | 5 | #include "paddle.h" |
wjohnsto | 0:93dce1e528b9 | 6 | |
wjohnsto | 0:93dce1e528b9 | 7 | typedef enum { |
wjohnsto | 0:93dce1e528b9 | 8 | RESET, RUN, PAUSE |
wjohnsto | 0:93dce1e528b9 | 9 | } STATES; |
wjohnsto | 0:93dce1e528b9 | 10 | |
wjohnsto | 0:93dce1e528b9 | 11 | NokiaLCD lcd(p5, p7, p8, p9, NokiaLCD::LCD6610); // mosi, sclk, cs, rst, type |
wjohnsto | 0:93dce1e528b9 | 12 | |
wjohnsto | 0:93dce1e528b9 | 13 | PS2Keyboard ps2kb(p12, p11); // CLK, DAT |
wjohnsto | 0:93dce1e528b9 | 14 | |
wjohnsto | 0:93dce1e528b9 | 15 | DigitalIn sw2(p24); |
wjohnsto | 0:93dce1e528b9 | 16 | DigitalIn sw1(p25); |
wjohnsto | 0:93dce1e528b9 | 17 | |
wjohnsto | 0:93dce1e528b9 | 18 | PwmOut g(p21); |
wjohnsto | 0:93dce1e528b9 | 19 | PwmOut b(p22); |
wjohnsto | 0:93dce1e528b9 | 20 | PwmOut r(p23); |
wjohnsto | 0:93dce1e528b9 | 21 | |
wjohnsto | 0:93dce1e528b9 | 22 | enum BUTTONS{ |
wjohnsto | 0:93dce1e528b9 | 23 | UP = 0xe75, |
wjohnsto | 0:93dce1e528b9 | 24 | DOWN = 0xe72, |
wjohnsto | 0:93dce1e528b9 | 25 | }; |
wjohnsto | 0:93dce1e528b9 | 26 | |
wjohnsto | 0:93dce1e528b9 | 27 | void drawScreen(Paddle paddle1, Paddle paddle2, Ball theBall, bool isBlack) { |
wjohnsto | 0:93dce1e528b9 | 28 | paddle1.draw(lcd, isBlack); |
wjohnsto | 0:93dce1e528b9 | 29 | paddle2.draw(lcd ,isBlack); |
wjohnsto | 0:93dce1e528b9 | 30 | theBall.draw(lcd ,isBlack); |
wjohnsto | 0:93dce1e528b9 | 31 | } |
wjohnsto | 0:93dce1e528b9 | 32 | |
wjohnsto | 0:93dce1e528b9 | 33 | void drawScores(Paddle paddle1, Paddle paddle2) { |
wjohnsto | 0:93dce1e528b9 | 34 | lcd.locate(7,0); |
wjohnsto | 0:93dce1e528b9 | 35 | lcd.putc('0' + paddle1.getScore()); |
wjohnsto | 0:93dce1e528b9 | 36 | lcd.locate(9,0); |
wjohnsto | 0:93dce1e528b9 | 37 | lcd.putc('0' + paddle2.getScore()); |
wjohnsto | 0:93dce1e528b9 | 38 | lcd.fill(66,0,2,130,0xFFFFFF); |
wjohnsto | 0:93dce1e528b9 | 39 | lcd.locate(7,15); |
wjohnsto | 0:93dce1e528b9 | 40 | lcd.putc('0' + paddle1.getLives()); |
wjohnsto | 0:93dce1e528b9 | 41 | lcd.locate(9,15); |
wjohnsto | 0:93dce1e528b9 | 42 | lcd.putc('0' + paddle2.getLives()); |
wjohnsto | 0:93dce1e528b9 | 43 | } |
wjohnsto | 0:93dce1e528b9 | 44 | |
wjohnsto | 0:93dce1e528b9 | 45 | int main() { |
wjohnsto | 0:93dce1e528b9 | 46 | PS2Keyboard::keyboard_event_t evt_kb; |
wjohnsto | 0:93dce1e528b9 | 47 | lcd.background(0x000000); |
wjohnsto | 0:93dce1e528b9 | 48 | lcd.cls(); |
wjohnsto | 0:93dce1e528b9 | 49 | Paddle paddle1, paddle2; |
wjohnsto | 0:93dce1e528b9 | 50 | Ball theBall; |
wjohnsto | 0:93dce1e528b9 | 51 | int temp, count=0; |
wjohnsto | 0:93dce1e528b9 | 52 | drawScreen(paddle1, paddle2, theBall, false); |
wjohnsto | 0:93dce1e528b9 | 53 | drawScores(paddle1, paddle2); |
wjohnsto | 0:93dce1e528b9 | 54 | STATES state = RESET; |
wjohnsto | 0:93dce1e528b9 | 55 | while(1) { |
wjohnsto | 0:93dce1e528b9 | 56 | switch(state) { |
wjohnsto | 0:93dce1e528b9 | 57 | case RESET: |
wjohnsto | 0:93dce1e528b9 | 58 | lcd.cls(); |
wjohnsto | 0:93dce1e528b9 | 59 | paddle1 = Paddle(1,10,5,25,0xFFFFFF,paddle1.getLives(),paddle1.getScore()); |
wjohnsto | 0:93dce1e528b9 | 60 | paddle2 = Paddle(125,3,5,25,0xFFFFFF,paddle2.getLives(),paddle2.getScore()); |
wjohnsto | 0:93dce1e528b9 | 61 | theBall = Ball(6,25,5,5,0xFFFF00,1,1); |
wjohnsto | 0:93dce1e528b9 | 62 | drawScreen(paddle1, paddle2, theBall, false); |
wjohnsto | 0:93dce1e528b9 | 63 | drawScores(paddle1, paddle2); |
wjohnsto | 0:93dce1e528b9 | 64 | state = PAUSE; |
wjohnsto | 0:93dce1e528b9 | 65 | break; |
wjohnsto | 0:93dce1e528b9 | 66 | case PAUSE: |
wjohnsto | 0:93dce1e528b9 | 67 | r = g = 0; |
wjohnsto | 0:93dce1e528b9 | 68 | b = 1; |
wjohnsto | 0:93dce1e528b9 | 69 | if(!sw2) { |
wjohnsto | 0:93dce1e528b9 | 70 | while(!sw2); |
wjohnsto | 0:93dce1e528b9 | 71 | state = RESET; |
wjohnsto | 0:93dce1e528b9 | 72 | break; |
wjohnsto | 0:93dce1e528b9 | 73 | } |
wjohnsto | 0:93dce1e528b9 | 74 | if(!sw1) { |
wjohnsto | 0:93dce1e528b9 | 75 | while(!sw1); |
wjohnsto | 0:93dce1e528b9 | 76 | state = RUN; |
wjohnsto | 0:93dce1e528b9 | 77 | } |
wjohnsto | 0:93dce1e528b9 | 78 | break; |
wjohnsto | 0:93dce1e528b9 | 79 | case RUN: |
wjohnsto | 0:93dce1e528b9 | 80 | r = g = 1; |
wjohnsto | 0:93dce1e528b9 | 81 | b = 0; |
wjohnsto | 0:93dce1e528b9 | 82 | if(!sw2) { |
wjohnsto | 0:93dce1e528b9 | 83 | while(!sw2); |
wjohnsto | 0:93dce1e528b9 | 84 | state = RESET; |
wjohnsto | 0:93dce1e528b9 | 85 | break; |
wjohnsto | 0:93dce1e528b9 | 86 | } |
wjohnsto | 0:93dce1e528b9 | 87 | if(!sw1) { |
wjohnsto | 0:93dce1e528b9 | 88 | while(!sw1); |
wjohnsto | 0:93dce1e528b9 | 89 | state = PAUSE; |
wjohnsto | 0:93dce1e528b9 | 90 | break; |
wjohnsto | 0:93dce1e528b9 | 91 | } |
wjohnsto | 0:93dce1e528b9 | 92 | if (ps2kb.processing(&evt_kb)) { |
wjohnsto | 0:93dce1e528b9 | 93 | temp = evt_kb.scancode[0]; |
wjohnsto | 0:93dce1e528b9 | 94 | for (int i = 1; i < evt_kb.length; i++) { |
wjohnsto | 0:93dce1e528b9 | 95 | temp <<= 4; |
wjohnsto | 0:93dce1e528b9 | 96 | temp |= evt_kb.scancode[i]; |
wjohnsto | 0:93dce1e528b9 | 97 | } |
wjohnsto | 0:93dce1e528b9 | 98 | switch(temp) { |
wjohnsto | 0:93dce1e528b9 | 99 | case UP: |
wjohnsto | 0:93dce1e528b9 | 100 | if(paddle1.getY()>2) |
wjohnsto | 0:93dce1e528b9 | 101 | paddle1.move(lcd, -2); |
wjohnsto | 0:93dce1e528b9 | 102 | break; |
wjohnsto | 0:93dce1e528b9 | 103 | case DOWN: |
wjohnsto | 0:93dce1e528b9 | 104 | if(paddle1.getY()+paddle1.getHeight()<128) |
wjohnsto | 0:93dce1e528b9 | 105 | paddle1.move(lcd, 2); |
wjohnsto | 0:93dce1e528b9 | 106 | break; |
wjohnsto | 0:93dce1e528b9 | 107 | } |
wjohnsto | 0:93dce1e528b9 | 108 | } |
wjohnsto | 0:93dce1e528b9 | 109 | if(count%3) |
wjohnsto | 0:93dce1e528b9 | 110 | paddle2.moveCPU(lcd, theBall.getY()); |
wjohnsto | 0:93dce1e528b9 | 111 | if(++count==5) { |
wjohnsto | 0:93dce1e528b9 | 112 | count = 0; |
wjohnsto | 0:93dce1e528b9 | 113 | if(theBall.hitP1((paddle1.getX()+paddle1.getWidth()), paddle1.getY(), paddle1.getHeight())) |
wjohnsto | 0:93dce1e528b9 | 114 | theBall.reverseX(); |
wjohnsto | 0:93dce1e528b9 | 115 | if(theBall.hitP2(paddle2.getX(), paddle2.getY(), paddle2.getHeight())) |
wjohnsto | 0:93dce1e528b9 | 116 | theBall.reverseX(); |
wjohnsto | 0:93dce1e528b9 | 117 | if(theBall.hitX()) { |
wjohnsto | 0:93dce1e528b9 | 118 | if(theBall.getX()<7) { |
wjohnsto | 0:93dce1e528b9 | 119 | if(!paddle1.loseLife()) { |
wjohnsto | 0:93dce1e528b9 | 120 | paddle1.setLives(3); |
wjohnsto | 0:93dce1e528b9 | 121 | paddle2.setLives(3); |
wjohnsto | 0:93dce1e528b9 | 122 | paddle2.addPoint(); |
wjohnsto | 0:93dce1e528b9 | 123 | } |
wjohnsto | 0:93dce1e528b9 | 124 | } |
wjohnsto | 0:93dce1e528b9 | 125 | else if(theBall.getX()>120) { |
wjohnsto | 0:93dce1e528b9 | 126 | if(!paddle2.loseLife()) { |
wjohnsto | 0:93dce1e528b9 | 127 | paddle2.setLives(3); |
wjohnsto | 0:93dce1e528b9 | 128 | paddle1.setLives(3); |
wjohnsto | 0:93dce1e528b9 | 129 | paddle1.addPoint(); |
wjohnsto | 0:93dce1e528b9 | 130 | } |
wjohnsto | 0:93dce1e528b9 | 131 | } |
wjohnsto | 0:93dce1e528b9 | 132 | theBall.reverseX(); |
wjohnsto | 0:93dce1e528b9 | 133 | state = RESET; |
wjohnsto | 0:93dce1e528b9 | 134 | } |
wjohnsto | 0:93dce1e528b9 | 135 | if(theBall.hitY()) |
wjohnsto | 0:93dce1e528b9 | 136 | theBall.reverseY(); |
wjohnsto | 0:93dce1e528b9 | 137 | theBall.move(lcd); |
wjohnsto | 0:93dce1e528b9 | 138 | } |
wjohnsto | 0:93dce1e528b9 | 139 | break; |
wjohnsto | 0:93dce1e528b9 | 140 | } |
wjohnsto | 0:93dce1e528b9 | 141 | drawScreen(paddle1, paddle2, theBall, false); |
wjohnsto | 0:93dce1e528b9 | 142 | drawScores(paddle1, paddle2); |
wjohnsto | 0:93dce1e528b9 | 143 | } |
wjohnsto | 0:93dce1e528b9 | 144 | } |