【鴻蒙開發(fā)板試用報(bào)告】用OLED板實(shí)現(xiàn)FlappyBird小游戲(上)
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
https://harmonyos.51cto.com/#zz
總是做各種Demo,是時(shí)候做個(gè)什么小應(yīng)用來練練手了。躊躇了很久,果然還是搞個(gè)小游戲才有意思。想到幾年前風(fēng)靡全球的FlappyBird,一個(gè)屏幕一個(gè)按鈕就足夠了,正好適合。OLED屏幕、按鍵的驅(qū)動(dòng)已經(jīng)有大牛們發(fā)布了,拿來用就可以。游戲邏輯什么的,用C語言實(shí)現(xiàn)也不是什么難事。主要目的就是要驗(yàn)證一下HarmonyOS復(fù)雜界面即時(shí)交互應(yīng)用可行性。
這一篇我們主要解決屏幕繪制的問題,下一篇文章將把剩余的部分介紹完。
我們需要用變量記錄小鳥的Y坐標(biāo)、垂直速度、各個(gè)煙囪的位置、方向等數(shù)據(jù),然后在主循環(huán)中不斷更新他們,再渲染到屏幕上。
梳理一下主循環(huán)的流程,如圖:

OLED的驅(qū)動(dòng),我使用了SiWei Xu老師的代碼(Source地址)。對(duì)于BirdDrawScreen的部分,我們需要解決一個(gè)問題,那就是在渲染每一幀時(shí),清空屏幕,然后在屏幕指定的位置繪制圖片。為此,我自己寫了一個(gè)函數(shù)ssd1306_DrawBitmapAtPosition,通過參數(shù)xo, yo指定要繪制的位置坐標(biāo)。
- void ssd1306_DrawBitmapAtPosition(const uint8_t* bitmap, uint8_t width, uint8_t height, int8_t xo, int8_t yo)
- {
- for (uint8_t y = 0; y < height; y++) {
- if (yo + y > SSD1306_HEIGHT || yo + y < 0) continue;
- for (uint8_t x = 0; x < width; x++) {
- if (xo + x > SSD1306_WIDTH || xo + x < 0) continue;
- uint8_t byte = bitmap[(y * width / 8) + (x / 8)];
- uint8_t bit = byte & (0x80 >> (x % 8));
- ssd1306_DrawPixel(xo + x, yo + y, bit ? White : Black);
- }
- }
- }
小鳥和煙囪的圖片代碼,先用畫圖做好,再通過img2code.py可以輕松搞定。
這里小鳥只做了一幀,以后或許可以做成多幀動(dòng)畫效果。煙囪則是一個(gè)head和一段重復(fù)的body構(gòu)成,以節(jié)約內(nèi)存。
游戲邏輯沒什么難點(diǎn),主要就是小鳥有重力加速度,煙囪的隨機(jī)生成、以固定速度移動(dòng)并循環(huán)過場,碰撞檢測等等。后面的文章會(huì)放出代碼。上圖:
下一篇,我們將加入按鈕事件,控制小鳥的飛行。
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
https://harmonyos.51cto.com/#zz