Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: C12832_lcd LCD_fonts mbed mbed-rtos
main.cpp
- Committer:
- kaku_jyoko
- Date:
- 2016-12-13
- Revision:
- 47:50c54cb24316
- Parent:
- 45:7d0a58fbaa8b
- Child:
- 49:726ebd187f75
File content as of revision 47:50c54cb24316:
#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;
}
bool wall_collision(point p_person){
int x = p_person.x + 5;
int y = p_person.y + 6;
printf("%d %d\n", wall_height[x - 1] , (LCD_Y - y));
if(wall_height[x - 1] > (LCD_Y - y)){
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);
gameover = wall_collision(p_person);
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;
}
}
}
}