SimpleLib_03272011
Embed:
(wiki syntax)
Show/hide line numbers
mbedgc.cpp
00001 #include "mbed.h" 00002 #include "mbedGC/mbedgc.h" 00003 #include "Snake.h" 00004 #include "sprites.h" 00005 #include <string> 00006 #include "EthernetNetIf.h" 00007 #include "HTTPClient.h" 00008 00009 EthernetNetIf eth; 00010 00011 void apples(int); 00012 void startGame(); 00013 void endGame(); 00014 int networking(); 00015 00016 void drawNumbers(int, int, unsigned char, int); 00017 void drawStrings(int, int, unsigned char, string); 00018 Snake snake; 00019 int snake_x = 60; 00020 int snake_y = 10; 00021 int snake_direction = 0; 00022 int snake_length = 10; 00023 int snake_apples_eaten = 0; 00024 float logic_percent = 0; 00025 int score = 0; 00026 unsigned char snake_color = 192; 00027 00028 bool game_paused = false; 00029 bool faster = false; 00030 00031 const int num_apples = 10; 00032 00033 00034 int main() { 00035 00036 // networking(); 00037 00038 blankFB(); 00039 soundNoteHalf = 0; 00040 00041 NVIC_SetPriority(TIMER0_IRQn, 0); 00042 00043 COLOR_INIT(); 00044 TIMER0_INIT(); 00045 TIMER0_SETPCLK(CCLK4); 00046 TIMER0_SETPRESCALE(3000); // 3000 : 134 00047 TIMER0_SETMATCH(0, 132); 00048 TIMER0_SETMATCHCONTROL(0, MATCH_RESET | MATCH_INTERRUPT); // Reset and Interrupt each 100ms 00049 TIMER0_ENABLE_INTERRUPT(); 00050 TIMER0_START(); 00051 00052 setup(); 00053 00054 while (1){ 00055 loop(); 00056 00057 if (hsync_count > 0xFFFFF) 00058 hsync_count = 0x80000; 00059 00060 logic_count++; 00061 00062 if (logic_count > 0xFFFFFF) 00063 logic_count = 0; 00064 } 00065 00066 } 00067 00068 void drawRectangle(int x, int y, int width, int height, unsigned char color) 00069 { 00070 00071 if (x < 0 || y < 0) 00072 return; 00073 00074 for (int i = 0; i < height; i++) 00075 { 00076 00077 for (int j = 0; j < width; j++) 00078 { 00079 00080 framebuffer[ (y + i) % fbH ][ (x + j) % fbW ] = color; 00081 00082 } 00083 } 00084 } 00085 00086 void drawCharacter(int x, int y, unsigned char color, char ch) { 00087 00088 if (ch <= 'z' && ch >= 'a') 00089 ch = ch - 'a' + 10; 00090 else if (ch <= 'Z' && ch >= 'A') 00091 ch = ch - 'A' + 10; 00092 else if (ch <= '9' && ch >= '0') 00093 ch = ch - '0'; 00094 else if (ch == ' ') 00095 ch = 36; 00096 else if (ch == '.') 00097 ch = 37; 00098 00099 for (int i = 0; i < 5; i++) { 00100 00101 unsigned char buf = alphabet[ch][i]; 00102 00103 // buf = numbers[ch][i] << 3; 00104 00105 for (int j = 4; j >= 0; j--) { 00106 00107 framebuffer[(y + i) % fbH ][ (x + j) % fbW ] = (buf % 2) * color; 00108 buf = ( buf >> 1 ); 00109 } 00110 00111 y %= fbH; 00112 00113 } 00114 } 00115 00116 00117 void fill(unsigned char val) 00118 { 00119 00120 for (int i = 0; i < fbH; i++) 00121 { 00122 00123 for (int j = 0; j < fbW; j++) 00124 { 00125 framebuffer[i][j] = val; 00126 } 00127 } 00128 00129 } 00130 00131 void blankFB() 00132 { 00133 00134 for (int i = 0; i < fbH; i++) 00135 { 00136 for (int j = 0; j < fbW; j++) 00137 { 00138 framebuffer[i][j] = 0; 00139 } 00140 } 00141 00142 } 00143 00144 TIMER0_INTERRUPT_HANDLER(void) 00145 { 00146 TIMER0_CLEAR_INTERRUPT(MR0_INT); 00147 00148 vSync = 1; 00149 for( int i = 0; i < fbH * 2; i++ ) 00150 { 00151 COLOR_SET(0); 00152 hSync = 0; 00153 00154 for (int tmp = 0; tmp < 90; tmp++) { // 206 00155 __nop(); 00156 } 00157 00158 hSync = 1; 00159 00160 for (int tmp = 0; tmp < 110; tmp++) { // 206 00161 __nop(); 00162 } 00163 00164 for( int j = 0; j < fbW; j++ ) 00165 { 00166 unsigned char bp = framebuffer[ i / 2 ][ j ]; 00167 COLOR_SET(bp); 00168 00169 soundPin = (hsync_count % soundNote < soundNoteHalf) ? 1 : 0; 00170 00171 hsync_count++; 00172 00173 __nop(); 00174 __nop(); 00175 __nop(); 00176 __nop(); 00177 __nop(); 00178 __nop(); 00179 __nop(); 00180 } 00181 } 00182 COLOR_SET(0); 00183 00184 __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); //__nop(); 00185 // __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); 00186 00187 vSync = 0; 00188 00189 } 00190 00191 int getButton(WiiClassicControllerReader* const ctrlr) 00192 { 00193 //int bufSize = 0; 00194 //char* bufPtr = NULL; 00195 ctrlr->RequestRead(); 00196 00197 bool up = !ctrlr->getButtonDU(); 00198 if (up) return 2; 00199 00200 bool down = !ctrlr->getButtonDD(); 00201 if (down) return 0; 00202 00203 bool left = !ctrlr->getButtonDL(); 00204 if (left) return 3; 00205 00206 bool right = !ctrlr->getButtonDR(); 00207 if (right) return 1; 00208 00209 if (!ctrlr->getButtonSTART()) { 00210 game_paused = !game_paused; 00211 wait(0.5); 00212 } 00213 00214 return -1; 00215 } 00216 00217 // MBEDGC SNAKE BY J.P. ARMSTRONG WWW.JPARMSTRONG.COM 00218 // LICENSED UNDER GNU PUBLIC LICENSE. 00219 00220 void setup() 00221 { 00222 00223 drawStrings(28, 50, 28, "MBEDGC.COM"); 00224 00225 drawStrings(10, 70, 192, "JP. YIGAL. DANNY."); 00226 drawStrings(12, 78, 192, "SHAIN. ALFREDO."); 00227 00228 wait(3); 00229 blankFB(); 00230 00231 drawStrings(30, 50, 192, "FIU SENIOR"); 00232 drawStrings(28, 58, 192, "DESIGN 2011"); 00233 00234 wait(3); 00235 blankFB(); 00236 startGame(); 00237 } 00238 00239 void loop() 00240 { 00241 // KEEP THE SNAKE IN THE FRAMEBUFFER. 00242 // IF IT'S CORD ARE BEYOND THE FRAMEBUFFER. ADJUST IT. 00243 if (snake_y <= 0) 00244 snake_y = fbH - 1; 00245 00246 if (snake_x <= 0) 00247 snake_x = fbW - 1; 00248 00249 snake_y %= fbH; 00250 snake_x %= fbW; 00251 00252 // GET VALUE FROM CONTROLLER 00253 int tmp_sd; 00254 do { 00255 tmp_sd = getButton(&ctrlrA); 00256 } 00257 while (game_paused); 00258 00259 // MAKE SURE BUTTON WAS PRESSED OTHERWISE IGNORE IT. 00260 if (tmp_sd != -1) { 00261 00262 // YOU CAN'T GO LEFT IF YOU'RE ALREADY GOING RIGHT AND VICE VERSA 00263 // YOU CAN'T GO UP IF YOU'RE ALREADY GOING DOWN AND VICE VERSA 00264 if (!((snake_direction == 0 && tmp_sd == 2) || (snake_direction == 2 && tmp_sd == 0) || 00265 (snake_direction == 3 && tmp_sd == 1) || (snake_direction == 1 && tmp_sd == 3) )) { 00266 snake_direction = tmp_sd; 00267 } 00268 } 00269 00270 // PRODUCE NO SOUND 00271 soundNoteHalf = 0; 00272 00273 // INCREMENT OR DECREMENT SNAKE'S COORD DEPENDING ON DIRECTION 00274 switch (snake_direction) 00275 { 00276 case 0: 00277 snake_y += 2; 00278 break; 00279 case 2: 00280 snake_y -= 2; 00281 break; 00282 case 1: 00283 snake_x += 2; 00284 break; 00285 case 3: 00286 snake_x -= 2; 00287 break; 00288 } 00289 00290 // IF LOCATION SNAKE IS GOING IS AN APPLE. EAT IT. 00291 if (framebuffer[snake_y][snake_x] == 3) { 00292 00293 snake_apples_eaten++; 00294 snake_length += 2; 00295 00296 // DECREASE COUNTDOWN TIMER 00297 logic_count -= 50; 00298 00299 if (logic_count < 0) 00300 logic_count = 0; 00301 00302 score += 5; 00303 00304 // BEEP 00305 soundNote = 3100; 00306 soundNoteHalf = 1550; 00307 00308 // IF NO MORE APPLES ADD N MORE. "NEW LEVEL" 00309 if (snake_apples_eaten % num_apples == 0) { 00310 00311 score += (snake_apples_eaten / 10) * (100 - 100 * ((float) logic_count / 1000)); 00312 00313 soundNote = 2000; 00314 soundNoteHalf = 1000; 00315 00316 apples(num_apples); 00317 00318 } 00319 00320 drawNumbers(36, 105, 16, score); 00321 00322 } 00323 // IF NOT AN APPLE, AND NOT EMPTY SPACE, THE SNAKE EITHER 00324 // HIT THE WALL OR IT ITSELF AND THE GAME IS LOST. 00325 else if (framebuffer[snake_y][snake_x] != 0) { 00326 00327 00328 endGame(); 00329 startGame(); 00330 00331 00332 } 00333 else { 00334 soundNote = 4000; 00335 soundNoteHalf = 0; 00336 } 00337 00338 // ADVANCE THE SNAKE TO NEW POSITION 00339 snake.addHead(snake_x, snake_y); 00340 drawRectangle(snake_x, snake_y, 2, 2, snake_color); 00341 00342 // REMOVE THE TAIL UNLESS IT ATE AN APPLE. 00343 while (snake_length <= snake.getSize()) { 00344 drawRectangle(snake.getTailXCor(), snake.getTailYCor(), 2, 2, 0); 00345 snake.removeTail(); 00346 } 00347 00348 00349 // COUNT DOWN 00350 logic_percent = (float) logic_count / 1000 ; 00351 drawRectangle(60, 106, 48, 4 , 0); 00352 00353 if ((logic_percent * 100) < 75.0) { 00354 drawRectangle(60, 106, 48 - 48 * logic_percent, 4 , 192); 00355 } 00356 else { 00357 00358 if ((logic_percent * 100) > 100) { 00359 endGame(); 00360 startGame(); 00361 } 00362 else { 00363 drawRectangle(60, 106, 48 - 48 * logic_percent, 4 , 3); 00364 } 00365 00366 if (logic_count % 20 == 0) { 00367 soundNote = 4000; 00368 soundNoteHalf = 2000; 00369 } 00370 else { 00371 soundNoteHalf = 0; 00372 } 00373 } 00374 00375 // ADD DELAY TO THE LOGIC 00376 wait(0.05); 00377 } 00378 00379 // SETUP A NEW GAME 00380 void startGame() { 00381 00382 // blank framebuffer 00383 blankFB(); 00384 00385 // initialization variables 00386 snake_x = 60; 00387 snake_y = 12; 00388 snake_direction = 0; 00389 snake_apples_eaten = 0; 00390 snake_length = 10; 00391 score = 0; 00392 00393 00394 // add apples 00395 apples(num_apples); 00396 00397 // add head to beginning of snake linked list 00398 snake.addHead(snake_x, snake_y); 00399 00400 00401 // BLUE BORDERS 00402 drawRectangle(4, 10, 2, 90, 16); 00403 drawRectangle(4, 10, 104, 2, 16); 00404 00405 drawRectangle(108, 10, 2, 90, 16); 00406 drawRectangle(4, 100, 106, 2, 16); 00407 00408 // COUNTDOWN 00409 drawRectangle(59, 105, 50, 6 , 16); 00410 drawRectangle(60, 106, 48, 4 , 0); 00411 00412 logic_count = 0; 00413 00414 00415 drawNumbers(36, 105, 16, score); 00416 00417 } 00418 00419 void endGame() { 00420 // blankFB(); 00421 00422 soundNote = 4000; 00423 soundNoteHalf = soundNote / 2; 00424 00425 wait(0.1); 00426 00427 soundNoteHalf = 0; 00428 00429 00430 drawStrings(30, 40, 192, "GAME OVER"); 00431 drawStrings(28, 50, 192, "MBEDGC.COM"); 00432 drawNumbers(73, 60, 192, score); 00433 00434 wait(3); 00435 blankFB(); 00436 wait(0.1); 00437 00438 LocalFileSystem local("local"); // Create the local filesystem under the name "local" 00439 00440 FILE *fp = fopen("/local/hs.txt", "a"); // Open "out.txt" on the local file system for writing 00441 00442 char buf[16]; 00443 sprintf(buf, "AMS\t%05d\r\n", score); 00444 fprintf(fp, buf); 00445 00446 fclose(fp); 00447 00448 } 00449 00450 void drawStrings(int x, int y, unsigned char color, string str) { 00451 00452 for (int i = 0; i < str.size(); i++) { 00453 drawCharacter( x + (6 * i), y, color, str[i]); 00454 } 00455 00456 } 00457 00458 void drawNumbers(int x, int y, unsigned char color, int num) { 00459 00460 for (int i = 1; i <= 5; i++) { 00461 drawCharacter( x - (6 * i), y, color, num % 10); 00462 num /= 10; 00463 } 00464 } 00465 00466 // ADD N APPLES TO THE SCREEN 00467 void apples(int number) { 00468 00469 int i = 0; 00470 int x = 0, y = 0; 00471 00472 do { 00473 x = 2 * (rand() % (90 / 2)) + 6; 00474 y = 2 * (rand() % (86 / 2)) + 12; 00475 00476 // MAKE SURE YOU DON'T ADD AN APPLE ON THE SNAKE OR WALL 00477 if (framebuffer[y][x] == 0) { 00478 drawRectangle(x, y, 2 , 2, 3); 00479 i++; 00480 } 00481 00482 } 00483 while (i < number); 00484 } 00485 00486 00487 DigitalOut mled0(LED1); 00488 DigitalOut mled1(LED2); 00489 DigitalOut mled2(LED3); 00490 DigitalOut mled3(LED4); 00491 00492 00493 int networking() { 00494 00495 mled0 = 1; 00496 00497 printf("Init\n"); 00498 00499 printf("\r\nSetting up...\r\n"); 00500 EthernetErr ethErr = eth.setup(); 00501 00502 mled1 = 1; 00503 00504 if(ethErr) 00505 { 00506 printf("Error %d in setup.\n", ethErr); 00507 } 00508 mled2 = 1; 00509 printf("\r\nSetup OK\r\n"); 00510 00511 HTTPClient twitter; 00512 mled1 = 0; 00513 00514 HTTPMap msg; 00515 mled0 = 0; 00516 msg["status"] = "I am tweeting from my mbedgc!"; //A good example of Key/Value pair use with Web APIs 00517 00518 twitter.basicAuth("mbedgc", "mbgc321"); //We use basic authentication, replace with you account's parameters 00519 mled0 = 1; 00520 00521 //No need to retieve data sent back by the server 00522 HTTPResult r = twitter.post("http://api.supertweet.net/1/statuses/update.xml", msg, NULL); 00523 00524 if( r == HTTP_OK ) 00525 { 00526 printf("Tweet sent with success!\n"); 00527 00528 mled3 = 1; 00529 } 00530 else 00531 { 00532 printf("Problem during tweeting, return code %d\n", r); 00533 mled2 = 0; 00534 } 00535 00536 return 0; 00537 }
Generated on Fri Jul 15 2022 15:25:50 by
1.7.2