#include "include.h" #include "func.h" #if TRACE_EN #define TRACE(...) printf(__VA_ARGS__) #else #define TRACE(...) #endif #ifdef TJD_BIRD_GAME_16M typedef struct f_game_t_ { uint32_t tick; int16_t speed; s16 bird_y_pos; s16 pipe_x_pos; s16 pipe_y_pos; uint8_t pipe_index; uint8_t pipe_cut; uint8_t status; //游戏状态 uint8_t bird_anim_cnt; } f_game_t; enum { COMPO_ID_GAME_STOP_PIC = 1, COMPO_ID_GAME_BIRD_PIC, COMPO_ID_GAME_PIPE_PIC_START, COMPO_ID_GAME_PIPE_PIC_END = 6, COMPO_ID_GAME_FAIL_PIC, COMPO_ID_GAME_FINISH_PIC, COMPO_ID_GAME_STOP_BTN, COMPO_ID_GAME_START_BTN, COMPO_ID_GAME_NOTICE, }; enum { GAME_STATUS_STOP, GAME_STATUS_WAIT_RUN, GAME_STATUS_RUNING, GAME_STATUS_GAMEOVER, GAME_STATUS_FINISH, GAME_STATUS_RESULT_WAIT, }; #define GAME_DOWN_ACC_V 1 //向下加速度 #define GAME_UP_ACC_V 5 //向上加速度 #define BIRD_X_POS (GUI_SCREEN_CENTER_X / 2) //小鸟图X坐标 #define BIRD_WIDTH 44 #define BIRD_HEIGHT (30) #define PIPE_SPEED 3 //管道移动速度 #define PIPE_X_GAP (GUI_SCREEN_CENTER_X + 80) //管道水平间隔 #define PIPE_Y_GAP 100 //管道纵向间隔 #define PIPE_PIC_WIDTH 50 //管道图片宽度 #define PIPE_PIC_HEIGHT 168 //管道图片高度 #define GAME_VALID_HEIGHT 280 //有效界面高度 #define GAME_CARD_WIDTH_ORG 80 #define GAME_CARD_HEIGHT_ORG 50 //计算上管道y坐标(中心参考点) #define CAL_PIPE_UP_Y_POS(pipe_down_y_pos, pipe_down_cut) ((pipe_down_y_pos) - (PIPE_PIC_HEIGHT / (pipe_down_cut) / 2) - (PIPE_PIC_HEIGHT / 2) - PIPE_Y_GAP) //计算下管道y坐标(中心参考点) #define CAL_PIPE_DOWM_Y_POS(pipe_down_cut) (GAME_VALID_HEIGHT - (PIPE_PIC_HEIGHT / (pipe_down_cut)) / 2) //创建游戏界面 compo_form_t *func_game_form_create(void) { compo_form_t *frm; component_t *compo; compo_cardbox_t * cardbox; uint8_t i; uint32_t pipe_bin_addr[] = {UI_BUF_GAME_GAME_PIPE_UP_BIN, UI_BUF_GAME_GAME_PIPE_DOWN_BIN}; //新建窗体和背景 frm = compo_form_create(true); //背景图 compo = (component_t *)compo_picturebox_create(frm, UI_BUF_GAME_GAME_BG_BIN); compo_picturebox_set_pos((compo_picturebox_t *)compo, GUI_SCREEN_CENTER_X, GUI_SCREEN_CENTER_Y); //stop pic compo = (component_t *)compo_picturebox_create(frm, UI_BUF_GAME_GAME_START_BIN); compo_setid(compo, COMPO_ID_GAME_STOP_PIC); compo_picturebox_set_pos((compo_picturebox_t *)compo, GUI_SCREEN_CENTER_X, GUI_SCREEN_CENTER_Y); //bird pic compo = (component_t *)compo_picturebox_create(frm, UI_BUF_GAME_GAME_BIRD_BIN); compo_setid(compo, COMPO_ID_GAME_BIRD_PIC); compo_picturebox_cut((compo_picturebox_t *)compo, 0, 3); compo_picturebox_set_pos((compo_picturebox_t *)compo, BIRD_X_POS, GUI_SCREEN_CENTER_Y); compo_picturebox_set_visible((compo_picturebox_t *)compo, false); //pipe pic for(i = 0; i < 4; i++) { compo = (component_t *)compo_picturebox_create(frm, pipe_bin_addr[i % 2]); compo_setid(compo, COMPO_ID_GAME_PIPE_PIC_START + i); compo_picturebox_set_visible((compo_picturebox_t *)compo, false); } //fail pic compo_shape_t *compo_shape = (compo_shape_t *)compo_radius_shape_create(frm,COMPO_SHAPE_TYPE_ROUNDED_RECTANGLE,20); compo_shape_set_color(compo_shape, make_color(128, 128, 128)); compo_shape_set_alpha(compo_shape,200); compo_setid(compo_shape, COMPO_ID_GAME_FAIL_PIC); compo_shape_set_location(compo_shape, GUI_SCREEN_CENTER_X, GUI_SCREEN_CENTER_Y, 220, 140); compo_shape_set_visible(compo_shape, false); //finish pic compo_shape = compo_radius_shape_create(frm,COMPO_SHAPE_TYPE_ROUNDED_RECTANGLE,20); compo_shape_set_color(compo_shape, make_color(128, 128, 128)); compo_shape_set_alpha(compo_shape,200); compo_setid(compo_shape, COMPO_ID_GAME_FINISH_PIC); compo_shape_set_location(compo_shape, GUI_SCREEN_CENTER_X, GUI_SCREEN_CENTER_Y, 220, 140); compo_shape_set_visible(compo_shape, false); cardbox = compo_cardbox_create(frm, 1, 0, 1, GAME_CARD_WIDTH_ORG, GAME_CARD_HEIGHT_ORG); compo_cardbox_set_pos(cardbox, 60, 160+ GAME_CARD_HEIGHT_ORG/2); compo_setid(cardbox, COMPO_ID_GAME_STOP_BTN); // compo_cardbox_set_alpha(cardbox,48); compo_cardbox_rect_set_location(cardbox, 0, 0, 0, GAME_CARD_WIDTH_ORG, GAME_CARD_HEIGHT_ORG, 20); compo_cardbox_rect_set_color(cardbox, 0, make_color(48,48,48)); compo_cardbox_text_set(cardbox, 0, i18n[STR_STOP]); //语音助手 compo_cardbox_text_set_location(cardbox, 0, 0, 0 , GAME_CARD_WIDTH_ORG - 16, 30); compo_cardbox_text0_scroll_process(cardbox); compo_cardbox_set_visible(cardbox, false); cardbox = compo_cardbox_create(frm, 1, 0, 1, GAME_CARD_WIDTH_ORG, GAME_CARD_HEIGHT_ORG); compo_cardbox_set_pos(cardbox, 180, 160+ GAME_CARD_HEIGHT_ORG/2); compo_setid(cardbox, COMPO_ID_GAME_START_BTN); // compo_cardbox_set_alpha(cardbox,48); compo_cardbox_rect_set_location(cardbox, 0, 0, 0, GAME_CARD_WIDTH_ORG, GAME_CARD_HEIGHT_ORG, 20); compo_cardbox_rect_set_color(cardbox, 0, make_color(48,48,48)); compo_cardbox_text_set(cardbox, 0, i18n[STR_START]); //语音助手 compo_cardbox_text_set_location(cardbox, 0, 0, 0 , GAME_CARD_WIDTH_ORG - 16, 30); compo_cardbox_text0_scroll_process(cardbox); compo_cardbox_set_visible(cardbox, false); compo_textbox_t *txt = compo_textbox_create(frm, 300); compo_textbox_set_font(txt, UI_BUF_0FONT_FONT_BIN); compo_setid(txt, COMPO_ID_GAME_NOTICE); compo_textbox_set_location(txt, GUI_SCREEN_CENTER_X, 110, 220, 20); compo_textbox_set_visible(txt,false); return frm; } //游戏初始化 static void func_game_init(void) { f_game_t *game = (f_game_t *)func_cb.f_cb; compo_picturebox_t *compo; compo_shape_t *compo_shape; uint8_t i; compo_shape = compo_getobj_byid(COMPO_ID_GAME_FAIL_PIC); if(compo_shape) { compo_shape_set_visible(compo_shape, false); } compo_shape = compo_getobj_byid(COMPO_ID_GAME_FINISH_PIC); if(compo_shape) { compo_shape_set_visible(compo_shape, false); } compo = compo_getobj_byid(COMPO_ID_GAME_STOP_PIC); if(compo) { compo_picturebox_set_visible(compo, true); } compo = compo_getobj_byid(COMPO_ID_GAME_BIRD_PIC); if(compo) { compo_picturebox_set_visible(compo, false); compo_picturebox_set_pos((compo_picturebox_t *)compo, GUI_SCREEN_CENTER_X / 2, GUI_SCREEN_CENTER_Y); } game->pipe_cut = 1; for(i = 0; i < 4; i++) { if(!(i % 2)) { compo = compo_getobj_byid(COMPO_ID_GAME_PIPE_PIC_START + i); if(compo) { compo_picturebox_cut((compo_picturebox_t *)compo, 0, game->pipe_cut + i/2); } } } compo_cardbox_t *compo_button = compo_getobj_byid(COMPO_ID_GAME_STOP_BTN); if(compo_button) { compo_cardbox_set_visible(compo_button, false); } compo_button = compo_getobj_byid(COMPO_ID_GAME_START_BTN); if(compo_button) { compo_cardbox_set_visible(compo_button, false); } game->bird_anim_cnt = 0; game->speed = 0; game->tick = tick_get(); game->bird_y_pos = GUI_SCREEN_CENTER_Y; game->pipe_index = 0; game->pipe_x_pos = GUI_SCREEN_WIDTH + GUI_SCREEN_CENTER_X; game->pipe_y_pos = CAL_PIPE_DOWM_Y_POS(game->pipe_cut); game->status = GAME_STATUS_WAIT_RUN; } //游戏中 static void func_game_runing(void) { f_game_t *game = (f_game_t *)func_cb.f_cb; compo_picturebox_t *compo; uint8_t i; uint16_t id; s16 x_pos, y_pos; uint8_t pipe_cut; s16 diff; if (tick_check_expire(game->tick, 1000 / 24)) //24hz { //bird pic refresh game->tick = tick_get(); game->bird_y_pos += game->speed; game->speed += GAME_DOWN_ACC_V; if(game->bird_y_pos >= GUI_SCREEN_HEIGHT) { game->status = GAME_STATUS_GAMEOVER; } if(game->bird_y_pos <= BIRD_HEIGHT/2) { game->bird_y_pos = BIRD_HEIGHT/2; } printf("game->bird_y_pos = %d\n",game->bird_y_pos); compo = compo_getobj_byid(COMPO_ID_GAME_BIRD_PIC); if(compo) { compo_picturebox_set_pos((compo_picturebox_t *)compo, GUI_SCREEN_CENTER_X / 2, game->bird_y_pos); compo_picturebox_cut((compo_picturebox_t *)compo, game->bird_anim_cnt, 3); game->bird_anim_cnt ++; game->bird_anim_cnt %= 3; } //pipe pic refresh x_pos = game->pipe_x_pos; y_pos = game->pipe_y_pos; pipe_cut = game->pipe_cut; for (i = 0; i < 4; i++) { id = COMPO_ID_GAME_PIPE_PIC_START + (game->pipe_index + i) % 4; compo = compo_getobj_byid(id); if(compo) { if(i % 2) { y_pos = CAL_PIPE_UP_Y_POS(y_pos, pipe_cut); } if(i == 2) { x_pos += PIPE_X_GAP; pipe_cut = 1 + (pipe_cut + 1) % 3; y_pos = CAL_PIPE_DOWM_Y_POS(pipe_cut); } compo_picturebox_set_pos((compo_picturebox_t *)compo, x_pos, y_pos); } } if(game->pipe_x_pos > (-PIPE_PIC_WIDTH / 2)) { //碰撞检测 if ((game->pipe_x_pos + PIPE_PIC_WIDTH / 2) >= (BIRD_X_POS - BIRD_WIDTH / 2)) { diff = (game->pipe_x_pos - PIPE_PIC_WIDTH / 2) - (BIRD_X_POS + BIRD_WIDTH / 2); if(diff <= 0) { y_pos = CAL_PIPE_DOWM_Y_POS(game->pipe_cut); if((y_pos - PIPE_PIC_HEIGHT / game->pipe_cut / 2) <= (game->bird_y_pos + BIRD_HEIGHT / 2)) { game->status = GAME_STATUS_GAMEOVER; } y_pos = CAL_PIPE_UP_Y_POS(y_pos, game->pipe_cut); if((y_pos + PIPE_PIC_HEIGHT / 2) >= (game->bird_y_pos - BIRD_HEIGHT / 2)) { game->status = GAME_STATUS_GAMEOVER; } } } else { //下一管道 diff = ((game->pipe_x_pos + PIPE_X_GAP) - PIPE_PIC_WIDTH / 2) - (BIRD_X_POS + BIRD_WIDTH / 2); if (diff <= 0) { y_pos = CAL_PIPE_DOWM_Y_POS(pipe_cut); if((y_pos - PIPE_PIC_HEIGHT / pipe_cut / 2) <= (game->bird_y_pos + BIRD_HEIGHT / 2)) { game->status = GAME_STATUS_GAMEOVER; } y_pos = CAL_PIPE_UP_Y_POS(y_pos, pipe_cut); if((y_pos + PIPE_PIC_HEIGHT / 2) >= (game->bird_y_pos - BIRD_HEIGHT / 2)) { game->status = GAME_STATUS_GAMEOVER; } } } if(diff > 0 && diff < PIPE_SPEED) { game->pipe_x_pos -= diff; } else { game->pipe_x_pos -= PIPE_SPEED; } } else { //前管道视野消失,位置切换至下一个管道 game->pipe_x_pos = x_pos; game->pipe_y_pos = CAL_PIPE_DOWM_Y_POS(pipe_cut); game->pipe_cut = pipe_cut; if (game->pipe_index) { game->pipe_index = 0; } else { game->pipe_index = 2; } id = COMPO_ID_GAME_PIPE_PIC_START + (game->pipe_index + 2) % 4; compo = compo_getobj_byid(id); if(compo) { compo_picturebox_cut((compo_picturebox_t *)compo, 0, 1 + (pipe_cut + 1) % 3); } } } } //游戏失败 static void func_game_fail(void) { compo_picturebox_t *compo; uint8_t i; compo_shape_t *compo_shape = compo_getobj_byid(COMPO_ID_GAME_FAIL_PIC); if(compo_shape) { compo_shape_set_visible(compo_shape, true); } compo_cardbox_t *compo_button = compo_getobj_byid(COMPO_ID_GAME_STOP_BTN); if(compo_button) { compo_cardbox_set_visible(compo_button, true); } compo_button = compo_getobj_byid(COMPO_ID_GAME_START_BTN); if(compo_button) { compo_cardbox_set_visible(compo_button, true); } compo_textbox_t *txt = compo_getobj_byid(COMPO_ID_GAME_NOTICE); if(txt) { compo_textbox_set(txt, i18n[STR_GAME_OVER]); compo_textbox_set_visible(txt, true); } compo = compo_getobj_byid(COMPO_ID_GAME_BIRD_PIC); if(compo) { compo_picturebox_set_pos((compo_picturebox_t *)compo, GUI_SCREEN_CENTER_X, GUI_SCREEN_CENTER_Y - 130); } for(i = 0; i < 4; i++) { compo = compo_getobj_byid(COMPO_ID_GAME_PIPE_PIC_START + i); if(compo) { compo_picturebox_set_visible(compo, false); } } } //游戏成功 static void func_game_finish(void) { compo_picturebox_t *compo; uint8_t i; compo_shape_t *compo_shape = compo_getobj_byid(COMPO_ID_GAME_FINISH_PIC); if(compo_shape) { compo_shape_set_visible(compo_shape, true); } compo_shape = compo_getobj_byid(COMPO_ID_GAME_FINISH_PIC); if(compo_shape) { compo_shape_set_visible(compo_shape, true); } compo_cardbox_t *compo_button = compo_getobj_byid(COMPO_ID_GAME_STOP_BTN); if(compo_button) { compo_cardbox_set_visible(compo_button, true); } compo_button = compo_getobj_byid(COMPO_ID_GAME_START_BTN); if(compo_button) { compo_cardbox_set_visible(compo_button, true); } compo_textbox_t *txt = compo_getobj_byid(COMPO_ID_GAME_NOTICE); if(txt) { compo_textbox_set(txt, i18n[STR_GAME_OVER]); //STR_GAME_PASS compo_textbox_set_visible(txt, true); } compo = compo_getobj_byid(COMPO_ID_GAME_BIRD_PIC); if(compo) { compo_picturebox_set_pos((compo_picturebox_t *)compo, GUI_SCREEN_CENTER_X, GUI_SCREEN_CENTER_Y - 100); } for(i = 0; i < 4; i++) { compo = compo_getobj_byid(COMPO_ID_GAME_PIPE_PIC_START + i); if(compo) { compo_picturebox_set_visible(compo, false); } } } //游戏过程状态机 static void func_game_process(void) { f_game_t *game = (f_game_t *)func_cb.f_cb; switch (game->status) { case GAME_STATUS_WAIT_RUN: case GAME_STATUS_RESULT_WAIT: break; case GAME_STATUS_STOP: func_game_init(); game->status = GAME_STATUS_WAIT_RUN; break; case GAME_STATUS_RUNING: func_game_runing(); break; case GAME_STATUS_GAMEOVER: func_game_fail(); game->status = GAME_STATUS_RESULT_WAIT; break; case GAME_STATUS_FINISH: func_game_finish(); game->status = GAME_STATUS_RESULT_WAIT; break; default: break; } } //单击处理 static void func_game_click(void) { int btn_id = compo_get_button_id(); f_game_t *game = (f_game_t *)func_cb.f_cb; compo_picturebox_t *compo; uint8_t i; compo_textbox_t *txt = compo_getobj_byid(COMPO_ID_GAME_NOTICE); point_t pt = ctp_get_sxy(); for(u8 i= COMPO_ID_GAME_STOP_BTN; i<= COMPO_ID_GAME_START_BTN; i++) { if (compo_cardbox_btn_is(compo_getobj_byid(i), pt)) { btn_id = i; } } printf("func_game_click = %d %d\n",game->status,btn_id); if (GAME_STATUS_WAIT_RUN == game->status) { compo = compo_getobj_byid(COMPO_ID_GAME_STOP_PIC); if(compo) { compo_picturebox_set_visible(compo, false); } if(txt) { compo_textbox_set_visible(txt, false); } compo = compo_getobj_byid(COMPO_ID_GAME_BIRD_PIC); if(compo) { compo_picturebox_set_visible(compo, true); } for(i = 0; i < 4; i++) { compo = compo_getobj_byid(i + COMPO_ID_GAME_PIPE_PIC_START); if(compo) { compo_picturebox_set_visible(compo, true); } } game->status = GAME_STATUS_RUNING; } else if (GAME_STATUS_RUNING == game->status) { if(txt) { compo_textbox_set_visible(txt, false); } if(game->bird_y_pos <= BIRD_HEIGHT/2) { game->speed = 0; } else { if(game->speed > 0) { game->speed = -GAME_UP_ACC_V; } else { game->speed -= GAME_UP_ACC_V; } } } else if (GAME_STATUS_RESULT_WAIT == game->status) { if (COMPO_ID_GAME_STOP_BTN == btn_id) { game->status = GAME_STATUS_STOP; if(txt) { compo_textbox_set_visible(txt, false); } } else if (COMPO_ID_GAME_START_BTN == btn_id) { func_game_init(); compo = compo_getobj_byid(COMPO_ID_GAME_STOP_PIC); if(compo) { compo_picturebox_set_visible(compo, false); } if(txt) { compo_textbox_set_visible(txt, false); } compo = compo_getobj_byid(COMPO_ID_GAME_BIRD_PIC); if(compo) { compo_picturebox_set_visible(compo, true); } for(i = 0; i < 4; i++) { compo = compo_getobj_byid(i + COMPO_ID_GAME_PIPE_PIC_START); if(compo) { compo_picturebox_set_visible(compo, true); } } delay_ms(40); game->status = GAME_STATUS_RUNING; } } } //消息处理 static void func_game_message(size_msg_t msg) { switch (msg) { case MSG_CTP_CLICK: func_game_click(); break; case MSG_CTP_SHORT_UP: case MSG_CTP_SHORT_DOWN: break; case MSG_CTP_SHORT_LEFT: if (func_cb.flag_sort) { func_message(msg); } break; case MSG_CTP_LONG: break; default: func_message(msg); break; } } //进入游戏功能 static void func_game_enter(void) { func_cb.f_cb = func_zalloc(sizeof(f_game_t)); func_cb.frm_main = func_game_form_create(); f_game_t *game = (f_game_t *)func_cb.f_cb; game->status = GAME_STATUS_STOP; } //退出游戏功能 static void func_game_exit(void) { func_cb.last = FUNC_GAME; } //游戏功能 void func_game(void) { printf("%s\n", __func__); func_game_enter(); while (func_cb.sta == FUNC_GAME) { func_game_process(); func_process(); func_game_message(msg_dequeue()); } func_game_exit(); } #else #define CENTER_X(w) ((GUI_SCREEN_WIDTH - w) >> 1) #define GAME_ABS(x) ((x) > 0 ? (x) : (-(x))) #define LEVEL_ICO_X 40 // 92 #define LEVEL_ICO_Y 4 // 18 #define LEVEL_X (LEVEL_ICO_X + 30) #define LEVEL_Y (LEVEL_ICO_Y + 6) #define SCORE_ICO_X (LEVEL_X + 40) #define SCORE_ICO_Y LEVEL_ICO_Y #define SCORE_X (SCORE_ICO_X + 30) #define SCORE_Y (LEVEL_Y) #define DLG_BG_CX 130 #define DLG_BG_X CENTER_X(DLG_BG_CX) #define DLG_BG_Y 120 #define PASS_LABLE_X CENTER_X(49) #define PASS_LABLE_Y (DLG_BG_Y + 15) #define PASS_DLG_BTN_CX 84 #define PASS_DLG_BTN_CY 28 #define PASS_DLG_BTN_START_X CENTER_X(PASS_DLG_BTN_CX) #define PASS_DLG_BTN_START_Y (PASS_LABLE_Y + 28) #define PASS_DLG_BTN_END_X (PASS_DLG_BTN_START_X + PASS_DLG_BTN_CX) #define PASS_DLG_BTN_END_Y (PASS_DLG_BTN_START_Y + PASS_DLG_BTN_CY) #define PASS_ALL_LABLE_X CENTER_X(115) #define PASS_ALL_LABLE_Y PASS_LABLE_Y #define GAME_OVER_LABLE_X CENTER_X(100) #define GAME_OVER_LABLE_Y PASS_LABLE_Y #define GAME_OVER_BTN_OK_CX 64 #define GAME_OVER_BTN_OK_CY 28 #define BTN_OK_START_X CENTER_X(64) #define BTN_OK_START_Y PASS_DLG_BTN_START_Y #define NORMAL_BARRIER 0x00 #define RLS_UP_BARRIER 0x10 /*释放上面的障碍物*/ #define RLS_DOWN_BARRIER 0x20 /*释放下面的障碍物*/ #define RLS_UPDOWN_BARRIER 0x30 /*释放上面和下面的障碍物*/ #define BARRIER_TYPE_NUM BARRIER_UP_DOWN #define RESOURCE_CX 32 #define RESOURCE_CY 32 #define BARRIER_1_CX 26 #define BARRIER_1_CY 26 #define BIRD_FLY_V 12 /*小鸟向上飞行初速度*/ #define BIRD_FALL_G 2 /*小鸟向下掉的重力加速度*/ #define BIRDFLY_ZOOM_X 0 #define BIRDFLY_ZOOM_Y 30 #define BIRDFLY_ZOOM_CX 240 #define BIRDFLY_ZOOM_CY 264 #define BIRDFLY_GROUND_HEIGHT 0 // 地面高度 #define BIRD_VALID_STARTX 2 #define BIRD_VALID_STARTY 16 #define BIRD_VALID_ENDX 62 #define BIRD_VALID_ENDY 46 #define BIRD_VALID_WIDTH (BIRD_VALID_ENDX - BIRD_VALID_STARTX) #define BIRD_VALID_HEIGHT (BIRD_VALID_ENDY - BIRD_VALID_STARTY) #define BIRD_WIDTH 54 #define BIRD_HEIGHT 54 #define HIT_WIDTH 59 #define HIT_HEIGHT 59 #define START_LBL_HEIGHT 15 #define MAX_RESOURCE_DATA_NUM 10 /* 资源数据个数*/ #define MAX_BARRIER_DATA_NUM 4 /* 障碍物数据个数*/ #define MAX_BARRIER_NUM 4 /* 最多障碍物块个数 */ #define SCORE_MAX_NUM 4 /* 得分最多位数 */ #define BIRDFLY_ANI_TIME_GAP 40 #define BIRDFLY_TIME_GAP 80 #define QUICKFLY_TIMEOUT_TIME 5000 // 快速飞5秒 #define RLS_BARRIER_TIMEOUT_TIME 5000 #define INIT_MAKE_BARRIER_TIME 60 #define INIT_MAKE_RESOURCE_RAND_MAX_NUM 360 #define DIGIT_CX 14 enum { LEVENT_NULL, LEVENT_READY, LEVENT_BIRD_FLYING_ON, // 向上飞 LEVENT_BIRD_GLIDING, // 滑翔模式 LEVENT_BIRD_QUICK_RIGHT_FLY, // 快速右飞 LEVENT_BIRD_DIE_FALLDOWN, // 小鸟被撞死 LEVENT_GAMEOVER_DLG, }; enum { RES_NULL, RES_GOLD, RES_UP, RES_DOWN, RES_UP_DOWN, RES_RIGHT, RES_LIFE, RES_DEATH }; enum { BARRIER_NULL, BARRIER_UP, BARRIER_DOWN, BARRIER_UP_DOWN }; typedef struct Bird_st { short x; // 该小鸟x坐标 short y; // 该小鸟y坐标 short cx; // 该飞机图标的宽度 short cy; // 该飞机图标的高度 u8 idx; u8 flag; // 为0表示不显示任何图标, 即无数据 u8 reserved[2]; } Bird_t; typedef struct Resource_st { short x; // 该资源x坐标 short y; // 该资源y坐标 short cx; // 该资源图标的宽度 short cy; // 该资源图标的高度 u8 idx; u8 attrib; // 资源属性: 0: 无资源; 1:金币; 2: UP; 3:DOWN; 4: UP_DOWN; 5: RIGHT; 6: LIFE; 7: DEATH; u8 reserved[2]; } Resource_t; typedef struct Barrier_st { short x; // 该障碍物x坐标 short cx; // 该障碍物宽度 short cy; // 该障碍物高度 u8 attrib; // 障碍物属性, 0:表示无障碍物 u8 num; // u8 reserved[3]; // } Barrier_t; typedef struct f_game_t_ { /* 游戏运行参数 */ Bird_t *pBird; Bird_t *pBirdHit; Barrier_t *pBarrier; Resource_t *pResource; u8 bird_num; // 剩余小鸟个数 u8 gold_spin_idx; u8 BirdFly_status; u8 Barrier_status; bool has_to_redraw; short bird_y_speed; // 小鸟速度, >0: 向上飞; <0: 向下掉 u16 make_barrier_time; u16 make_resource_max_rand; u32 x_offset; u32 game_score; /* 游戏运行任务*/ bool bird_fly_task_flag; bool animation_task_flag; bool quick_fly_task_flag; bool rls_barrier_task_flag; u32 bird_fly_task_tick; u32 animation_task_tick; u32 quick_fly_task_tick; u32 rls_barrier_task_tick; } f_game_t; enum { COMPO_ID_GAME_PIC_BG = 0x01, COMPO_ID_GAME_PIC_BIRD, COMPO_ID_GAME_PIC_START, COMPO_ID_GAME_PIC_START_TIP, /* 障碍物 */ COMPO_ID_GAME_PIC_BARRIER, COMPO_ID_GAME_PIC_BARRIER_MAX = COMPO_ID_GAME_PIC_BARRIER + (MAX_BARRIER_NUM * MAX_BARRIER_DATA_NUM * 2), /* 资源 */ COMPO_ID_GAME_RESOURCE_PIC, COMPO_ID_GAME_RESOURCE_PIC_MAX = COMPO_ID_GAME_RESOURCE_PIC + MAX_RESOURCE_DATA_NUM, /* 小鸟生命 */ COMPO_ID_GAME_PIC_BIRD_LIFE, COMPO_ID_GAME_PIC_BIRD_LIFE_MAX = COMPO_ID_GAME_PIC_BIRD_LIFE + SCORE_MAX_NUM, /* 得分 */ COMPO_ID_GAME_PIC_SCORE, COMPO_ID_GAME_PIC_SCORE_MAX = COMPO_ID_GAME_PIC_SCORE + SCORE_MAX_NUM, /* 击中 */ COMPO_ID_GAME_PIC_BOOM, /* 游戏结束 */ COMPO_ID_GAME_PIC_DLG_BG, COMPO_ID_GAME_PIC_GAME_OVER, COMPO_ID_GAME_PIC_GAME_OK, }; static const u32 Flying_Bird_Pic_arr[] = { UI_BUF_GAME_BIRD_FLY0_BIN, UI_BUF_GAME_BIRD_FLY1_BIN, UI_BUF_GAME_BIRD_FLY2_BIN, UI_BUF_GAME_BIRD_FLY3_BIN, UI_BUF_GAME_BIRD_FLY4_BIN}; static const u32 Hit_Bird_Boom_pic_arr[] = { UI_BUF_GAME_HIT_0_BIN, UI_BUF_GAME_HIT_1_BIN, UI_BUF_GAME_HIT_2_BIN, UI_BUF_GAME_HIT_3_BIN, UI_BUF_GAME_HIT_4_BIN, UI_BUF_GAME_HIT_5_BIN}; static const u32 Death_Bird_Fall_pic_arr[] = { UI_BUF_GAME_BIRD_FALL0_BIN, UI_BUF_GAME_BIRD_FALL1_BIN, UI_BUF_GAME_BIRD_FALL2_BIN, UI_BUF_GAME_BIRD_FALL3_BIN, UI_BUF_GAME_BIRD_FALL4_BIN, UI_BUF_GAME_BIRD_FALL5_BIN, UI_BUF_GAME_BIRD_FALL6_BIN, UI_BUF_GAME_BIRD_FALL7_BIN, UI_BUF_GAME_BIRD_FALL8_BIN, UI_BUF_GAME_BIRD_FALL9_BIN, }; static const u32 gold_pic_arr[] = { UI_BUF_GAME_GOLD_0_BIN, UI_BUF_GAME_GOLD_1_BIN, UI_BUF_GAME_GOLD_2_BIN, UI_BUF_GAME_GOLD_3_BIN, UI_BUF_GAME_GOLD_4_BIN, UI_BUF_GAME_GOLD_5_BIN, UI_BUF_GAME_GOLD_6_BIN, UI_BUF_GAME_GOLD_7_BIN, }; static const u32 digit_id_arr[] = { UI_BUF_GAME_GAME_DIGIT_0_BIN, UI_BUF_GAME_GAME_DIGIT_1_BIN, UI_BUF_GAME_GAME_DIGIT_2_BIN, UI_BUF_GAME_GAME_DIGIT_3_BIN, UI_BUF_GAME_GAME_DIGIT_4_BIN, UI_BUF_GAME_GAME_DIGIT_5_BIN, UI_BUF_GAME_GAME_DIGIT_6_BIN, UI_BUF_GAME_GAME_DIGIT_7_BIN, UI_BUF_GAME_GAME_DIGIT_8_BIN, UI_BUF_GAME_GAME_DIGIT_9_BIN, }; void tjd_show_game_over_dlg(void) { compo_button_t *dlg_bg_pic = compo_getobj_byid(COMPO_ID_GAME_PIC_DLG_BG); compo_picturebox_t *game_over_pic = compo_getobj_byid(COMPO_ID_GAME_PIC_GAME_OVER); compo_picturebox_t *game_ok_pic = compo_getobj_byid(COMPO_ID_GAME_PIC_GAME_OK); compo_button_set_visible(dlg_bg_pic, true); compo_picturebox_set_visible(game_over_pic, true); compo_picturebox_set_visible(game_ok_pic, true); } static void tjd_malloc_bird_fly_buffer(void) { f_game_t *game = (f_game_t *)func_cb.f_cb; if (game == NULL) { return; } if (!game->pBird) { game->pBird = func_zalloc(sizeof(Bird_t)); } if (!game->pBirdHit) { game->pBirdHit = func_zalloc(sizeof(Bird_t)); } if (!game->pResource) { game->pResource = func_zalloc(sizeof(Resource_t) * MAX_RESOURCE_DATA_NUM); } if (!game->pBarrier) { game->pBarrier = func_zalloc(sizeof(Barrier_t) * MAX_BARRIER_DATA_NUM); } } static void tjd_free_bird_fly_buffer(void) { f_game_t *game = (f_game_t *)func_cb.f_cb; if (game == NULL) { return; } if (game->pBird) { func_free(game->pBird); game->pBird = NULL; } if (game->pBirdHit) { func_free(game->pBirdHit); game->pBirdHit = NULL; } if (game->pResource) { func_free(game->pResource); game->pResource = NULL; } if (game->pBarrier) { func_free(game->pBarrier); game->pBarrier = NULL; } } static void tjd_init_birdfly_data(void) { f_game_t *game = (f_game_t *)func_cb.f_cb; if (game == NULL) { return; } game->x_offset = 0; game->bird_y_speed = 0; // 小鸟速度, >0: 向上飞; <0: 向下掉 game->pBird->x = BIRDFLY_ZOOM_X + CENTER_X(BIRD_WIDTH); game->pBird->y = BIRDFLY_ZOOM_Y + ((BIRDFLY_ZOOM_CY - BIRDFLY_GROUND_HEIGHT - BIRD_HEIGHT) >> 1); game->pBird->cx = BIRD_VALID_WIDTH; game->pBird->cy = BIRD_VALID_HEIGHT; game->pBird->idx = 4; game->pBird->flag = 1; } void tjd_ready_birdfly(void) { f_game_t *game = (f_game_t *)func_cb.f_cb; if (game == NULL) { return; } game->has_to_redraw = TRUE; tjd_init_birdfly_data(); memset(game->pBirdHit, 0, sizeof(Bird_t)); memset(game->pResource, 0, sizeof(Resource_t) * MAX_RESOURCE_DATA_NUM); memset(game->pBarrier, 0, sizeof(Barrier_t) * MAX_BARRIER_DATA_NUM); game->BirdFly_status = LEVENT_READY; } void tjd_reset_birdfly(void) { f_game_t *game = (f_game_t *)func_cb.f_cb; if (game == NULL) { return; } game->has_to_redraw = TRUE; game->game_score = 0; game->bird_num = 1; // 剩余小鸟个数 game->make_barrier_time = INIT_MAKE_BARRIER_TIME; game->make_resource_max_rand = INIT_MAKE_RESOURCE_RAND_MAX_NUM; tjd_init_birdfly_data(); memset(game->pBirdHit, 0, sizeof(Bird_t)); memset(game->pResource, 0, sizeof(Resource_t) * MAX_RESOURCE_DATA_NUM); memset(game->pBarrier, 0, sizeof(Barrier_t) * MAX_BARRIER_DATA_NUM); game->BirdFly_status = LEVENT_READY; } static void tjd_birdfly_start_play(void) { f_game_t *game = (f_game_t *)func_cb.f_cb; if (game == NULL) { return; } game->bird_fly_task_flag = true; game->animation_task_flag = true; } void tjd_birdfly_stop(void) { f_game_t *game = (f_game_t *)func_cb.f_cb; if (game == NULL) { return; } game->bird_fly_task_flag = false; game->animation_task_flag = false; game->quick_fly_task_flag = false; game->rls_barrier_task_flag = false; } static void tjd_change_all_resource_to_gold(void) { f_game_t *game = (f_game_t *)func_cb.f_cb; if (game == NULL) { return; } u16 i; Resource_t *pRes; for (i = 0; i < MAX_RESOURCE_DATA_NUM; i++) { pRes = game->pResource + i; if (pRes->attrib) { pRes->attrib = RES_GOLD; } } } static void tjd_end_rls_barrier_mode(void) { f_game_t *game = (f_game_t *)func_cb.f_cb; if (game == NULL) { return; } printf("<<<<<<< NORMAL_BARRIER >>>>>>>>>>"); game->rls_barrier_task_flag = false; game->Barrier_status = NORMAL_BARRIER; } static void set_rls_barrier_mode(void) { f_game_t *game = (f_game_t *)func_cb.f_cb; if (game == NULL) { return; } game->rls_barrier_task_flag = true; game->rls_barrier_task_tick = tick_get(); } static void tjd_end_quick_fly_mode(void) { f_game_t *game = (f_game_t *)func_cb.f_cb; if (game == NULL) { return; } game->quick_fly_task_flag = false; game->Barrier_status = NORMAL_BARRIER; game->BirdFly_status = LEVENT_BIRD_GLIDING; } static void set_quick_fly_mode(void) { f_game_t *game = (f_game_t *)func_cb.f_cb; if (game == NULL) { return; } game->quick_fly_task_tick = tick_get(); game->quick_fly_task_flag = true; } static void tjd_bird_die(Bird_t *pBird) { f_game_t *game = (f_game_t *)func_cb.f_cb; if (game == NULL) { return; } if (game->bird_num > 0) { game->bird_num--; } game->pBirdHit->x = pBird->x + (BIRD_WIDTH >> 1) - (HIT_WIDTH >> 1); game->pBirdHit->y = pBird->y + (BIRD_HEIGHT >> 1) - (HIT_HEIGHT >> 1); game->pBirdHit->cx = HIT_WIDTH; game->pBirdHit->cy = HIT_HEIGHT; game->pBirdHit->idx = 0; game->pBirdHit->flag = 1; } // 检查小鸟是否得到资源 static bool tjd_check_bird_get_resource(void) { f_game_t *game = (f_game_t *)func_cb.f_cb; if (game == NULL) { return; } u16 i; long x1, x2, y1, y2, xd, yd; short delta_x, delta_y; Resource_t *pRes; x1 = game->pBird->x + (BIRD_WIDTH >> 1); y1 = game->pBird->y + (BIRD_HEIGHT >> 1); for (i = 0; i < MAX_RESOURCE_DATA_NUM; i++) { pRes = game->pResource + i; if (pRes->attrib) { x2 = pRes->x + (pRes->cx >> 1); y2 = pRes->y + (pRes->cy >> 1); xd = ((BIRD_VALID_WIDTH + RESOURCE_CX) >> 1) - 4; yd = ((BIRD_VALID_HEIGHT + RESOURCE_CY) >> 1) - 2; delta_x = GAME_ABS(x1 - x2); delta_y = GAME_ABS(y1 - y2); if (delta_x < xd && delta_y < yd) { // Get到资源 if (pRes->attrib == RES_GOLD) { game->game_score += 1; } else if (pRes->attrib == RES_UP) { if (game->Barrier_status == NORMAL_BARRIER) { set_rls_barrier_mode(); game->Barrier_status = RLS_UP_BARRIER; } } else if (pRes->attrib == RES_DOWN) { if (game->Barrier_status == NORMAL_BARRIER) { set_rls_barrier_mode(); game->Barrier_status = RLS_DOWN_BARRIER; } } else if (pRes->attrib == RES_UP_DOWN) { if (game->Barrier_status == NORMAL_BARRIER) { set_rls_barrier_mode(); game->Barrier_status = RLS_UPDOWN_BARRIER; } } else if (pRes->attrib == RES_RIGHT) { game->BirdFly_status = LEVENT_BIRD_QUICK_RIGHT_FLY; game->Barrier_status = RLS_UPDOWN_BARRIER; tjd_change_all_resource_to_gold(); game->pBird->y = BIRDFLY_ZOOM_Y + (BIRDFLY_ZOOM_CY >> 1) - (BIRD_HEIGHT >> 1); game->pBird->idx = 4; // 展翅的图片 set_quick_fly_mode(); } else if (pRes->attrib == RES_LIFE) { game->bird_num += 1; } else if (pRes->attrib == RES_DEATH) { game->BirdFly_status = LEVENT_BIRD_DIE_FALLDOWN; game->pBird->idx = 0; game->bird_y_speed = 0; tjd_bird_die(game->pBird); } pRes->attrib = 0; } } } return TRUE; } #define X_DEVIATION 2 #define Y_DEVIATION 2 // 检查小鸟是否撞到障碍物 static bool tjd_check_bird_ram_barrier(void) { f_game_t *game = (f_game_t *)func_cb.f_cb; if (game == NULL) { return; } u16 i; long x1, x2, xd, yd, y1, y2; Barrier_t *pBarrier; if (LEVENT_BIRD_FLYING_ON != game->BirdFly_status // 正常飞翔模式 && LEVENT_BIRD_GLIDING != game->BirdFly_status // 滑翔模式 && LEVENT_BIRD_QUICK_RIGHT_FLY != game->BirdFly_status) // 快速右飞 { return FALSE; } x1 = game->pBird->x + (BIRD_WIDTH >> 1); y1 = game->pBird->y + (BIRD_HEIGHT >> 1); for (i = 0; i < MAX_BARRIER_DATA_NUM; i++) { pBarrier = game->pBarrier + i; if (pBarrier->attrib == BARRIER_UP) { if ((game->Barrier_status != RLS_UP_BARRIER && game->Barrier_status != RLS_UPDOWN_BARRIER)) { x2 = pBarrier->x + (pBarrier->cx >> 1); xd = ((BIRD_VALID_WIDTH + pBarrier->cx) >> 1) - X_DEVIATION; if (GAME_ABS(x1 - x2) < xd) { y2 = BIRDFLY_ZOOM_Y + pBarrier->cy * pBarrier->num; yd = GAME_ABS(y1 - y2) - Y_DEVIATION; // if (yd <= (BIRD_VALID_HEIGHT>>1)) if (game->pBird->y <= y2) { // 撞击到上边沿 game->BirdFly_status = LEVENT_BIRD_DIE_FALLDOWN; game->pBird->idx = 0; game->bird_y_speed = 0; tjd_bird_die(game->pBird); printf("BIRD RAM A \n x1:%d, y1:%d, x2:%d, y2:%d, xd:%d, yd:%d\n", x1, y1, x2, y2, xd, yd); if (game->pBird->x + (BIRD_WIDTH >> 1) < pBarrier->x) { game->pBird->x -= 6; } return FALSE; } } } } else if (pBarrier->attrib == BARRIER_DOWN) { if ((game->Barrier_status != RLS_DOWN_BARRIER && game->Barrier_status != RLS_UPDOWN_BARRIER)) { x2 = pBarrier->x + (pBarrier->cx >> 1); xd = ((BIRD_VALID_WIDTH + pBarrier->cx) >> 1) - X_DEVIATION; if (GAME_ABS(x1 - x2) < xd) { y2 = BIRDFLY_ZOOM_Y + BIRDFLY_ZOOM_CY - pBarrier->cy * pBarrier->num; yd = GAME_ABS(y1 - y2) - Y_DEVIATION; if ((y1 + (BIRD_VALID_HEIGHT >> 1)) >= y2) //(yd <= (BIRD_VALID_HEIGHT>>1)) { // 撞击到下边沿 game->BirdFly_status = LEVENT_BIRD_DIE_FALLDOWN; game->pBird->idx = 0; game->bird_y_speed = 0; tjd_bird_die(game->pBird); printf("BIRD RAM B x1:%d, y1:%d, x2:%d, y2:%d, xd:%d, yd:%d, num:%d\n", x1, y1, x2, y2, xd, yd, pBarrier->num); if (game->pBird->x + (BIRD_VALID_WIDTH >> 1) > pBarrier->x) { game->pBird->x = pBarrier->x + pBarrier->cx; } else { game->pBird->x -= 6; } return FALSE; } } } } else if (pBarrier->attrib == BARRIER_UP_DOWN) { x2 = pBarrier->x + (pBarrier->cx >> 1); xd = ((BIRD_VALID_WIDTH + pBarrier->cx) >> 1) - X_DEVIATION; if (GAME_ABS(x1 - x2) < xd) { if ((game->Barrier_status != RLS_UP_BARRIER && game->Barrier_status != RLS_UPDOWN_BARRIER)) { y2 = BIRDFLY_ZOOM_Y + pBarrier->cy * pBarrier->num - Y_DEVIATION; yd = GAME_ABS(y1 - y2) - Y_DEVIATION; if ((y1 - (BIRD_VALID_HEIGHT >> 1)) <= y2) //(yd <= (BIRD_VALID_HEIGHT>>1)) { // 撞击到上边沿 game->BirdFly_status = LEVENT_BIRD_DIE_FALLDOWN; game->bird_y_speed = 0; game->pBird->idx = 0; tjd_bird_die(game->pBird); printf("BIRD RAM C x1:%d, y1:%d, x2:%d, y2:%d, xd:%d, yd:%d\n", x1, y1, x2, y2, xd, yd); if (game->pBird->x + (BIRD_WIDTH >> 1) < pBarrier->x) { game->pBird->x -= 6; } return FALSE; } } if ((game->Barrier_status != RLS_DOWN_BARRIER && game->Barrier_status != RLS_UPDOWN_BARRIER)) { y2 = BIRDFLY_ZOOM_Y + BIRDFLY_ZOOM_CY - pBarrier->cy * (MAX_BARRIER_NUM - pBarrier->num); yd = GAME_ABS(y1 - y2) - Y_DEVIATION; if ((y1 + (BIRD_VALID_HEIGHT >> 1)) >= y2) //(yd <= (BIRD_VALID_HEIGHT>>1)) { // 撞击到下边沿 game->BirdFly_status = LEVENT_BIRD_DIE_FALLDOWN; game->bird_y_speed = 0; // 小鸟被撞击到地面 game->pBird->idx = 0; tjd_bird_die(game->pBird); printf("BIRD RAM D x1:%d, y1:%d, x2:%d, y2:%d, xd:%d, yd:%d, num:%d\n", x1, y1, x2, y2, xd, yd, pBarrier->num); if (game->pBird->x + (BIRD_WIDTH >> 1) > pBarrier->x) { game->pBird->x = pBarrier->x + pBarrier->cx; } else { game->pBird->x -= 6; } return FALSE; } } } } } return TRUE; } static void tjd_birdfly_send_draw_evt(void) { f_game_t *game = (f_game_t *)func_cb.f_cb; if (game == NULL) { return; } game->has_to_redraw = TRUE; } void tjd_show_digit(u16 x, u16 y, char *pDigitStr, u32 id) { u16 i; char *pStr; u32 temp; pStr = pDigitStr; /* 显示得分 */ for (i = 0; i < SCORE_MAX_NUM && *pStr; i++) { compo_picturebox_t *digit_pic = compo_getobj_byid(id + i); if (*pStr >= '0' && *pStr <= '9') { temp = *pStr - '0'; compo_picturebox_set(digit_pic, digit_id_arr[temp]); compo_picturebox_set_pos(digit_pic, x, y); compo_picturebox_set_visible(digit_pic, true); x += DIGIT_CX; } pStr++; } /* 隐藏掉不需要显示部分 */ for (; i < SCORE_MAX_NUM; i++) { compo_picturebox_t *digit_pic = compo_getobj_byid(id + i); compo_picturebox_set_visible(digit_pic, false); } } void tjd_show_score(u16 x, u16 y, u32 score) { char str[6] = {0}; sprintf(str, "%d", score); tjd_show_digit(x + 32, y + 3, str, COMPO_ID_GAME_PIC_SCORE); } static void tjd_make_resource(void) { f_game_t *game = (f_game_t *)func_cb.f_cb; if (game == NULL) { return; } static u8 re_idx = 0; Resource_t *pRes; if (LEVENT_BIRD_QUICK_RIGHT_FLY == game->BirdFly_status) { pRes = game->pResource + re_idx; pRes->idx = 0; pRes->attrib = RES_GOLD; pRes->cx = RESOURCE_CX; pRes->cy = RESOURCE_CY; pRes->x = BIRDFLY_ZOOM_X + BIRDFLY_ZOOM_CX; pRes->y = BIRDFLY_ZOOM_Y + (BIRDFLY_ZOOM_CY >> 1) - (RESOURCE_CY >> 1); re_idx++; if (re_idx >= MAX_RESOURCE_DATA_NUM) { re_idx = 0; } } else if (LEVENT_BIRD_FLYING_ON == game->BirdFly_status || LEVENT_BIRD_GLIDING == game->BirdFly_status) { u8 rand; rand = get_random(game->make_resource_max_rand); pRes = game->pResource + re_idx; pRes->idx = 0; pRes->cx = RESOURCE_CX; pRes->cy = RESOURCE_CY; pRes->x = BIRDFLY_ZOOM_X + BIRDFLY_ZOOM_CX; pRes->y = BIRDFLY_ZOOM_Y + (BIRDFLY_ZOOM_CY >> 1) - (RESOURCE_CY >> 1); if (rand == 0 || rand == 1 || rand == 2) { pRes->attrib = RES_DEATH; if (game->make_resource_max_rand >= 10) { game->make_resource_max_rand--; } } else if (rand == 10) { pRes->attrib = RES_UP; if (game->make_resource_max_rand >= 10) { game->make_resource_max_rand--; } } else if (rand == 15) { pRes->attrib = RES_DOWN; if (game->make_resource_max_rand >= 10) { game->make_resource_max_rand--; } } else if (rand == 20) { pRes->attrib = RES_UP_DOWN; if (game->make_resource_max_rand >= 10) { game->make_resource_max_rand--; } } else if (rand == 30 || rand == 31 || rand == 32 || rand == 32) { pRes->attrib = RES_RIGHT; if (game->make_resource_max_rand >= 10) { game->make_resource_max_rand--; } } else if (rand == 50) { pRes->attrib = RES_LIFE; if (game->make_resource_max_rand >= 10) { game->make_resource_max_rand--; } } else { pRes->attrib = RES_GOLD; if (game->make_resource_max_rand >= 10) { game->make_resource_max_rand--; } } re_idx++; if (re_idx >= MAX_RESOURCE_DATA_NUM) { re_idx = 0; } } } static void tjd_make_barrier(void) { f_game_t *game = (f_game_t *)func_cb.f_cb; if (game == NULL) { return; } static u8 Barrier_idx = 0; Barrier_t *pBarrier; // printf("Barrier_idx:%d\n", Barrier_idx); pBarrier = game->pBarrier + Barrier_idx; pBarrier->x = BIRDFLY_ZOOM_X + BIRDFLY_ZOOM_CX + BARRIER_1_CX; pBarrier->cx = BARRIER_1_CX; pBarrier->cy = BARRIER_1_CY; pBarrier->attrib = get_random(BARRIER_TYPE_NUM) + 1; if (pBarrier->attrib == BARRIER_UP_DOWN) { pBarrier->num = get_random(MAX_BARRIER_NUM - 1) + 1; } else { pBarrier->num = get_random(MAX_BARRIER_NUM) + 1; } Barrier_idx++; if (Barrier_idx >= MAX_BARRIER_DATA_NUM) { Barrier_idx = 0; } } static void tjd_bird_fly_proc(void) { f_game_t *game = (f_game_t *)func_cb.f_cb; if (game == NULL) { return; } static u8 ani_cnt; u16 idx; u16 speed; u16 flying_bird_pic_num; flying_bird_pic_num = sizeof(Flying_Bird_Pic_arr) / sizeof(Flying_Bird_Pic_arr[0]); /* 金币旋转 */ game->gold_spin_idx = (game->gold_spin_idx + 1) % (sizeof(gold_pic_arr) / sizeof(gold_pic_arr[0])); if (LEVENT_BIRD_FLYING_ON == game->BirdFly_status) { game->bird_y_speed = game->bird_y_speed - BIRD_FALL_G; speed = game->bird_y_speed; if (game->bird_y_speed > -2) { speed = game->bird_y_speed; idx = flying_bird_pic_num - 1 - speed * flying_bird_pic_num / BIRD_FLY_V; if (idx < 0) { idx = 0; } else if (idx >= flying_bird_pic_num) { idx = flying_bird_pic_num - 1; } game->pBird->idx = idx; } else { game->pBird->idx = 3; } game->pBird->y -= game->bird_y_speed; if (game->pBird->y <= (BIRDFLY_ZOOM_Y)) { game->pBird->y = BIRDFLY_ZOOM_Y; game->bird_y_speed = 0; } if (game->bird_y_speed <= 0) { game->BirdFly_status = LEVENT_BIRD_GLIDING; } } else if (LEVENT_BIRD_GLIDING == game->BirdFly_status) { game->bird_y_speed = game->bird_y_speed - BIRD_FALL_G; game->pBird->idx = 3; game->pBird->y -= game->bird_y_speed; if ((game->pBird->y + (BIRD_HEIGHT >> 1) - (BIRD_VALID_HEIGHT >> 1)) > (BIRDFLY_ZOOM_Y + BIRDFLY_ZOOM_CY - BIRDFLY_GROUND_HEIGHT)) { game->BirdFly_status = LEVENT_BIRD_DIE_FALLDOWN; game->pBird->idx = 0; game->pBird->flag = 0; // 小鸟被撞击到地面 game->pBird->y = (BIRDFLY_ZOOM_Y + BIRDFLY_ZOOM_CY - BIRDFLY_GROUND_HEIGHT + 3); tjd_bird_die(game->pBird); } } else if (LEVENT_BIRD_DIE_FALLDOWN == game->BirdFly_status) { game->pBird->y -= game->bird_y_speed; if (game->pBirdHit->flag) { game->pBirdHit->idx++; if (game->pBirdHit->idx >= sizeof(Hit_Bird_Boom_pic_arr) / sizeof(Hit_Bird_Boom_pic_arr[0])) { printf("end bird boom\n"); game->pBirdHit->idx = 0; game->pBirdHit->flag = 0; } } if (game->pBird->flag) { game->pBird->idx++; if (game->pBird->idx >= sizeof(Death_Bird_Fall_pic_arr) / sizeof(Death_Bird_Fall_pic_arr[0]) || (game->pBird->y + (BIRD_HEIGHT >> 1) - BIRD_VALID_HEIGHT >> 1) >= (BIRDFLY_ZOOM_Y + BIRDFLY_ZOOM_CY - BIRDFLY_GROUND_HEIGHT)) { printf("end bird fall\n"); game->pBird->idx = 0; game->pBird->flag = 0; } game->bird_y_speed = game->bird_y_speed - BIRD_FALL_G; } if (game->pBirdHit->flag == 0 && game->pBird->flag == 0) { if (game->bird_num > 0) { tjd_ready_birdfly(); tjd_birdfly_send_draw_evt(); } else { printf("GAMEOVER\n"); game->BirdFly_status = LEVENT_GAMEOVER_DLG; tjd_birdfly_stop(); tjd_birdfly_send_draw_evt(); } } } } static void tjd_bird_fly_task(void) { f_game_t *game = (f_game_t *)func_cb.f_cb; if (game == NULL) { return; } static u16 cnt = 0; cnt++; if (cnt >= 200) { cnt = 0; if (game->make_barrier_time > 10) { game->make_barrier_time--; } } tjd_bird_fly_proc(); if (game->BirdFly_status == LEVENT_BIRD_QUICK_RIGHT_FLY) { if (cnt % 2 == 0) { // 生成资源 tjd_make_resource(); } } else { if (cnt % 10 == 0) { // 生成资源 tjd_make_resource(); } } if (cnt % game->make_barrier_time == 3) { // 生成障碍物 if (game->Barrier_status == NORMAL_BARRIER) { tjd_make_barrier(); } } } static void TJD_Bird_FlyOn(void) { f_game_t *game = (f_game_t *)func_cb.f_cb; if (game == NULL) { return; } printf("TJD_Bird_FlyOn"); game->bird_y_speed = BIRD_FLY_V; game->BirdFly_status = LEVENT_BIRD_FLYING_ON; game->pBird->idx = 0; } static void tjd_resource_move(u16 x_offset) { f_game_t *game = (f_game_t *)func_cb.f_cb; if (game == NULL) { return; } u16 i; Resource_t *pRes; /* 资源位置移动 */ for (i = 0; i < MAX_RESOURCE_DATA_NUM; i++) { pRes = game->pResource + i; if (pRes->attrib) { pRes->x -= x_offset; if (pRes->x + pRes->cx <= BIRDFLY_ZOOM_X) { pRes->attrib = 0; } } } } static void TJD_barrier_move(u16 x_offset) { f_game_t *game = (f_game_t *)func_cb.f_cb; if (game == NULL) { return; } u16 i; Barrier_t *pBarrier; for (i = 0; i < MAX_BARRIER_DATA_NUM; i++) { pBarrier = game->pBarrier + i; if (pBarrier->attrib) { if (pBarrier->x <= BIRDFLY_ZOOM_X - pBarrier->cx) { pBarrier->attrib = 0; } else { pBarrier->x -= x_offset; } } } } static void tjd_bird_fly_animation_task(void) { f_game_t *game = (f_game_t *)func_cb.f_cb; if (game == NULL) { return; } u16 x_offset; if (LEVENT_BIRD_QUICK_RIGHT_FLY == game->BirdFly_status) { x_offset = 10; } else if (LEVENT_BIRD_FLYING_ON == game->BirdFly_status || LEVENT_BIRD_GLIDING == game->BirdFly_status) { x_offset = 2; } else { x_offset = 0; } game->x_offset += x_offset; if (game->x_offset > 10000) { game->x_offset = 0; } tjd_resource_move(x_offset); TJD_barrier_move(x_offset); tjd_check_bird_ram_barrier(); tjd_check_bird_get_resource(); tjd_birdfly_send_draw_evt(); } static void tjd_draw_bird(void) { f_game_t *game = (f_game_t *)func_cb.f_cb; if (game == NULL) { return; } compo_picturebox_t *bird_pic = compo_getobj_byid(COMPO_ID_GAME_PIC_BIRD); if ((game->pBird->y + (BIRD_HEIGHT >> 1) - (BIRD_VALID_HEIGHT >> 1)) >= BIRDFLY_ZOOM_Y && (game->pBird->y + (BIRD_HEIGHT >> 1) - (BIRD_VALID_HEIGHT >> 1)) <= (BIRDFLY_ZOOM_Y + BIRDFLY_ZOOM_CY - BIRDFLY_GROUND_HEIGHT)) { if (game->pBird->flag) { compo_picturebox_set(bird_pic, Flying_Bird_Pic_arr[game->pBird->idx]); compo_picturebox_set_pos(bird_pic, game->pBird->x, game->pBird->y); compo_picturebox_set_visible(bird_pic, true); } } compo_picturebox_t *start_pic = compo_getobj_byid(COMPO_ID_GAME_PIC_START); compo_picturebox_t *figure_pic = compo_getobj_byid(COMPO_ID_GAME_PIC_START_TIP); if (LEVENT_READY == game->BirdFly_status) { compo_picturebox_set_visible(start_pic, true); compo_picturebox_set_visible(figure_pic, true); } else { compo_picturebox_set_visible(start_pic, false); compo_picturebox_set_visible(figure_pic, false); } } static void tjd_draw_bird_hit(void) { f_game_t *game = (f_game_t *)func_cb.f_cb; if (game == NULL) { return; } compo_picturebox_t *hit_pic = compo_getobj_byid(COMPO_ID_GAME_PIC_BOOM); if (game->pBirdHit->flag) { compo_picturebox_set(hit_pic, Hit_Bird_Boom_pic_arr[game->pBirdHit->idx]); compo_picturebox_set_pos(hit_pic, game->pBirdHit->x, game->pBirdHit->y); compo_picturebox_set_visible(hit_pic, true); } } static void tjd_draw_falling_death_bird(void) { f_game_t *game = (f_game_t *)func_cb.f_cb; if (game == NULL) { return; } compo_picturebox_t *bird_pic = compo_getobj_byid(COMPO_ID_GAME_PIC_BIRD); if ((game->pBird->y + (BIRD_HEIGHT >> 1) - (BIRD_VALID_HEIGHT >> 1)) >= BIRDFLY_ZOOM_Y && (game->pBird->y + (BIRD_HEIGHT >> 1) - (BIRD_VALID_HEIGHT >> 1)) <= (BIRDFLY_ZOOM_Y + BIRDFLY_ZOOM_CY - BIRDFLY_GROUND_HEIGHT)) { if (game->pBird->flag) { compo_picturebox_set(bird_pic, Death_Bird_Fall_pic_arr[game->pBird->idx]); compo_picturebox_set_pos(bird_pic, game->pBird->x, game->pBird->y); compo_picturebox_set_visible(bird_pic, true); } } } static void tjd_draw_resource(void) { f_game_t *game = (f_game_t *)func_cb.f_cb; if (game == NULL) { return; } Resource_t *pRes; for (u16 i = 0; i < MAX_RESOURCE_DATA_NUM; i++) { compo_picturebox_t *resource_pic = compo_getobj_byid(COMPO_ID_GAME_RESOURCE_PIC + i); compo_picturebox_set_visible(resource_pic, false); pRes = game->pResource + i; if (pRes->attrib) { if (pRes->x >= BIRDFLY_ZOOM_X && (pRes->x <= (BIRDFLY_ZOOM_X + BIRDFLY_ZOOM_CX - pRes->cx))) { compo_picturebox_set_visible(resource_pic, true); if (pRes->attrib == RES_GOLD) { compo_picturebox_set(resource_pic, gold_pic_arr[game->gold_spin_idx]); compo_picturebox_set_pos(resource_pic, pRes->x, pRes->y); } else if (pRes->attrib == RES_UP) { compo_picturebox_set(resource_pic, UI_BUF_GAME_BIRD_UP_BIN); compo_picturebox_set_pos(resource_pic, pRes->x, pRes->y); } else if (pRes->attrib == RES_DOWN) { compo_picturebox_set(resource_pic, UI_BUF_GAME_BIRD_DOWN_BIN); compo_picturebox_set_pos(resource_pic, pRes->x, pRes->y); } else if (pRes->attrib == RES_UP_DOWN) { compo_picturebox_set(resource_pic, UI_BUF_GAME_BIRD_UP_DOWN_BIN); compo_picturebox_set_pos(resource_pic, pRes->x, pRes->y); } else if (pRes->attrib == RES_RIGHT) { compo_picturebox_set(resource_pic, UI_BUF_GAME_BIRD_RIGHT_BIN); compo_picturebox_set_pos(resource_pic, pRes->x, pRes->y); } else if (pRes->attrib == RES_LIFE) { compo_picturebox_set(resource_pic, UI_BUF_GAME_BIRD_LIFE_BIN); compo_picturebox_set_pos(resource_pic, pRes->x, pRes->y); } else if (pRes->attrib == RES_DEATH) { compo_picturebox_set(resource_pic, UI_BUF_GAME_BIRD_DEATH_BIN); compo_picturebox_set_pos(resource_pic, pRes->x, pRes->y); } else { compo_picturebox_set_visible(resource_pic, false); } } } } } static void tjd_draw_barrier(void) { f_game_t *game = (f_game_t *)func_cb.f_cb; if (game == NULL) { return; } Barrier_t *pBarrier; // if (LEVENT_PLAYING == g_Airscraft_status) { for (int i = 0; i < MAX_BARRIER_DATA_NUM; i++) { pBarrier = game->pBarrier + i; /* 释放资源不需要显示 */ if (pBarrier->attrib == BARRIER_NULL || game->Barrier_status == RLS_UPDOWN_BARRIER || game->Barrier_status == RLS_UP_BARRIER || game->Barrier_status == RLS_DOWN_BARRIER) { if (pBarrier->attrib == BARRIER_NULL || game->Barrier_status == RLS_UPDOWN_BARRIER) { for (int j = 0; j < MAX_BARRIER_NUM * 2; j++) { compo_picturebox_t *barrier_pic = compo_getobj_byid(COMPO_ID_GAME_PIC_BARRIER + (i * 8 + j)); compo_picturebox_set_visible(barrier_pic, false); } continue; } else if (game->Barrier_status == RLS_UP_BARRIER) { for (int j = 0; j < MAX_BARRIER_NUM; j++) { compo_picturebox_t *barrier_pic = compo_getobj_byid(COMPO_ID_GAME_PIC_BARRIER + (i * 8 + j)); compo_picturebox_set_visible(barrier_pic, false); } } else if (game->Barrier_status == RLS_DOWN_BARRIER) { for (int j = 0; j < MAX_BARRIER_NUM; j++) { compo_picturebox_t *barrier_pic = compo_getobj_byid(COMPO_ID_GAME_PIC_BARRIER + ((i * 8 + MAX_BARRIER_NUM) + j)); compo_picturebox_set_visible(barrier_pic, false); } } } /* 显示有效移动部分 */ if (pBarrier->x >= BIRDFLY_ZOOM_X - pBarrier->cx && pBarrier->x <= (BIRDFLY_ZOOM_X + BIRDFLY_ZOOM_CX + pBarrier->cx)) { if (pBarrier->attrib == BARRIER_UP && (game->Barrier_status != RLS_UP_BARRIER && game->Barrier_status != RLS_UPDOWN_BARRIER)) { u16 y; y = BIRDFLY_ZOOM_Y; for (int j = 0; j < pBarrier->num; j++) { compo_picturebox_t *barrier_pic = compo_getobj_byid(COMPO_ID_GAME_PIC_BARRIER + (i * 8 + j)); compo_picturebox_set_pos(barrier_pic, pBarrier->x, y); compo_picturebox_set_visible(barrier_pic, true); y += pBarrier->cy; } } else if (pBarrier->attrib == BARRIER_DOWN && (game->Barrier_status != RLS_DOWN_BARRIER && game->Barrier_status != RLS_UPDOWN_BARRIER)) { u16 y; y = BIRDFLY_ZOOM_Y + BIRDFLY_ZOOM_CY - pBarrier->cy; for (int j = 0; j < pBarrier->num; j++) { compo_picturebox_t *barrier_pic = compo_getobj_byid(COMPO_ID_GAME_PIC_BARRIER + ((i * 8 + MAX_BARRIER_NUM) + j)); compo_picturebox_set_pos(barrier_pic, pBarrier->x, y); compo_picturebox_set_visible(barrier_pic, true); y -= pBarrier->cy; } } else if (pBarrier->attrib == BARRIER_UP_DOWN) { u16 y; if ((game->Barrier_status != RLS_UP_BARRIER && game->Barrier_status != RLS_UPDOWN_BARRIER)) { y = BIRDFLY_ZOOM_Y; for (int j = 0; j < pBarrier->num; j++) { compo_picturebox_t *barrier_pic = compo_getobj_byid(COMPO_ID_GAME_PIC_BARRIER + (i * 8 + j)); compo_picturebox_set_pos(barrier_pic, pBarrier->x, y); compo_picturebox_set_visible(barrier_pic, true); y += pBarrier->cy; } } if ((game->Barrier_status != RLS_DOWN_BARRIER && game->Barrier_status != RLS_UPDOWN_BARRIER)) { y = BIRDFLY_ZOOM_Y + BIRDFLY_ZOOM_CY - pBarrier->cy; for (int j = 0; j < MAX_BARRIER_NUM - pBarrier->num; j++) { compo_picturebox_t *barrier_pic = compo_getobj_byid(COMPO_ID_GAME_PIC_BARRIER + ((i * 8 + MAX_BARRIER_NUM) + j)); compo_picturebox_set_pos(barrier_pic, pBarrier->x, y); compo_picturebox_set_visible(barrier_pic, true); y -= pBarrier->cy; } } } } } } } static void tjd_show_bird_life(u16 x, u16 y, u16 level) { char str[6] = {0}; sprintf(str, "%d", level); tjd_show_digit(x + 32, y + 3, str, COMPO_ID_GAME_PIC_BIRD_LIFE); } static void tjd_bird_fly_redraw_proc(void) { f_game_t *game = (f_game_t *)func_cb.f_cb; if (game == NULL) { return; } // printf("TJD_Bird_Fly_redraw_proc:%d\n", game->BirdFly_status); if (game->has_to_redraw) { game->has_to_redraw = false; if (LEVENT_BIRD_FLYING_ON == game->BirdFly_status || LEVENT_BIRD_GLIDING == game->BirdFly_status || LEVENT_BIRD_QUICK_RIGHT_FLY == game->BirdFly_status) { /* 显示部分 */ tjd_draw_bird(); tjd_draw_barrier(); tjd_draw_resource(); tjd_show_bird_life(LEVEL_ICO_X, LEVEL_ICO_Y, game->bird_num); tjd_show_score(SCORE_ICO_X, SCORE_ICO_Y, game->game_score); /* 隐藏部分 */ compo_picturebox_t *hit_pic = compo_getobj_byid(COMPO_ID_GAME_PIC_BOOM); compo_picturebox_set_visible(hit_pic, false); } else if (LEVENT_BIRD_DIE_FALLDOWN == game->BirdFly_status) { /* 显示部分 */ tjd_draw_falling_death_bird(); tjd_draw_bird_hit(); tjd_draw_resource(); tjd_draw_barrier(); tjd_show_bird_life(LEVEL_ICO_X, LEVEL_ICO_Y, game->bird_num); tjd_show_score(SCORE_ICO_X, SCORE_ICO_Y, game->game_score); } else if (LEVENT_GAMEOVER_DLG == game->BirdFly_status) { /* 显示部分 */ tjd_draw_resource(); tjd_draw_barrier(); tjd_show_bird_life(LEVEL_ICO_X, LEVEL_ICO_Y, game->bird_num); tjd_show_score(SCORE_ICO_X, SCORE_ICO_Y, game->game_score); tjd_show_game_over_dlg(); /* 隐藏部分 */ compo_picturebox_t *bird_pic = compo_getobj_byid(COMPO_ID_GAME_PIC_BIRD); compo_picturebox_t *start_pic = compo_getobj_byid(COMPO_ID_GAME_PIC_START); compo_picturebox_t *figure_pic = compo_getobj_byid(COMPO_ID_GAME_PIC_START_TIP); compo_picturebox_set_visible(bird_pic, false); compo_picturebox_set_visible(start_pic, false); compo_picturebox_set_visible(figure_pic, false); compo_picturebox_t *hit_pic = compo_getobj_byid(COMPO_ID_GAME_PIC_BOOM); compo_picturebox_set_visible(hit_pic, false); } else if (LEVENT_READY == game->BirdFly_status) { /* 显示部分 */ tjd_draw_bird(); tjd_show_bird_life(LEVEL_ICO_X, LEVEL_ICO_Y, game->bird_num); tjd_show_score(SCORE_ICO_X, SCORE_ICO_Y, game->game_score); /* 隐藏部分 */ compo_picturebox_t *hit_pic = compo_getobj_byid(COMPO_ID_GAME_PIC_BOOM); compo_picturebox_set_visible(hit_pic, false); for (int i = 0; i < MAX_BARRIER_DATA_NUM; i++) { for (int j = 0; j < (MAX_BARRIER_NUM * 2); j++) { compo_picturebox_t *barrier_pic = compo_getobj_byid(COMPO_ID_GAME_PIC_BARRIER + (i * (MAX_BARRIER_NUM * 2) + j)); compo_picturebox_set_visible(barrier_pic, false); } } for (int i = 0; i < MAX_RESOURCE_DATA_NUM; i++) { compo_picturebox_t *resource_pic = compo_getobj_byid(COMPO_ID_GAME_RESOURCE_PIC + i); compo_picturebox_set_visible(resource_pic, false); } } } } void tjd_bird_fly_entry(void) { f_game_t *game = (f_game_t *)func_cb.f_cb; if (game == NULL) { return; } game->has_to_redraw = TRUE; game->bird_num = 1; game->game_score = 0; tjd_malloc_bird_fly_buffer(); game->BirdFly_status = LEVENT_READY; tjd_reset_birdfly(); tjd_birdfly_send_draw_evt(); } void tjd_birdfly_exit(void) { f_game_t *game = (f_game_t *)func_cb.f_cb; if (game == NULL) { return; } printf("BirdFly_exit\n"); tjd_birdfly_stop(); game->BirdFly_status = LEVENT_NULL; tjd_free_bird_fly_buffer(); } // 创建游戏界面 compo_form_t *func_game_form_create(void) { compo_form_t *frm; // 新建窗体和背景 frm = compo_form_create(true); /* 主背景 */ compo_picturebox_t *pic = compo_picturebox_create(frm, UI_BUF_GAME_BIRD_BG1_BIN); compo_setid(pic, COMPO_ID_GAME_PIC_BG); compo_picturebox_set_pos(pic, GUI_SCREEN_CENTER_X, GUI_SCREEN_CENTER_Y); /* 小鸟 */ pic = compo_picturebox_create(frm, UI_BUF_GAME_BIRD_FLY4_BIN); compo_setid(pic, COMPO_ID_GAME_PIC_BIRD); widget_set_align_center(pic->img, false); compo_picturebox_set_pos(pic, BIRDFLY_ZOOM_X + CENTER_X(BIRD_WIDTH), BIRDFLY_ZOOM_Y + ((BIRDFLY_ZOOM_CY - BIRDFLY_GROUND_HEIGHT - BIRD_HEIGHT) >> 1)); /* 开始指示 */ pic = compo_picturebox_create(frm, UI_BUF_GAME_START_LBL_BIN); compo_setid(pic, COMPO_ID_GAME_PIC_START); compo_picturebox_set_pos(pic, GUI_SCREEN_CENTER_X, GUI_SCREEN_CENTER_Y + BIRD_HEIGHT - 5); pic = compo_picturebox_create(frm, UI_BUF_GAME_FIGURE_BIN); compo_setid(pic, COMPO_ID_GAME_PIC_START_TIP); compo_picturebox_set_pos(pic, GUI_SCREEN_CENTER_X, GUI_SCREEN_CENTER_Y + BIRD_HEIGHT + START_LBL_HEIGHT + 15); /* 障碍物 - 箱子 */ for (int i = 0; i < COMPO_ID_GAME_PIC_BARRIER_MAX - COMPO_ID_GAME_PIC_BARRIER; i++) { pic = compo_picturebox_create(frm, UI_BUF_GAME_BARRIER_1_BIN); compo_setid(pic, COMPO_ID_GAME_PIC_BARRIER + i); widget_set_align_center(pic->img, false); compo_picturebox_set_visible(pic, false); } /* 生成资源 */ for (int i = 0; i < COMPO_ID_GAME_RESOURCE_PIC_MAX - COMPO_ID_GAME_RESOURCE_PIC; i++) { pic = compo_picturebox_create(frm, gold_pic_arr[0]); compo_setid(pic, COMPO_ID_GAME_RESOURCE_PIC + i); widget_set_align_center(pic->img, false); compo_picturebox_set_visible(pic, false); } /* 头部背景 */ pic = compo_picturebox_create(frm, UI_BUF_GAME_GAME_HEAD_BIN); widget_set_align_center(pic->img, false); compo_picturebox_set_pos(pic, 0, 0); /* 小鸟生命 */ pic = compo_picturebox_create(frm, UI_BUF_GAME_BIRD_LIFE_BIN); widget_set_align_center(pic->img, false); compo_picturebox_set_pos(pic, LEVEL_ICO_X, LEVEL_ICO_Y); for (int i = 0; i < COMPO_ID_GAME_PIC_BIRD_LIFE_MAX - COMPO_ID_GAME_PIC_BIRD_LIFE; i++) { pic = compo_picturebox_create(frm, digit_id_arr[1]); compo_setid(pic, COMPO_ID_GAME_PIC_BIRD_LIFE + i); widget_set_align_center(pic->img, false); compo_picturebox_set_pos(pic, LEVEL_ICO_X + 32, LEVEL_ICO_Y + 3); } /* 得分 */ pic = compo_picturebox_create(frm, UI_BUF_GAME_GOLD_0_BIN); widget_set_align_center(pic->img, false); compo_picturebox_set_pos(pic, SCORE_ICO_X, SCORE_ICO_Y); for (int i = 0; i < COMPO_ID_GAME_PIC_SCORE_MAX - COMPO_ID_GAME_PIC_SCORE; i++) { pic = compo_picturebox_create(frm, digit_id_arr[0]); compo_setid(pic, COMPO_ID_GAME_PIC_SCORE + i); widget_set_align_center(pic->img, false); compo_picturebox_set_pos(pic, SCORE_ICO_X + 32, SCORE_ICO_Y + 3); } /* 击中 */ pic = compo_picturebox_create(frm, Hit_Bird_Boom_pic_arr[0]); compo_setid(pic, COMPO_ID_GAME_PIC_BOOM); widget_set_align_center(pic->img, false); compo_picturebox_set_visible(pic, false); /* 游戏结束图片 */ compo_button_t *btn = compo_button_create_by_image(frm, UI_BUF_GAME_DLG_BG_BIN); compo_setid(btn, COMPO_ID_GAME_PIC_DLG_BG); compo_button_set_pos(btn, GUI_SCREEN_CENTER_X, GUI_SCREEN_CENTER_Y); compo_button_set_visible(btn, false); pic = compo_picturebox_create(frm, UI_BUF_GAME_GAME_OVER_BIN); compo_setid(pic, COMPO_ID_GAME_PIC_GAME_OVER); compo_picturebox_set_pos(pic, GUI_SCREEN_CENTER_X, GUI_SCREEN_CENTER_Y - 20); compo_picturebox_set_visible(pic, false); pic = compo_picturebox_create(frm, UI_BUF_GAME_GAME_OK_BTN_BIN); compo_setid(pic, COMPO_ID_GAME_PIC_GAME_OK); compo_picturebox_set_pos(pic, GUI_SCREEN_CENTER_X, GUI_SCREEN_CENTER_Y + 20); compo_picturebox_set_visible(pic, false); return frm; } static void func_game_click(void) { f_game_t *game = (f_game_t *)func_cb.f_cb; if (game == NULL) { return; } int btn_id = compo_get_button_id(); if (game->BirdFly_status != LEVENT_GAMEOVER_DLG) { if (LEVENT_BIRD_FLYING_ON == game->BirdFly_status || LEVENT_BIRD_GLIDING == game->BirdFly_status) { TJD_Bird_FlyOn(); } else if (game->BirdFly_status == LEVENT_READY) { game->BirdFly_status = LEVENT_BIRD_FLYING_ON; tjd_birdfly_start_play(); TJD_Bird_FlyOn(); } } else if (btn_id == COMPO_ID_GAME_PIC_DLG_BG) { if (game->BirdFly_status == LEVENT_GAMEOVER_DLG) { func_back_to(); } } } // 消息处理 static void func_game_message(size_msg_t msg) { switch (msg) { case MSG_CTP_CLICK: func_game_click(); break; case MSG_CTP_SHORT_UP: case MSG_CTP_SHORT_DOWN: break; case MSG_CTP_SHORT_LEFT: if (func_cb.flag_sort) { func_message(msg); } break; case MSG_CTP_LONG: break; default: func_message(msg); break; } } // 游戏过程状态机 static void func_game_process(void) { f_game_t *game = (f_game_t *)func_cb.f_cb; if (game == NULL) { return; } /* 游戏运行任务 */ if (tick_check_expire(game->bird_fly_task_tick, BIRDFLY_TIME_GAP) && game->bird_fly_task_flag) { game->bird_fly_task_tick = tick_get(); tjd_bird_fly_task(); } if (tick_check_expire(game->animation_task_tick, BIRDFLY_ANI_TIME_GAP) && game->animation_task_flag) { game->animation_task_tick = tick_get(); tjd_bird_fly_animation_task(); } if (tick_check_expire(game->quick_fly_task_tick, QUICKFLY_TIMEOUT_TIME) && game->quick_fly_task_flag) { game->quick_fly_task_tick = tick_get(); tjd_end_quick_fly_mode(); } if (tick_check_expire(game->rls_barrier_task_tick, RLS_BARRIER_TIMEOUT_TIME) && game->rls_barrier_task_flag) { game->rls_barrier_task_tick = tick_get(); tjd_end_rls_barrier_mode(); } /* 游戏过程不熄灭屏幕 */ reset_sleep_delay_all(); /* 更新游戏画面 */ tjd_bird_fly_redraw_proc(); } // 进入游戏功能 static void func_game_enter(void) { func_cb.f_cb = func_zalloc(sizeof(f_game_t)); func_cb.frm_main = func_game_form_create(); f_game_t *game = (f_game_t *)func_cb.f_cb; tjd_bird_fly_entry(); } // 退出游戏功能 static void func_game_exit(void) { tjd_birdfly_exit(); func_cb.last = FUNC_GAME; } // 游戏功能 void func_game(void) { printf("%s\n", __func__); func_game_enter(); while (func_cb.sta == FUNC_GAME) { func_game_process(); func_process(); func_game_message(msg_dequeue()); } func_game_exit(); } #endif