test avoid bulled game

Dependencies:   C12832_lcd LCD_fonts mbed mbed-rtos

Committer:
kaku_jyoko
Date:
Wed Dec 14 14:24:27 2016 +0000
Revision:
62:5d3f6c919fbc
Parent:
61:d44faf074743
Child:
63:4c22abbe4727
add bullet charge lump

Who changed what in which revision?

UserRevisionLine numberNew contents of line
th_mbed 0:26e5e770f91b 1 #include "mbed.h"
th_mbed 0:26e5e770f91b 2 #include "C12832_lcd.h"
th_mbed 0:26e5e770f91b 3 #include "Arial_9.h"
th_mbed 0:26e5e770f91b 4 #include "Small_7.h"
th_mbed 0:26e5e770f91b 5 #include "graphics.h"
kaku_jyoko 4:0fe59e58def9 6 #include "models.h"
kaku_jyoko 4:0fe59e58def9 7 #include "rtos.h"
kaku_jyoko 5:651879f4f047 8 #include "point.h"
kaku_jyoko 29:7784b098ef1d 9 #include "stdlib.h"
kaku_jyoko 32:abb3086c210d 10 #include "convert.h"
th_mbed 0:26e5e770f91b 11
th_mbed 0:26e5e770f91b 12 C12832_LCD lcd;
th_mbed 0:26e5e770f91b 13
kaku_jyoko 4:0fe59e58def9 14 // down: p12, left: p13, center: p14, up: p15, right: p16
kaku_jyoko 5:651879f4f047 15 InterruptIn button(p14);
kaku_jyoko 29:7784b098ef1d 16 AnalogIn aIn(p20);
kaku_jyoko 62:5d3f6c919fbc 17 BusOut leds(LED1, LED2, LED3, LED4);
kaku_jyoko 4:0fe59e58def9 18
kaku_jyoko 5:651879f4f047 19 Mutex jump_mtx;
kaku_jyoko 5:651879f4f047 20 Mutex update_mtx;
kaku_jyoko 57:873b89862cfb 21 Mutex bullet_mtx;
kaku_jyoko 60:d04bc5987d53 22
kaku_jyoko 6:e63641e13374 23 Person h;
kaku_jyoko 29:7784b098ef1d 24 Stage stage;
kaku_jyoko 18:0f6f2aa2339d 25 Serial pc(USBTX, USBRX); // tx, rx
kaku_jyoko 18:0f6f2aa2339d 26 Bullet* b = NULL;
kaku_jyoko 19:55f3114f3996 27 Timer t;
kaku_jyoko 60:d04bc5987d53 28
kaku_jyoko 29:7784b098ef1d 29 int* wall_height;
kaku_jyoko 61:d44faf074743 30 int white_board[LCD_Y][LCD_X];
kaku_jyoko 18:0f6f2aa2339d 31
kaku_jyoko 60:d04bc5987d53 32 Bitmap make_wall(){
kaku_jyoko 60:d04bc5987d53 33 Converter converter;
kaku_jyoko 60:d04bc5987d53 34 wall_height = stage.getStage();
kaku_jyoko 61:d44faf074743 35
kaku_jyoko 60:d04bc5987d53 36 //initialize white board
kaku_jyoko 60:d04bc5987d53 37 for(int i = 0; i < LCD_Y; i++){
kaku_jyoko 29:7784b098ef1d 38 for (int j = 0; j < LCD_X; j++){
kaku_jyoko 29:7784b098ef1d 39 white_board[i][j] = 0;
kaku_jyoko 29:7784b098ef1d 40 }
kaku_jyoko 29:7784b098ef1d 41 }
kaku_jyoko 60:d04bc5987d53 42
kaku_jyoko 29:7784b098ef1d 43 for(int i = 0; i < LCD_Y; i++){
kaku_jyoko 29:7784b098ef1d 44 for(int j = 0; j < LCD_X ; j++){
kaku_jyoko 39:e8d6dd3c75c7 45 if(wall_height[j] > (LCD_Y - 1 - i)){
kaku_jyoko 37:f5d98f22b6bd 46 white_board[i][j] = 1;
kaku_jyoko 29:7784b098ef1d 47 }
kaku_jyoko 29:7784b098ef1d 48 }
kaku_jyoko 29:7784b098ef1d 49 }
kaku_jyoko 60:d04bc5987d53 50
kaku_jyoko 60:d04bc5987d53 51 return converter.convert(white_board);
kaku_jyoko 60:d04bc5987d53 52
kaku_jyoko 29:7784b098ef1d 53 }
kaku_jyoko 4:0fe59e58def9 54
kaku_jyoko 55:e4e2274e5ec0 55 void call_jump(){
kaku_jyoko 6:e63641e13374 56 h.jump();
kaku_jyoko 4:0fe59e58def9 57 }
kaku_jyoko 4:0fe59e58def9 58
kaku_jyoko 18:0f6f2aa2339d 59 void jump_receive(void const *argument){
kaku_jyoko 4:0fe59e58def9 60 while(true){
kaku_jyoko 6:e63641e13374 61 jump_mtx.lock();
kaku_jyoko 55:e4e2274e5ec0 62 button.rise(&call_jump);
kaku_jyoko 6:e63641e13374 63 jump_mtx.unlock();
kaku_jyoko 6:e63641e13374 64 //Thread::wait(0.1);
th_mbed 0:26e5e770f91b 65 }
kaku_jyoko 5:651879f4f047 66 }
kaku_jyoko 5:651879f4f047 67
kaku_jyoko 18:0f6f2aa2339d 68 void bullet_receive(void const *argument){
kaku_jyoko 55:e4e2274e5ec0 69 //bullet option
th_mbed 59:6a99ec97eebd 70 int fast = HIGH_SPEED;
th_mbed 59:6a99ec97eebd 71 int normal = NOMAL_SOEED;
th_mbed 59:6a99ec97eebd 72 int slow = LOW_SPEED;
th_mbed 59:6a99ec97eebd 73 int high = HIGH;
th_mbed 59:6a99ec97eebd 74 int middle = MIDDLE;
th_mbed 59:6a99ec97eebd 75 int low = LOW;
kaku_jyoko 55:e4e2274e5ec0 76
kaku_jyoko 18:0f6f2aa2339d 77 point start;
th_mbed 59:6a99ec97eebd 78 start.x = LCD_X - 1;
kaku_jyoko 18:0f6f2aa2339d 79 char c;
kaku_jyoko 18:0f6f2aa2339d 80 while(true){
kaku_jyoko 19:55f3114f3996 81 t.start();
kaku_jyoko 18:0f6f2aa2339d 82 c = pc.getc();
kaku_jyoko 57:873b89862cfb 83 bullet_mtx.lock();
kaku_jyoko 62:5d3f6c919fbc 84 if(t.read() > 5.0){
kaku_jyoko 62:5d3f6c919fbc 85 leds = 0xf;
kaku_jyoko 62:5d3f6c919fbc 86 }else if(t.read() > (5.0 / 4.0 * 3.0)){
kaku_jyoko 62:5d3f6c919fbc 87 leds = 0x7;
kaku_jyoko 62:5d3f6c919fbc 88 }else if(t.read() > (5.0 / 4.0 * 2.0)){
kaku_jyoko 62:5d3f6c919fbc 89 leds = 0x3;
kaku_jyoko 62:5d3f6c919fbc 90 }else if(t.read() > (5.0 / 4.0 * 1.0)){
kaku_jyoko 62:5d3f6c919fbc 91 leds = 0x1;
kaku_jyoko 62:5d3f6c919fbc 92 }else {
kaku_jyoko 62:5d3f6c919fbc 93 leds = 0x0;
kaku_jyoko 62:5d3f6c919fbc 94 }
kaku_jyoko 55:e4e2274e5ec0 95 if(c >= '1' && c <= '9' && t.read() > 5.0){
kaku_jyoko 19:55f3114f3996 96 b = NULL;
kaku_jyoko 55:e4e2274e5ec0 97 switch(c){
kaku_jyoko 55:e4e2274e5ec0 98 case '1':
kaku_jyoko 55:e4e2274e5ec0 99 start.y = LCD_Y - high;
kaku_jyoko 55:e4e2274e5ec0 100 b = &Bullet(start, slow);
kaku_jyoko 55:e4e2274e5ec0 101 break;
kaku_jyoko 55:e4e2274e5ec0 102 case '2':
kaku_jyoko 55:e4e2274e5ec0 103 start.y = LCD_Y - high;
kaku_jyoko 55:e4e2274e5ec0 104 b = &Bullet(start, normal);
kaku_jyoko 55:e4e2274e5ec0 105 break;
kaku_jyoko 55:e4e2274e5ec0 106 case '3':
kaku_jyoko 55:e4e2274e5ec0 107 start.y = LCD_Y - high;
kaku_jyoko 55:e4e2274e5ec0 108 b = &Bullet(start, fast);
kaku_jyoko 55:e4e2274e5ec0 109 break;
kaku_jyoko 55:e4e2274e5ec0 110 case '4':
kaku_jyoko 55:e4e2274e5ec0 111 start.y = LCD_Y - middle;
kaku_jyoko 55:e4e2274e5ec0 112 b = &Bullet(start, slow);
kaku_jyoko 55:e4e2274e5ec0 113 break;
kaku_jyoko 55:e4e2274e5ec0 114 case '5':
kaku_jyoko 55:e4e2274e5ec0 115 start.y = LCD_Y - middle;
kaku_jyoko 55:e4e2274e5ec0 116 b = &Bullet(start, normal);
kaku_jyoko 55:e4e2274e5ec0 117 break;
kaku_jyoko 55:e4e2274e5ec0 118 case '6':
kaku_jyoko 55:e4e2274e5ec0 119 start.y = LCD_Y - middle;
kaku_jyoko 55:e4e2274e5ec0 120 b = &Bullet(start, fast);
kaku_jyoko 55:e4e2274e5ec0 121 break;
kaku_jyoko 55:e4e2274e5ec0 122 case '7':
kaku_jyoko 55:e4e2274e5ec0 123 start.y = LCD_Y - low;
kaku_jyoko 55:e4e2274e5ec0 124 b = &Bullet(start, slow);
kaku_jyoko 55:e4e2274e5ec0 125 break;
kaku_jyoko 55:e4e2274e5ec0 126 case '8':
kaku_jyoko 55:e4e2274e5ec0 127 start.y = LCD_Y - low;
kaku_jyoko 55:e4e2274e5ec0 128 b = &Bullet(start, normal);
kaku_jyoko 55:e4e2274e5ec0 129 break;
kaku_jyoko 55:e4e2274e5ec0 130 case '9':
kaku_jyoko 55:e4e2274e5ec0 131 start.y = LCD_Y - low;
kaku_jyoko 55:e4e2274e5ec0 132 b = &Bullet(start, fast);
kaku_jyoko 55:e4e2274e5ec0 133 break;
kaku_jyoko 55:e4e2274e5ec0 134 default:
kaku_jyoko 55:e4e2274e5ec0 135 break;
kaku_jyoko 55:e4e2274e5ec0 136 }
kaku_jyoko 19:55f3114f3996 137 t.reset();
kaku_jyoko 18:0f6f2aa2339d 138 }
kaku_jyoko 57:873b89862cfb 139 bullet_mtx.unlock();
kaku_jyoko 18:0f6f2aa2339d 140 }
kaku_jyoko 18:0f6f2aa2339d 141 }
kaku_jyoko 18:0f6f2aa2339d 142
kaku_jyoko 40:ec5c1b305b9a 143 int xabs(double x,double y){
kaku_jyoko 40:ec5c1b305b9a 144 if(x>=y){
kaku_jyoko 40:ec5c1b305b9a 145 return(x-y);
kaku_jyoko 40:ec5c1b305b9a 146 }
kaku_jyoko 40:ec5c1b305b9a 147 else if(y>x){
kaku_jyoko 40:ec5c1b305b9a 148 return(y-x);
kaku_jyoko 40:ec5c1b305b9a 149 }
kaku_jyoko 55:e4e2274e5ec0 150 return 0;
th_mbed 31:17b4ee41bdc5 151 }
th_mbed 31:17b4ee41bdc5 152
kaku_jyoko 40:ec5c1b305b9a 153 bool bullet_collision(point p_person, point p_bullet){
kaku_jyoko 54:64c0bdcc94ae 154 //彈当たり判定
kaku_jyoko 40:ec5c1b305b9a 155 double person_center_x = p_person.x + PERSON_SIZE / 2;
kaku_jyoko 40:ec5c1b305b9a 156 double person_center_y = p_person.y + PERSON_SIZE / 2;
kaku_jyoko 40:ec5c1b305b9a 157
kaku_jyoko 40:ec5c1b305b9a 158 double bullet_center_x = p_bullet.x + BULLET_SIZE / 2;
kaku_jyoko 40:ec5c1b305b9a 159 double bullet_center_y = p_bullet.y + BULLET_SIZE / 2;
kaku_jyoko 40:ec5c1b305b9a 160
kaku_jyoko 40:ec5c1b305b9a 161 if(xabs(person_center_x, bullet_center_x) < (PERSON_SIZE / 2 + BULLET_SIZE / 2)){
kaku_jyoko 40:ec5c1b305b9a 162 if(xabs(person_center_y, bullet_center_y) < (PERSON_SIZE / 2 + (BULLET_SIZE - 2) / 2)){
kaku_jyoko 40:ec5c1b305b9a 163 return true;
kaku_jyoko 40:ec5c1b305b9a 164 }
kaku_jyoko 40:ec5c1b305b9a 165 }
kaku_jyoko 40:ec5c1b305b9a 166
kaku_jyoko 40:ec5c1b305b9a 167 return false;
kaku_jyoko 29:7784b098ef1d 168 }
kaku_jyoko 29:7784b098ef1d 169
kaku_jyoko 45:7d0a58fbaa8b 170 bool wall_collision(point p_person){
kaku_jyoko 54:64c0bdcc94ae 171 //壁衝突判定と穴落ち判定
kaku_jyoko 58:3f1b71a9318c 172 int x = p_person.x + 4;
kaku_jyoko 45:7d0a58fbaa8b 173 int y = p_person.y + 6;
kaku_jyoko 45:7d0a58fbaa8b 174 if(wall_height[x - 1] > (LCD_Y - y)){
kaku_jyoko 45:7d0a58fbaa8b 175 return true;
kaku_jyoko 45:7d0a58fbaa8b 176 }
kaku_jyoko 45:7d0a58fbaa8b 177 return false;
kaku_jyoko 45:7d0a58fbaa8b 178 }
kaku_jyoko 45:7d0a58fbaa8b 179
kaku_jyoko 5:651879f4f047 180 int main(){
kaku_jyoko 18:0f6f2aa2339d 181 point p_person, p_bullet;
kaku_jyoko 18:0f6f2aa2339d 182 Thread jump_th(jump_receive);
kaku_jyoko 18:0f6f2aa2339d 183 Thread bullet_th(bullet_receive);
kaku_jyoko 29:7784b098ef1d 184 lcd.setmode(XOR);
kaku_jyoko 40:ec5c1b305b9a 185 bool gameover = false;
kaku_jyoko 40:ec5c1b305b9a 186 bool isDisplay = false;
kaku_jyoko 29:7784b098ef1d 187 srand((int)(aIn * 100));
kaku_jyoko 60:d04bc5987d53 188 Bitmap wall;
kaku_jyoko 60:d04bc5987d53 189
kaku_jyoko 60:d04bc5987d53 190
kaku_jyoko 58:3f1b71a9318c 191 printf("New Game Start\n");
kaku_jyoko 55:e4e2274e5ec0 192 printf("Bullet Option\n");
kaku_jyoko 55:e4e2274e5ec0 193 printf(" slow normal fast\n");
kaku_jyoko 55:e4e2274e5ec0 194 printf("high 1 2 3\n");
kaku_jyoko 55:e4e2274e5ec0 195 printf("middle 4 5 6\n");
kaku_jyoko 55:e4e2274e5ec0 196 printf("low 7 8 9\n");
kaku_jyoko 32:abb3086c210d 197
kaku_jyoko 5:651879f4f047 198 while(true){
kaku_jyoko 40:ec5c1b305b9a 199 if(!gameover){
kaku_jyoko 60:d04bc5987d53 200 wall = make_wall();
kaku_jyoko 58:3f1b71a9318c 201 update_mtx.lock();
kaku_jyoko 40:ec5c1b305b9a 202 p_person = h.update(wall_height[3]);
kaku_jyoko 55:e4e2274e5ec0 203 //p_person = h.update(1);
kaku_jyoko 40:ec5c1b305b9a 204 if(b != NULL){
kaku_jyoko 40:ec5c1b305b9a 205 p_bullet = b->update();
kaku_jyoko 40:ec5c1b305b9a 206 }
kaku_jyoko 55:e4e2274e5ec0 207
kaku_jyoko 58:3f1b71a9318c 208 update_mtx.unlock();
kaku_jyoko 58:3f1b71a9318c 209
kaku_jyoko 55:e4e2274e5ec0 210 gameover |= bullet_collision(p_person, p_bullet);
kaku_jyoko 55:e4e2274e5ec0 211 gameover |= wall_collision(p_person);
kaku_jyoko 40:ec5c1b305b9a 212
kaku_jyoko 40:ec5c1b305b9a 213 lcd.cls();
kaku_jyoko 40:ec5c1b305b9a 214 lcd.print_bm(bitmPlayer,p_person.x,p_person.y);
kaku_jyoko 60:d04bc5987d53 215 lcd.print_bm(wall,0,0);
kaku_jyoko 40:ec5c1b305b9a 216 if(b != NULL){
kaku_jyoko 40:ec5c1b305b9a 217 lcd.print_bm(bitmBullet_graphics, p_bullet.x, p_bullet.y);
kaku_jyoko 40:ec5c1b305b9a 218 }
kaku_jyoko 40:ec5c1b305b9a 219 lcd.copy_to_lcd();
kaku_jyoko 40:ec5c1b305b9a 220 wait(0.02);
kaku_jyoko 40:ec5c1b305b9a 221 lcd.cls();
kaku_jyoko 40:ec5c1b305b9a 222 lcd.print_bm(bitmPlayerB,p_person.x,p_person.y);
kaku_jyoko 60:d04bc5987d53 223 lcd.print_bm(wall,0,0);
kaku_jyoko 40:ec5c1b305b9a 224 if(b != NULL){
kaku_jyoko 40:ec5c1b305b9a 225 lcd.print_bm(bitmBullet_graphics, p_bullet.x, p_bullet.y);
kaku_jyoko 40:ec5c1b305b9a 226 }
kaku_jyoko 40:ec5c1b305b9a 227 lcd.copy_to_lcd();
kaku_jyoko 40:ec5c1b305b9a 228 wait(0.02);
kaku_jyoko 40:ec5c1b305b9a 229 } else {
kaku_jyoko 40:ec5c1b305b9a 230 if(!isDisplay){
kaku_jyoko 40:ec5c1b305b9a 231 lcd.cls();
kaku_jyoko 40:ec5c1b305b9a 232 lcd.locate(5,10);
kaku_jyoko 40:ec5c1b305b9a 233 lcd.printf("Game Over.");
kaku_jyoko 40:ec5c1b305b9a 234 lcd.locate(5,22);
kaku_jyoko 40:ec5c1b305b9a 235 lcd.printf("Your record is %d.", stage.getLength());
kaku_jyoko 40:ec5c1b305b9a 236 lcd.copy_to_lcd();
kaku_jyoko 40:ec5c1b305b9a 237 isDisplay = true;
kaku_jyoko 40:ec5c1b305b9a 238 }
kaku_jyoko 40:ec5c1b305b9a 239
kaku_jyoko 18:0f6f2aa2339d 240 }
kaku_jyoko 5:651879f4f047 241 }
kaku_jyoko 6:e63641e13374 242 }