test avoid bulled game

Dependencies:   C12832_lcd LCD_fonts mbed mbed-rtos

main.cpp

Committer:
kaku_jyoko
Date:
2016-12-13
Revision:
40:ec5c1b305b9a
Parent:
39:e8d6dd3c75c7
Child:
45:7d0a58fbaa8b

File content as of revision 40:ec5c1b305b9a:

#include "mbed.h"
#include "C12832_lcd.h"
#include "Arial_9.h"
#include "Small_7.h"
#include "graphics.h"
#include "models.h"
#include "rtos.h"
#include "point.h"
#include "stdlib.h"
#include "convert.h"

C12832_LCD lcd;

// down: p12, left: p13, center: p14, up: p15, right: p16
InterruptIn button(p14);
AnalogIn aIn(p20);
DigitalOut led1(LED1);

Mutex jump_mtx;
Mutex update_mtx;
int jump_flag = 0;
Person h;
Stage stage;
Serial pc(USBTX, USBRX); // tx, rx
Bullet* b = NULL;
Timer t;
int white_board[LCD_Y][LCD_X];
int* wall_height;

void reset_white_board()
{
    for(int i = 0; i < LCD_Y; i++){
        for (int j = 0; j < LCD_X; j++){
            white_board[i][j] = 0;
        }
    }
}

void make_wall(){
    wall_height = stage.getStage();
    for(int i = 0; i < LCD_Y; i++){
        for(int j = 0; j < LCD_X ; j++){
            if(wall_height[j] > (LCD_Y - 1 - i)){
                white_board[i][j] = 1;
            }
        }
    }
}

void a(){
    h.jump();
}

void jump_receive(void const *argument){
    while(true){
        jump_mtx.lock();
        button.rise(&a);
        jump_mtx.unlock();
        //Thread::wait(0.1);
    }
}

void bullet_receive(void const *argument){
    point start;
    start.x = 127;
    start.y = 27;
    char c;
    while(true){
        t.start();
        c = pc.getc();
        if(c == 'a' && t.read() > 5.0){
            b = NULL;
            b = &Bullet(start, 2);
            t.reset();
        }
    }
}

int xabs(double x,double y){
  if(x>=y){
    return(x-y);
  }
  else if(y>x){
    return(y-x);
  }
}

bool bullet_collision(point p_person, point p_bullet){
    double person_center_x = p_person.x + PERSON_SIZE / 2;
    double person_center_y = p_person.y + PERSON_SIZE / 2;
    
    double bullet_center_x = p_bullet.x + BULLET_SIZE / 2;
    double bullet_center_y = p_bullet.y + BULLET_SIZE / 2;
    
    if(xabs(person_center_x, bullet_center_x) < (PERSON_SIZE / 2 + BULLET_SIZE / 2)){
        if(xabs(person_center_y, bullet_center_y) < (PERSON_SIZE / 2 + (BULLET_SIZE - 2) / 2)){
            return true;
        }
    }
    
    return false;
}

int main(){
    point p_person, p_bullet;
    printf("hello\n");
    Thread jump_th(jump_receive);
    Thread bullet_th(bullet_receive);
    lcd.setmode(XOR);
    bool gameover = false;
    bool isDisplay = false;
    srand((int)(aIn * 100));
    Converter converter;
    Bitmap picture;
    
    while(true){
        if(!gameover){
            update_mtx.lock();
            reset_white_board();
            make_wall();
            p_person = h.update(wall_height[3]);
           // p_person = h.update(1);
            if(b != NULL){
                p_bullet = b->update();
            }
            //printf("bullet  x: %d,  y: %d \n", p_bullet.x,p_bullet.y);
            //printf("person  x: %d,  y: %d \n", p_person.x,p_person.y);
            gameover = bullet_collision(p_person, p_bullet);
            picture = converter.convert(white_board);
            update_mtx.unlock();
            
            lcd.cls();
            lcd.print_bm(bitmPlayer,p_person.x,p_person.y);
            lcd.print_bm(picture,0,0);
            if(b != NULL){
                lcd.print_bm(bitmBullet_graphics, p_bullet.x, p_bullet.y);
            }
            lcd.copy_to_lcd();
            wait(0.02);
            lcd.cls();
            lcd.print_bm(bitmPlayerB,p_person.x,p_person.y);
            lcd.print_bm(picture,0,0);
            if(b != NULL){
                lcd.print_bm(bitmBullet_graphics, p_bullet.x, p_bullet.y);
            }
            lcd.copy_to_lcd();
            wait(0.02);
        } else {
            if(!isDisplay){
                lcd.cls();
                lcd.locate(5,10);
                lcd.printf("Game Over.");
                lcd.locate(5,22);
                lcd.printf("Your record is %d.", stage.getLength());
                lcd.copy_to_lcd();
                isDisplay = true;
            }
            
        }
    }
}