Committer:
luwii
Date:
Tue Dec 15 18:43:27 2009 +0000
Revision:
0:b6c9c868d906

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
luwii 0:b6c9c868d906 1 #include "mbed.h"
luwii 0:b6c9c868d906 2 #include "MobileLCD.h"
luwii 0:b6c9c868d906 3 MobileLCD lcd(p5, p6, p7, p8, p9);
luwii 0:b6c9c868d906 4 Serial pc(USBTX, USBRX); // tx, rx
luwii 0:b6c9c868d906 5
luwii 0:b6c9c868d906 6 // ********************************************************************************
luwii 0:b6c9c868d906 7 // * Startup variables
luwii 0:b6c9c868d906 8 // ********************************************************************************
luwii 0:b6c9c868d906 9 //Ball speed
luwii 0:b6c9c868d906 10 int speedh;
luwii 0:b6c9c868d906 11 int speedv;
luwii 0:b6c9c868d906 12
luwii 0:b6c9c868d906 13 //Ball position
luwii 0:b6c9c868d906 14 int ballx = 5;
luwii 0:b6c9c868d906 15 int bally = 65;
luwii 0:b6c9c868d906 16
luwii 0:b6c9c868d906 17 //Score
luwii 0:b6c9c868d906 18 int scorel;
luwii 0:b6c9c868d906 19 int scorer;
luwii 0:b6c9c868d906 20
luwii 0:b6c9c868d906 21 //Paddle size
luwii 0:b6c9c868d906 22 const int paddle = 30;
luwii 0:b6c9c868d906 23
luwii 0:b6c9c868d906 24 //Win level
luwii 0:b6c9c868d906 25 const int winner = 3;
luwii 0:b6c9c868d906 26
luwii 0:b6c9c868d906 27 //Paddle position
luwii 0:b6c9c868d906 28 int lefty = 53;
luwii 0:b6c9c868d906 29 int righty = 50;
luwii 0:b6c9c868d906 30
luwii 0:b6c9c868d906 31 //Joystick position & input variables
luwii 0:b6c9c868d906 32 AnalogIn inl(p20);
luwii 0:b6c9c868d906 33 AnalogIn inr(p19);
luwii 0:b6c9c868d906 34 float joystickl;
luwii 0:b6c9c868d906 35 float joystickr;
luwii 0:b6c9c868d906 36
luwii 0:b6c9c868d906 37 // Number of players
luwii 0:b6c9c868d906 38 int players = 0;
luwii 0:b6c9c868d906 39
luwii 0:b6c9c868d906 40 // Loop until winner declared
luwii 0:b6c9c868d906 41 int playing = 1;
luwii 0:b6c9c868d906 42
luwii 0:b6c9c868d906 43 const int ballcolour = 0xFFFFFF;
luwii 0:b6c9c868d906 44
luwii 0:b6c9c868d906 45 // ********************************************************************************
luwii 0:b6c9c868d906 46
luwii 0:b6c9c868d906 47 // ********************************************************************************
luwii 0:b6c9c868d906 48 // * Display score, wait & wipe
luwii 0:b6c9c868d906 49 // ********************************************************************************
luwii 0:b6c9c868d906 50 void displayScore( int left, int right ) {
luwii 0:b6c9c868d906 51 lcd.locate ( 3, 2 ) ;
luwii 0:b6c9c868d906 52 lcd.printf( "%i %i ",left,right );
luwii 0:b6c9c868d906 53 //Check if we have a winner
luwii 0:b6c9c868d906 54 if ( left == winner) {
luwii 0:b6c9c868d906 55 lcd.locate( 3,4 );
luwii 0:b6c9c868d906 56 lcd.printf( "Left won!" );
luwii 0:b6c9c868d906 57 playing = 0;
luwii 0:b6c9c868d906 58 lcd.fill(0, 0, 5, 130, 0x0000FF); //left
luwii 0:b6c9c868d906 59 lcd.fill(126, 0, 4, 130, 0x000FFF); //right
luwii 0:b6c9c868d906 60 wait(2);
luwii 0:b6c9c868d906 61 }
luwii 0:b6c9c868d906 62 if ( right == winner) {
luwii 0:b6c9c868d906 63 lcd.locate( 3,4 );
luwii 0:b6c9c868d906 64 lcd.printf( "Right won!" );
luwii 0:b6c9c868d906 65 playing = 0;
luwii 0:b6c9c868d906 66 lcd.fill(0, 0, 5, 130, 0x0000FF); //left
luwii 0:b6c9c868d906 67 lcd.fill(126, 0, 4, 130, 0x000FFF); //right
luwii 0:b6c9c868d906 68 wait(2);
luwii 0:b6c9c868d906 69 }
luwii 0:b6c9c868d906 70 wait( 2 );
luwii 0:b6c9c868d906 71 lcd.fill(13, 0, 110, 25, 0x0000FF);
luwii 0:b6c9c868d906 72 }
luwii 0:b6c9c868d906 73 // ********************************************************************************
luwii 0:b6c9c868d906 74
luwii 0:b6c9c868d906 75
luwii 0:b6c9c868d906 76 // ********************************************************************************
luwii 0:b6c9c868d906 77 // * Setup screen to start
luwii 0:b6c9c868d906 78 // ********************************************************************************
luwii 0:b6c9c868d906 79 void startup( void ) {
luwii 0:b6c9c868d906 80 //speed
luwii 0:b6c9c868d906 81 speedh = 1;
luwii 0:b6c9c868d906 82 speedv = -1;
luwii 0:b6c9c868d906 83
luwii 0:b6c9c868d906 84 //Score
luwii 0:b6c9c868d906 85 scorel = 0;
luwii 0:b6c9c868d906 86 scorer = 0;
luwii 0:b6c9c868d906 87
luwii 0:b6c9c868d906 88 // *** Screen ***
luwii 0:b6c9c868d906 89 lcd.background(0x0000FF);
luwii 0:b6c9c868d906 90 lcd.cls();
luwii 0:b6c9c868d906 91 lcd.fill(1, lefty, 4, paddle, 0x00FF00); //left
luwii 0:b6c9c868d906 92 lcd.fill(126, righty, 4, paddle, 0x00FF00); //right
luwii 0:b6c9c868d906 93 lcd.fill(ballx, bally, 4, 4, ballcolour); //ball
luwii 0:b6c9c868d906 94 displayScore(scorel,scorer);
luwii 0:b6c9c868d906 95
luwii 0:b6c9c868d906 96
luwii 0:b6c9c868d906 97 // *** Calibrate analog in ***
luwii 0:b6c9c868d906 98 // * Start game at higheest voltage level for both inpout pins
luwii 0:b6c9c868d906 99
luwii 0:b6c9c868d906 100 }
luwii 0:b6c9c868d906 101 // ********************************************************************************
luwii 0:b6c9c868d906 102
luwii 0:b6c9c868d906 103
luwii 0:b6c9c868d906 104 // ********************************************************************************
luwii 0:b6c9c868d906 105 // Move the Ball
luwii 0:b6c9c868d906 106 // ********************************************************************************
luwii 0:b6c9c868d906 107 void moveBall ( void ) {
luwii 0:b6c9c868d906 108
luwii 0:b6c9c868d906 109 int retVal =0;
luwii 0:b6c9c868d906 110
luwii 0:b6c9c868d906 111 //Remove ball from screen
luwii 0:b6c9c868d906 112 lcd.fill( ballx,bally,4,4,0x0000FF );
luwii 0:b6c9c868d906 113
luwii 0:b6c9c868d906 114 // Normal x movement
luwii 0:b6c9c868d906 115 if ( (ballx + speedh > 4) && (ballx + speedh < 122)) {
luwii 0:b6c9c868d906 116 ballx = ballx + speedh;
luwii 0:b6c9c868d906 117
luwii 0:b6c9c868d906 118 } else {
luwii 0:b6c9c868d906 119 //Bounce off right paddle
luwii 0:b6c9c868d906 120 if (ballx+speedh >= 122) {
luwii 0:b6c9c868d906 121 if ( (bally>righty)&&(bally<righty+paddle) ) {
luwii 0:b6c9c868d906 122 ballx=122;
luwii 0:b6c9c868d906 123 speedh=speedh*(-1);
luwii 0:b6c9c868d906 124 ballx=ballx+speedh;
luwii 0:b6c9c868d906 125 } else {
luwii 0:b6c9c868d906 126 //Left scores
luwii 0:b6c9c868d906 127 scorel = scorel + 1;
luwii 0:b6c9c868d906 128 displayScore( scorel,scorer );
luwii 0:b6c9c868d906 129 //Ball speed
luwii 0:b6c9c868d906 130 speedh = -1;
luwii 0:b6c9c868d906 131 speedv = +1;
luwii 0:b6c9c868d906 132
luwii 0:b6c9c868d906 133 //Ball position
luwii 0:b6c9c868d906 134 ballx = 122;
luwii 0:b6c9c868d906 135 bally = righty+(paddle/2);
luwii 0:b6c9c868d906 136 }
luwii 0:b6c9c868d906 137 }
luwii 0:b6c9c868d906 138 //Bounce off left paddle
luwii 0:b6c9c868d906 139 if (ballx+speedh <=4) {
luwii 0:b6c9c868d906 140
luwii 0:b6c9c868d906 141 if ( (bally>lefty)&&(bally<lefty+paddle) ) {
luwii 0:b6c9c868d906 142 ballx=4;
luwii 0:b6c9c868d906 143 speedh=speedh*(-1);
luwii 0:b6c9c868d906 144 ballx=ballx+speedh;
luwii 0:b6c9c868d906 145 } else { //Right scores
luwii 0:b6c9c868d906 146 scorer = scorer + 1;
luwii 0:b6c9c868d906 147 displayScore( scorel,scorer );
luwii 0:b6c9c868d906 148 //Ball speed
luwii 0:b6c9c868d906 149 speedh = 1;
luwii 0:b6c9c868d906 150 speedv = -1;
luwii 0:b6c9c868d906 151
luwii 0:b6c9c868d906 152 //Ball position
luwii 0:b6c9c868d906 153 ballx = 5;
luwii 0:b6c9c868d906 154 bally = lefty+(paddle/2);
luwii 0:b6c9c868d906 155 }
luwii 0:b6c9c868d906 156 }
luwii 0:b6c9c868d906 157 } //else
luwii 0:b6c9c868d906 158
luwii 0:b6c9c868d906 159
luwii 0:b6c9c868d906 160 // Normal y movement
luwii 0:b6c9c868d906 161 if ( (bally + speedv > 0) && (bally + speedv < 126)) {
luwii 0:b6c9c868d906 162 bally = bally + speedv;
luwii 0:b6c9c868d906 163
luwii 0:b6c9c868d906 164 } else {
luwii 0:b6c9c868d906 165 // Bounce bottom
luwii 0:b6c9c868d906 166 if ( bally + speedv >= 126 ) {
luwii 0:b6c9c868d906 167 bally = 125;
luwii 0:b6c9c868d906 168 speedv = speedv*(-1);
luwii 0:b6c9c868d906 169 bally = bally + speedv;
luwii 0:b6c9c868d906 170 }
luwii 0:b6c9c868d906 171 // Bounce top
luwii 0:b6c9c868d906 172 if (bally + speedv <= 0 ) {
luwii 0:b6c9c868d906 173 bally = 0;
luwii 0:b6c9c868d906 174 speedv = speedv*(-1);
luwii 0:b6c9c868d906 175 bally = bally + speedv;
luwii 0:b6c9c868d906 176
luwii 0:b6c9c868d906 177 }
luwii 0:b6c9c868d906 178 } // else
luwii 0:b6c9c868d906 179
luwii 0:b6c9c868d906 180 // Draw ball if it is to be moved
luwii 0:b6c9c868d906 181 if ( retVal == 0 ) {
luwii 0:b6c9c868d906 182 lcd.fill(ballx, bally, 4, 4, ballcolour); //ball
luwii 0:b6c9c868d906 183 }
luwii 0:b6c9c868d906 184
luwii 0:b6c9c868d906 185 }
luwii 0:b6c9c868d906 186
luwii 0:b6c9c868d906 187 // ********************************************************************************
luwii 0:b6c9c868d906 188 // Move the Paddles
luwii 0:b6c9c868d906 189 // ********************************************************************************
luwii 0:b6c9c868d906 190
luwii 0:b6c9c868d906 191 void movePaddles( void ) {
luwii 0:b6c9c868d906 192
luwii 0:b6c9c868d906 193 //*** Left ***
luwii 0:b6c9c868d906 194
luwii 0:b6c9c868d906 195 lcd.fill(1, lefty, 4, paddle, 0x0000FF); //Clear paddle
luwii 0:b6c9c868d906 196 //Read paddle if 2 player
luwii 0:b6c9c868d906 197 if ( players == 2 ) {
luwii 0:b6c9c868d906 198 joystickl = inl.read();
luwii 0:b6c9c868d906 199 joystickl = joystickl * 100;
luwii 0:b6c9c868d906 200 joystickl = 53 - joystickl;
luwii 0:b6c9c868d906 201 lefty = joystickl*(130/47);
luwii 0:b6c9c868d906 202 } else {
luwii 0:b6c9c868d906 203 if ( lefty>bally ) {
luwii 0:b6c9c868d906 204 lefty--;
luwii 0:b6c9c868d906 205 }
luwii 0:b6c9c868d906 206 if ( lefty<bally ) {
luwii 0:b6c9c868d906 207 lefty++;
luwii 0:b6c9c868d906 208 }
luwii 0:b6c9c868d906 209 }
luwii 0:b6c9c868d906 210 //Auto move paddle if 1 player
luwii 0:b6c9c868d906 211
luwii 0:b6c9c868d906 212
luwii 0:b6c9c868d906 213 if ( lefty <0 ) {
luwii 0:b6c9c868d906 214 lefty = 0;
luwii 0:b6c9c868d906 215 }
luwii 0:b6c9c868d906 216 if ( lefty > (130-paddle) ) {
luwii 0:b6c9c868d906 217 lefty=130-paddle;
luwii 0:b6c9c868d906 218 }
luwii 0:b6c9c868d906 219
luwii 0:b6c9c868d906 220 lcd.fill(1, lefty, 4, paddle, 0x00FF00); //Draw paddle
luwii 0:b6c9c868d906 221
luwii 0:b6c9c868d906 222 //*** Right ***
luwii 0:b6c9c868d906 223 lcd.fill(126, righty, 4, paddle, 0x0000FF); //Clear paddle
luwii 0:b6c9c868d906 224 joystickr = inr.read();
luwii 0:b6c9c868d906 225 joystickr = joystickr * 100;
luwii 0:b6c9c868d906 226 joystickr = 53 - joystickr;
luwii 0:b6c9c868d906 227 righty = joystickr*(130/47);
luwii 0:b6c9c868d906 228 if ( righty <0 ) {
luwii 0:b6c9c868d906 229 righty = 0;
luwii 0:b6c9c868d906 230 }
luwii 0:b6c9c868d906 231 if ( righty > (130-paddle) ) {
luwii 0:b6c9c868d906 232 righty=130-paddle;
luwii 0:b6c9c868d906 233 }
luwii 0:b6c9c868d906 234 lcd.fill(126, righty, 4, paddle, 0x00FF00); //Draw paddle
luwii 0:b6c9c868d906 235 }
luwii 0:b6c9c868d906 236 // ********************************************************************************
luwii 0:b6c9c868d906 237
luwii 0:b6c9c868d906 238 // ********************************************************************************
luwii 0:b6c9c868d906 239 // Main menu
luwii 0:b6c9c868d906 240 // ********************************************************************************
luwii 0:b6c9c868d906 241 void menu( void ) {
luwii 0:b6c9c868d906 242 //Read right joystick level, change will start game
luwii 0:b6c9c868d906 243 joystickr = inr.read();
luwii 0:b6c9c868d906 244 joystickr = joystickr * 100;
luwii 0:b6c9c868d906 245 joystickr = 53 - joystickr;
luwii 0:b6c9c868d906 246 float startr = joystickr*(130/47);
luwii 0:b6c9c868d906 247
luwii 0:b6c9c868d906 248 //Display menu options, control with left joystick
luwii 0:b6c9c868d906 249 lcd.background(0x0000FF);
luwii 0:b6c9c868d906 250 lcd.cls();
luwii 0:b6c9c868d906 251 lcd.locate( 5,3 );
luwii 0:b6c9c868d906 252 lcd.printf( "mPong" );
luwii 0:b6c9c868d906 253 lcd.locate( 1,12 );
luwii 0:b6c9c868d906 254 lcd.printf( "(left=choose;");
luwii 0:b6c9c868d906 255 lcd.locate( 1,13 );
luwii 0:b6c9c868d906 256 lcd.printf( " right=start)" );
luwii 0:b6c9c868d906 257 int choose = 1;
luwii 0:b6c9c868d906 258 while ( choose==1 ) {
luwii 0:b6c9c868d906 259
luwii 0:b6c9c868d906 260 //*** Left ***
luwii 0:b6c9c868d906 261 joystickl = inl.read();
luwii 0:b6c9c868d906 262 joystickl = joystickl * 100;
luwii 0:b6c9c868d906 263 joystickl = 53 - joystickl;
luwii 0:b6c9c868d906 264 lefty = joystickl*(130/47);
luwii 0:b6c9c868d906 265
luwii 0:b6c9c868d906 266 if ( lefty < 44 ) {
luwii 0:b6c9c868d906 267 lcd.background( 0x550000 );
luwii 0:b6c9c868d906 268 lcd.locate (1,6);
luwii 0:b6c9c868d906 269 lcd.printf( "Single Player");
luwii 0:b6c9c868d906 270 lcd.background( 0x0000FF );
luwii 0:b6c9c868d906 271 lcd.locate (1,7);
luwii 0:b6c9c868d906 272 lcd.printf( "Double Player");
luwii 0:b6c9c868d906 273 players = 1;
luwii 0:b6c9c868d906 274 } else {
luwii 0:b6c9c868d906 275 lcd.background( 0x0000FF );
luwii 0:b6c9c868d906 276 lcd.locate (1,6);
luwii 0:b6c9c868d906 277 lcd.printf( "Single Player");
luwii 0:b6c9c868d906 278 lcd.background( 0x550000 );
luwii 0:b6c9c868d906 279 lcd.locate (1,7);
luwii 0:b6c9c868d906 280 lcd.printf( "Double Player");
luwii 0:b6c9c868d906 281 players = 2;
luwii 0:b6c9c868d906 282 }
luwii 0:b6c9c868d906 283 wait(0.1);
luwii 0:b6c9c868d906 284
luwii 0:b6c9c868d906 285 //Read right joystick level, change will start game
luwii 0:b6c9c868d906 286 joystickr = inr.read();
luwii 0:b6c9c868d906 287 joystickr = joystickr * 100;
luwii 0:b6c9c868d906 288 joystickr = 53 - joystickr;
luwii 0:b6c9c868d906 289 joystickr = joystickr*(130/47);
luwii 0:b6c9c868d906 290
luwii 0:b6c9c868d906 291 if ( (startr - joystickr) > 10 || (startr - joystickr ) < -10 ) {
luwii 0:b6c9c868d906 292 // Start game
luwii 0:b6c9c868d906 293 choose = 0;
luwii 0:b6c9c868d906 294 //Nice screen clear
luwii 0:b6c9c868d906 295 for ( choose=0; choose <65; choose++ ) {
luwii 0:b6c9c868d906 296 lcd.fill(65-choose, 0, 1, 130, 0x0000FF);
luwii 0:b6c9c868d906 297 lcd.fill(65+choose, 0, 1, 130, 0x0000FF);
luwii 0:b6c9c868d906 298 wait(0.02);
luwii 0:b6c9c868d906 299 playing=1;
luwii 0:b6c9c868d906 300 }
luwii 0:b6c9c868d906 301 }
luwii 0:b6c9c868d906 302
luwii 0:b6c9c868d906 303 }
luwii 0:b6c9c868d906 304 }
luwii 0:b6c9c868d906 305 // ********************************************************************************
luwii 0:b6c9c868d906 306 int main() {
luwii 0:b6c9c868d906 307 while ( 1 ) {
luwii 0:b6c9c868d906 308
luwii 0:b6c9c868d906 309 menu();
luwii 0:b6c9c868d906 310 startup();
luwii 0:b6c9c868d906 311
luwii 0:b6c9c868d906 312 // Main Loop
luwii 0:b6c9c868d906 313 while (playing == 1) {
luwii 0:b6c9c868d906 314 moveBall();
luwii 0:b6c9c868d906 315 movePaddles();
luwii 0:b6c9c868d906 316 wait(0.02);
luwii 0:b6c9c868d906 317 } // while playing
luwii 0:b6c9c868d906 318
luwii 0:b6c9c868d906 319 } // while 1
luwii 0:b6c9c868d906 320 }