test avoid bulled game
Dependencies: C12832_lcd LCD_fonts mbed mbed-rtos
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 }
Generated on Wed Jul 13 2022 00:30:16 by 1.7.2