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

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

本來打算到此結(jié)束,后來一想其實(shí)還能做更多功能,比如聯(lián)網(wǎng)對戰(zhàn)?也歡迎大家留言告訴你的想法。
代碼奉上。
想了解更多內(nèi)容,請?jiān)L問:
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
https://harmonyos.51cto.com/#zz