【鴻蒙開發板試用】用OLED板實現FlappyBird小游戲(中)
想了解更多內容,請訪問:
51CTO和華為官方合作共建的鴻蒙技術社區
https://harmonyos.51cto.com/#zz
小伙伴們久等了,在上一篇《【開發板試用】用OLED板實現FlappyBird小游戲(上)》中,我們本著拿來主義的原則,成功的讓小鳥在OLED屏幕上自由飛翔起來,下面我們將加入按鈕交互功能。
這里感謝唐佐林老師的無私分享,利用他開發的按鈕組件,開箱即用,節省了大量的開發時間(鏈接)。首先將按鈕組件的初始化函數InitButton搬到我們的主程序中,再寫一個按鈕事件回調函數Button_Callback,里面加入對邏輯的判斷和處理即可。
- //按鈕事件回調函數
- static void Button_Callback(const char* sender, BtnEvent event)
- {
- printf("[Button] Button_Callback() : %s -> %d\n", sender, event);
- if( event == Pressed )
- {
- /* Pressed == 1 按下事件處理代碼 */
- if(isStarted == 0)
- {
- BirdStart();
- }else{
- BirdFlap();
- }
- }
- }
- //按鈕組件初始化
- int InitButton(void)
- {
- printf("InitButton\n");
- int ret = 0;
- ret += DTButton_Init(); // 初始化按鍵事件處理上下文
- /* 設置GPIO_8按鍵的回調函數,同時需要響應按下,釋放以及長按三個事件 */
- /* 按鍵觸發順序: Pressed -> LongPressed(optional) -> Released */
- ret += DTButton_Enable("GPIO_8", Button_Callback, Pressed | LongPressed | Released);
- /* 設置S1按鍵的回調函數 */
- ret += DTButton_Enable("S1", Button_Callback, Pressed);
- printf("InitButton: %d\n", ret);
- return ret;
- }
其中isStart是一個全局變量,定義在Bird.h中,作為游戲是否開始的標志。
由于加入了游戲標題界面,在按鈕按下時,這里有兩種情況,如果是在游戲標題界面中,則開始游戲,即調用BirdInit和BirdStart函數;如果已經在游戲中,則調用小鳥撲騰函數BirdFlap。而BirdFlap就做一件事情,把小鳥的垂直方向速度置為固定值。這個值我經過多次調優,最終固定在-3.5。
看這張圖能更容易理解坐標系和物體的運動:

其他的改進,包括右上角增加了一個分數指示器,具體就是用飛過的距離除以10得到。
相較第一篇,游戲流程基本沒有變化,增加的是按鈕的控制,由于使用了回調函數,即異步處理,代碼閱讀起來更友好也更簡潔。
下面是效果圖:

本來打算到此結束,后來一想其實還能做更多功能,比如聯網對戰?也歡迎大家留言告訴你的想法。
代碼奉上。
想了解更多內容,請訪問:
51CTO和華為官方合作共建的鴻蒙技術社區
https://harmonyos.51cto.com/#zz