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

OLED的驅動,我使用了SiWei Xu老師的代碼(Source地址)。對于BirdDrawScreen的部分,我們需要解決一個問題,那就是在渲染每一幀時,清空屏幕,然后在屏幕指定的位置繪制圖片。為此,我自己寫了一個函數ssd1306_DrawBitmapAtPosition,通過參數xo, yo指定要繪制的位置坐標。
- 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可以輕松搞定。
這里小鳥只做了一幀,以后或許可以做成多幀動畫效果。煙囪則是一個head和一段重復的body構成,以節約內存。
游戲邏輯沒什么難點,主要就是小鳥有重力加速度,煙囪的隨機生成、以固定速度移動并循環過場,碰撞檢測等等。后面的文章會放出代碼。上圖:
下一篇,我們將加入按鈕事件,控制小鳥的飛行。
https://harmonyos.51cto.com/#zz