以下作品由安信可社區用戶
mgodmonkey制作
游戲均移植自:
【老虎愛 3D-bilibili】
目前存在的游戲:
植物大戰僵尸:demos/pvz
羊了個羊:demos/yang
消消樂:demos/xiaoxiaole
華容道:demos/huarongdao
源碼見:
https://github.com/MGod-monkey/AiPi-Eyes-Rx
https://gitee.com/mgod_wu/AiPi-Eyes-Rx
PVZ 功能展示可見:
羊了個羊:
消消樂:
華容道:
基于官方示例文檔修改的,適用于 4 寸電容屏的小安派 R1 和 R2,R1 和 R2 的區別和修改如下:
小安派 - Eyes-R1 帶外置 ES8388 音頻芯片,支持兩路音頻輸入輸出。
小安派 - Eyes-R2 采用內置 CodeC,支持單路音頻輸入輸出。
如果是編譯帶 8388 的開發板(AiPi-Eyes-R1)需要配置如下參數:
●修改 app_main.h #define DEF_USER_ES8388_EN (1)
●修改 proj.conf
●set(CONFIG_SOLUTION_FUNC_AUDIO_AUADC 0) ●set(CONFIG_SOLUTION_FUNC_AUDIO_AUDAC 0)
如果是編譯不帶 8388 的開發板(AiPi-Eyes-R2)需要配置如下參數:
●修改 app_main.h #define DEF_USER_ES8388_EN (0)
●修改 proj.conf
●set(CONFIG_SOLUTION_FUNC_AUDIO_AUADC 1) set(CONFIG_SOLUTION_FUNC_AUDIO_AUDAC 1)
01、硬件說明
硬件僅用到了:
- 小安派 Rx
- 4 寸 480*480 像素的電容屏
- TTL 下載器
02、軟件說明
修改 demos/lv_demos.h 即可體驗不同的游戲(一次只能設置一個游戲為 1 然后編譯)
#define LV_USE_GAME_PVZ 0
// #define LV_USE_GAME_2048 0
#define LV_USE_GAME_YANG 1
#define LV_USE_GAME_XIAOXIAOLE 0
#define LV_USE_GAME_HUARONGDAO 0
main.c 主程序說明如下:
●lvgl 任務線程函數
static void user_task(void *pvParameters)
{
lv_task_handler();
printf("[LVGL] init success \r\n");
while (1) {
lv_task_handler();
bflb_mtimer_delay_ms(1);
}
}
●初試化 lvgl
/* lvgl init */
lv_init();
lv_port_disp_init(); //初試化顯示屏
lv_port_indev_init(); //初試化觸摸接口
●根據定義,設置不同的初試游戲函數(2048 等待后續移植)
#if LV_USE_GAME_PVZ
pvz_start()
#endif
#if LV_USE_GAME_2048
// 2048_start();
#endif
#if LV_USE_GAME_YANG
yang_game();
#endif
#if LV_USE_GAME_XIAOXIAOLE
xiaoxiaole();
#endif
#if LV_USE_GAME_HUARONGDAO
huarongdao();
#endif
簡單解析一下 xiaoxiaole.c 的游戲初試化程序,大部分都是 lvgl 庫中的知識,文檔可以見 https://lvgl.100ask.net/master/index.html
void xiaoxiaole()
{
// 根據屏幕尺寸來靈活設置圖片的放大倍數
// lv_disp_get_hor_res(lv_disp_get_default())獲取默認顯示屏的水平像素
if(lv_disp_get_hor_res(lv_disp_get_default())>=lv_disp_get_ver_res(lv_disp_get_default()))
{screen_ratio=(float)lv_disp_get_ver_res(lv_disp_get_default())/400;}
else
{
screen_ratio=(float)lv_disp_get_hor_res(lv_disp_get_default())/480;
}
// screen_ratio放大倍數
// 移除屏幕滾動條
lv_obj_clear_flag(lv_scr_act(), LV_OBJ_FLAG_SCROLLABLE);
screen1=lv_tileview_create(lv_scr_act());
lv_obj_set_style_bg_color(screen1,lv_color_hex(0x000000), LV_PART_MAIN);
lv_obj_clear_flag(screen1, LV_OBJ_FLAG_SCROLLABLE);
//背景圖片(如果很卡的話,把這個背景圖片刪掉)
//////////////////////////////////////////////////////////////////////////////////////
bgmap=lv_img_create(screen1);
lv_img_set_src(bgmap, &xiaoxiaole_bg_img);
lv_img_set_pivot(bgmap,0,0);
lv_img_set_zoom(bgmap,256*1.5*1.2);
lv_obj_clear_flag(bgmap, LV_OBJ_FLAG_SCROLLABLE);
///////////////////////////////////////////////////////////////////////////////////
//注冊消消樂滑塊窗口的地方
game_window=lv_tileview_create(screen1);
lv_obj_set_style_bg_color(game_window,lv_color_hex(0x000000), LV_PART_MAIN);
lv_obj_set_style_bg_opa(game_window,200, LV_PART_MAIN);
lv_obj_clear_flag(game_window, LV_OBJ_FLAG_SCROLLABLE);
lv_obj_set_style_outline_width(game_window, 6, LV_PART_MAIN);
lv_obj_set_style_outline_color(game_window, lv_color_hex(0xbb7700), LV_PART_MAIN);
lv_obj_center(game_window);
lv_obj_set_size(game_window,280*screen_ratio,280*screen_ratio);
// 定義刷新按鈕
refs_btn=lv_img_create(screen1);
lv_img_set_src(refs_btn, &refs_btn_img);
// lv_obj_set_align(refs_btn,LV_ALIGN_RIGHT_MID);
lv_obj_align(refs_btn,LV_ALIGN_RIGHT_MID,8,0);
lv_obj_add_flag(refs_btn, LV_OBJ_FLAG_CLICKABLE);
lv_obj_add_event_cb(refs_btn,map_refs,LV_EVENT_CLICKED,0);
lv_img_set_zoom(refs_btn, 150);
// 定義退出按鈕(退出按鈕的事件函數還沒有用到)
exit_btn=lv_img_create(screen1);
lv_img_set_src(exit_btn, &exit_img);
lv_obj_align(exit_btn,LV_ALIGN_TOP_RIGHT,10,-20);
// lv_obj_set_align(exit_btn,LV_ALIGN_TOP_RIGHT);
lv_obj_add_flag(exit_btn, LV_OBJ_FLAG_CLICKABLE);
lv_obj_add_event_cb(exit_btn,exit_game_cb,LV_EVENT_CLICKED,0);
lv_img_set_zoom(exit_btn, 130);
// 定義硬幣圖片
coin=lv_img_create(screen1);
lv_img_set_src(coin, &coin_img);
lv_img_set_zoom(coin, 130);
lv_obj_align(coin,LV_ALIGN_TOP_LEFT,10,-20);
// 定義得分
score=0;
score_lable=lv_label_create(screen1);
lv_label_set_text_fmt(score_lable,"SCORE:%d",score);
lv_obj_set_style_text_font(score_lable,&lv_font_montserrat_20,0);
lv_obj_set_y(score_lable,40);
lv_obj_set_style_text_color(score_lable, lv_color_hex(0x00aaff), LV_PART_MAIN);
game_init();
}
static void game_init()
{
int i, j;
lv_obj_refr_size(game_window);
// 生成一個8*8的不同顏色的方塊
for(j=0;j8;j++)
{
for(i=0;i8;i++)
{
game_obj[j][i].x=i;
game_obj[j][i].y=j;
game_obj[j][i].alive=1;
game_obj[j][i].color_index=rand()%7;
game_obj[j][i].obj=lv_btn_create(game_window);
lv_obj_set_pos(game_obj[j][i].obj,i*35*screen_ratio+1,j*35*screen_ratio+1);
lv_obj_set_size(game_obj[j][i].obj,35*screen_ratio-2,35*screen_ratio-2);
lv_obj_set_style_bg_color(game_obj[j][i].obj,lv_color_hex(color_lib[game_obj[j][i].color_index]),0);
game_obj[j][i].obj-?>user_data=&game_obj[j][i];
lv_obj_add_event_cb(game_obj[j][i].obj,move_obj_cb,LV_EVENT_PRESSING,0);
lv_obj_add_event_cb(game_obj[j][i].obj,move_obj_cb,LV_EVENT_RELEASED,0);
}
}
// 每次方塊填滿都會進行檢測,是否有可以消除的方塊
if(map_is_full()&&same_color_check()){same_color_flash();lv_obj_clear_flag(refs_btn, LV_OBJ_FLAG_CLICKABLE);}
}
03、編譯燒錄
環境搭建安裝參考:小安派 R2 初體驗 - 開箱 + 環境搭建 + 編譯燒錄
編譯:make BL_SDK_BASE=E:/Aithinker_Ai/AiPi-Open-Kits/aithinker_Ai-M6X_SDK,BL_SDK_BASE 后面為自己的 aithinker_Ai-M6X_SDK 文件夾存儲地址
燒錄:
make flash COMX=
COM5 BL_SDK_BASE=
E:/Aithinker_Ai/AiPi-Open-Kits/aithinker_Ai-M6X_SDK
注:目前連接顯示屏燒錄的時候經常會失敗,原因是 TTL 下載器供電不穩,因此有以下兩種解決方式:
- 不連接顯示屏燒錄
- 連接顯示屏,但需要連接 TYPE-C 供電,然后用 TTL 下載器燒錄
后續,筆者也會嘗試移植更多的游戲,并試試看看能不能把背景音樂也添加上,可以關注原貼:【DIY電子作品】基于小安派AiPi-Eyes-R2的N合1觸摸屏游戲https://bbs.ai-thinker.com/forum.php?mod=viewthread&tid=45318&extra=page%3D1&_dsign=82a1e54b
-
開源硬件
+關注
關注
8文章
208瀏覽量
29806
發布評論請先 登錄
相關推薦
評論