test avoid bulled game

Dependencies:   C12832_lcd LCD_fonts mbed mbed-rtos

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "C12832_lcd.h"
00003 #include "Arial_9.h"
00004 #include "Small_7.h"
00005 #include "graphics.h"
00006 #include "models.h"
00007 #include "rtos.h"
00008 #include "point.h"
00009 #include "stdlib.h"
00010 #include "convert.h"
00011 
00012 C12832_LCD lcd;
00013 
00014 // down: p12, left: p13, center: p14, up: p15, right: p16
00015 InterruptIn button(p14);
00016 AnalogIn aIn(p20);
00017 
00018 Mutex jump_mtx;
00019 Mutex update_mtx;
00020 Mutex bullet_mtx;
00021 
00022 Person h;
00023 Stage stage;
00024 Serial pc(USBTX, USBRX); // tx, rx
00025 Bullet* b = NULL;
00026 Timer t;
00027 
00028 int* wall_height;
00029 int white_board[LCD_Y][LCD_X];
00030 
00031 Bitmap make_wall(){
00032     Converter converter;
00033     wall_height = stage.getStage();
00034 
00035     //initialize white board
00036      for(int i = 0; i < LCD_Y; i++){
00037         for (int j = 0; j < LCD_X; j++){
00038             white_board[i][j] = 0;
00039         }
00040     }
00041     
00042     for(int i = 0; i < LCD_Y; i++){
00043         for(int j = 0; j < LCD_X ; j++){
00044             if(wall_height[j] > (LCD_Y - 1 - i)){
00045                 white_board[i][j] = 1;
00046             }
00047         }
00048     }
00049     
00050     return converter.convert(white_board);
00051     
00052 }
00053 
00054 void call_jump(){
00055     h.jump();
00056 }
00057 
00058 void jump_receive(void const *argument){
00059     while(true){
00060         jump_mtx.lock();
00061         wait(0.01);
00062         button.rise(&call_jump);
00063         jump_mtx.unlock();
00064         //Thread::wait(0.1);
00065     }
00066 }
00067 
00068 void bullet_receive(void const *argument){
00069     //bullet option
00070     int fast = HIGH_SPEED;
00071     int normal = NOMAL_SOEED;
00072     int slow = LOW_SPEED;
00073     int high = HIGH;
00074     int middle = MIDDLE;
00075     int low = LOW;
00076 
00077     point start;
00078     start.x = LCD_X - 1;
00079     char c;
00080     while(true){
00081         t.start();
00082         c = pc.getc();
00083         bullet_mtx.lock();
00084         if(c >= '1' && c <= '9' && t.read() > 5.0){
00085             b = NULL;
00086             switch(c){
00087                 case '1':
00088                     start.y = LCD_Y - high;
00089                     b = &Bullet(start, slow);
00090                     break;
00091                 case '2':
00092                     start.y = LCD_Y - high;
00093                     b = &Bullet(start, normal);
00094                     break;
00095                 case '3':
00096                     start.y = LCD_Y - high;
00097                     b = &Bullet(start, fast);
00098                     break;
00099                 case '4':
00100                     start.y = LCD_Y - middle;
00101                     b = &Bullet(start, slow);
00102                     break;
00103                 case '5':
00104                     start.y = LCD_Y - middle;
00105                     b = &Bullet(start, normal);
00106                     break;
00107                 case '6':
00108                     start.y = LCD_Y - middle;
00109                     b = &Bullet(start, fast);
00110                     break;
00111                 case '7':
00112                     start.y = LCD_Y - low;
00113                     b = &Bullet(start, slow);
00114                     break;
00115                 case '8':
00116                     start.y = LCD_Y - low;
00117                     b = &Bullet(start, normal);
00118                     break;
00119                 case '9':
00120                     start.y = LCD_Y - low;
00121                     b = &Bullet(start, fast);
00122                     break;
00123                 default:
00124                     break;
00125             }
00126             t.reset();
00127         }
00128         bullet_mtx.unlock();
00129     }
00130 }
00131 
00132 int xabs(double x,double y){
00133   if(x>=y){
00134     return(x-y);
00135   }
00136   else if(y>x){
00137     return(y-x);
00138   }
00139     return 0;
00140 }
00141 
00142 bool bullet_collision(point p_person, point p_bullet){
00143     //彈当たり判定
00144     double person_center_x = p_person.x + PERSON_SIZE / 2;
00145     double person_center_y = p_person.y + PERSON_SIZE / 2;
00146     
00147     double bullet_center_x = p_bullet.x + BULLET_SIZE / 2;
00148     double bullet_center_y = p_bullet.y + BULLET_SIZE / 2;
00149     
00150     if(xabs(person_center_x, bullet_center_x) < (PERSON_SIZE / 2 + BULLET_SIZE / 2)){
00151         if(xabs(person_center_y, bullet_center_y) < (PERSON_SIZE / 2 + (BULLET_SIZE - 2) / 2)){
00152             return true;
00153         }
00154     }
00155     
00156     return false;
00157 }
00158 
00159 bool wall_collision(point p_person){
00160     //壁衝突判定と穴落ち判定
00161     int x = p_person.x + 4;
00162     int y = p_person.y + 6;
00163     if(wall_height[x - 1] > (LCD_Y - y)){
00164         return true;
00165     }
00166     return false;
00167 }
00168 
00169 int main(){
00170     point p_person, p_bullet;
00171     Thread jump_th(jump_receive);
00172     Thread bullet_th(bullet_receive);
00173     lcd.setmode(XOR);
00174     bool gameover = false;
00175     bool isDisplay = false;
00176     srand((int)(aIn * 100));
00177     Bitmap wall;
00178     
00179     
00180     printf("New Game Start\n");
00181     printf("Bullet Option\n");
00182     printf("       slow    normal  fast\n");
00183     printf("high     1       2       3\n");
00184     printf("middle   4       5       6\n");
00185     printf("low      7       8       9\n");
00186     
00187     while(true){
00188         if(!gameover){
00189             wall = make_wall();
00190             update_mtx.lock();
00191             p_person = h.update(wall_height[3]);
00192             //p_person = h.update(1);
00193             if(b != NULL){
00194                 p_bullet = b->update();
00195             }
00196             
00197             update_mtx.unlock();
00198             
00199             gameover |= bullet_collision(p_person, p_bullet);
00200             gameover |= wall_collision(p_person);
00201             
00202             lcd.cls();
00203             lcd.print_bm(bitmPlayer,p_person.x,p_person.y);
00204             lcd.print_bm(wall,0,0);
00205             if(b != NULL){
00206                 lcd.print_bm(bitmBullet_graphics, p_bullet.x, p_bullet.y);
00207             }
00208             lcd.copy_to_lcd();
00209             wait(0.02);
00210             lcd.cls();
00211             lcd.print_bm(bitmPlayerB,p_person.x,p_person.y);
00212             lcd.print_bm(wall,0,0);
00213             if(b != NULL){
00214                 lcd.print_bm(bitmBullet_graphics, p_bullet.x, p_bullet.y);
00215             }
00216             lcd.copy_to_lcd();
00217             wait(0.02);
00218         } else {
00219             if(!isDisplay){
00220                 lcd.cls();
00221                 lcd.locate(5,10);
00222                 lcd.printf("Game Over.");
00223                 lcd.locate(5,22);
00224                 lcd.printf("Your record is %d.", stage.getLength());
00225                 lcd.copy_to_lcd();
00226                 isDisplay = true;
00227             }
00228             
00229         }
00230     }
00231 }