基於RT-Thread實現的小遊戲(貪喫蛇、俄羅斯方塊)

前言:本實現基於stm32芯片,移植RT_Thread Nano系統源碼,實現兩個小遊戲(貪喫蛇/俄羅斯方塊)。本實驗提供完整的IAR工程源碼並且有很多註釋,是一個不錯的參考例程。關鍵知識點:OLED驅動,ADC採樣,遊戲邏輯設計,RT_Thread移植


點擊下載源碼

1.硬件設計

0.96寸OLED

搖桿

stm32f103c8t6 (64k-ROM 20k-RAM)

以上材料,照着圖片搜索都能在TB買到。

2.設計思路:

運用RT-Thread系統需要結合自己的項目需求,將RT-Thread的優點發揮出來,不僅要實現需求,還要讓代碼具有可擴展性、移植性。

我們利用一個定時器進行週期地檢測搖桿的狀態,我們要保證任務能夠快速響應搖桿。

作爲遊戲機而言,其中包含了很多種小遊戲,如果一種遊戲當作一個線程,那麼某一個時刻只會運行一個遊戲,也就是一個遊戲線程;創建那麼多個線程不就沒有意義了嗎?確實最好的方式是使用前後臺的形式實現,但這裏爲了讓代碼能夠層次分明,可擴展性,一個小遊戲就是一個線程,系統只需要運行當前用戶打開的小遊戲的線程,其他的線程掛起,不參與調度。

回到剛纔搖桿的問題,我們要保證每個線程都能快速地獲取搖桿狀態,當搖桿的狀態變化時產生出一個搖桿事件,線程等待該事件,當事件到來時,調用搖桿驅動的接口,主動獲取搖桿信息。

按鍵也是同樣的道理,利用一個定時器週期地檢測按鍵的狀態,當有按鍵發生變化時產出事件,線程等待事件發生時,主動獲取按鍵信息。

接下來說一下關於顯示的問題,通常的做法就是利用定時器,週期地將顯存的數據同步到屏幕了,但是這樣做有缺陷,但用戶沒有操作界面變化時,這時候的刷新時沒有必要的,會大大增加系統的負擔。

我們用一個線程實現週期地刷新屏幕,其他的線程會調用屏幕驅動函數,把數據寫入顯存時,在該函數裏發送一個屏幕刷新事件,屏幕服務線程等待到這個事件就進行屏幕顯示刷新,將顯存的數據通過i2c發送的屏幕。

我們需要利用一個線程也就是main函數進行遊戲管理和設置,當用戶選擇某種遊戲時,創建該遊戲的線程,當退出時,把該線程刪除。

線程的優先級:main函數 > 遊戲進程 > 屏幕刷新線程。要注意的是在屏幕刷新時,進行i2c數據傳送過程中不能被其他線程打斷,所以先把中斷關閉,數據傳輸完成後再打開中斷。

3.代碼設計:

我之前單獨做過貪喫蛇和俄羅斯方塊的小遊戲,再結合STM32移植rt_thread源碼的例程。可參考以下博客:

基於stm32、0.96寸OLED實現的貪喫蛇小遊戲(詳細源碼註釋)
基於stm32、0.96寸OLED實現的俄羅斯方塊小遊戲(詳細源碼註釋)
基於IAR-stm32裸板工程,完美移植RT-Thread Nano系統(附源碼)

將上面的代碼結合到一個工程裏就是本篇所要做的項目:

使用說明:

接線如下:

如果要在電腦上看串口打印信息,需要將PA9引腳通過串口小板接到電腦。

  • 下載編譯代碼,將工程燒錄到開發板上,點擊運行,出現以下界面,如果屏幕花屏,那麼將OLED的RES引腳接地進行復位,再復位單片機。

  • 上下控制搖桿可以選中不同的遊戲,按下搖桿中鍵進入選中的遊戲,例如運行Snake遊戲,首先出現以下界面:

  • 再按下搖桿中鍵開始遊戲,操控搖桿進行遊戲,界面如下:

  • 在遊戲進行時中或遊戲失敗(彈出”GAME OBER”),這時候按下中鍵可以重新開始遊戲:

  • 在遊戲過程中,長按中鍵2s以上再鬆開回到首頁。

如果在這個代碼架構下添加新遊戲,在main函數裏的gamestr結構體數組加入元素,一個元素包括遊戲名、遊戲啓動接口、遊戲停止接口,遊戲內容的實現方法可參考現有的遊戲例程。


時間倉促,如有錯誤之處,還望指出。

 

《博觀而約取,厚積而薄發。————蘇軾》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章