mPython有趣的飛機大戰_風聞
壹零社-最新鲜的互联网产业资讯2021-11-10 17:18
文/陳新龍
飛機大戰是一款經典的射擊遊戲,操作簡單,玩法多樣,玩家只需要控制自己的飛機左右飛行,躲避或瞄準隨機出現的敵機,併發射子彈擊落敵機,即可獲得遊戲積分。在去年《電腦報》的一篇文章中,小陳老師在Scratch中編寫了一款軟件版的飛機大戰,只需要通過方向鍵和空格鍵便可控制飛機的運動和發射子彈。今天再做飛機大戰自然要有所提高,我們通過掌控板結合mPython編程實現硬件版的飛機大戰(圖1)。
圖1 遊戲效果
製作遊戲的第一步便是繪製遊戲對象,包括我方飛機、敵方飛機、子彈三個對象。遊戲中每個對象都有特定的外觀和位置,以前製作軟件版飛機大戰時飛機、子彈的圖片都是從外部導入圖片來使用的。
硬件版的飛機大戰我們需要在掌控板的OLED顯示屏上顯示,由於掌控板屏幕OLED顯示屏只有126×64的像素點,為了更好地繪製飛機的外觀,我們可以先在Excel電子表格中規劃好草圖,一個單元格代表一個像素點,然後通過掌控板編程顯示在屏幕中。例如圖2中黃色數字1表示飛機的原點用(xPlane,yPlane)表示,那麼第二行就是繪製直線(xPlane-1,yPlane+1)到(xPlane+1,yPlane+1);第三行同樣也是繪製直線(xPlane-1,yPlane+2)到(xPlane+1,yPlane+2)……(圖2)
圖 2 Excel模擬飛機外觀
為了飛機更逼真,我給飛機的尾部添加了“噴火”效果,通過代碼方式可以實現一閃一閃的“噴火“效果(圖3)。
圖 3 新建函數plane繪製我方飛機外形
我方飛機繪製完成後將敵方飛機也繪製完成,敵方飛機比我方飛機略小,我方飛機頭部朝上,敵方飛機頭部朝下。敵機的原點座標應該設置在下方(xEnemy,yEnemy),第2行繪製直線(xEnemy-1,yEnemy-1)到(xEnemy+1,yEnemy-1)以此類推。飛機的外觀可以自行發揮,不必完全拷貝我的設計,定義enemy和plane兩個函數作為繪製飛機的外觀(圖4)。
圖 4 新建函數enemy 繪製敵機外形
遊戲中子彈的發射方式和繪製比較簡單,子彈的活動範圍跟隨着我方飛機即可。只需要繪製兩個像素點,一上一下。設置第一個點描點的座標為(xBullet,yBullet),第二個點的座標為(xBullet,yBullet+1)其圖形化代碼如圖5所示。
圖 5 繪製子彈圖形
遊戲的角色外觀都已經繪製完成,接下來可以開始給飛機添加動態效果。以飛機左右移動控制為例,這裏我們定義函數planeMove(),通過調用飛機的原點(xPlane,yPlane)當玩家觸摸掌控板P鍵時候,飛機向左移動,代表着飛機的橫座標減去4個像素,當玩家觸摸掌控板N鍵時,飛機向右移動,代表着飛機的橫座標加上4個像素。為了防止飛機左右移動超出OLED顯示屏,我們需要給飛機設定橫座標的範圍(10<=xPlane<=118)之間(圖6)。
圖 6 飛機的操控左右移動
接下來要考慮如何生成敵方飛機,定義一個變量enemyState表示敵機的生存狀態,當其值為真時,表示存活,可以顯示;當其值為假時,表示死亡不顯示。
那麼敵方飛機的運動軌跡是怎麼樣的呢?答案是自上而下,敵方飛機首次出現時在掌控板屏幕的最上方。敵機從掌控板OLED顯示屏上方隨機出現,在選取xEnemy的橫座標時,考慮敵機的寬度後取6-110之間的隨機數(圖7)。
圖 7 敵機的出現位置
遊戲過程中敵方飛機是自上而下從屏幕上方運動到下方的。在運動過程中和我方飛機的運動軌跡不同,速度也可能不同。因此,我們使用多線程來實現。定義線程2,每隔200毫秒將敵機的縱座標yEnemy增加1個像素,當敵機縱座標yEnemy大於或者等於64時,視為敵機出界消失,將其存活狀態enemyState設置為假,重新生成新的敵機。(圖8)
圖 8 敵機運動軌跡
在遊戲中,通過觸摸掌控板T鍵發射子彈射擊敵方飛機,子彈的位置是(xBullet,yBullet)由於子彈每次從己方飛機的炮口發射,因此,子彈的初始座標:(xBullet = xPlane;yBullet = yPlane)。子彈的存活狀態bulletState為真值時,表示子彈發射中,要顯示。同樣當bulletState為假值時,表示子彈消失,要隱藏起來。由於子彈的運動軌跡和速度與其他對象也不相同,我們還是使用多線程來實現它。
我們設定每次只能發送1枚子彈。定義多線程1,當玩家觸摸T鍵,並且當前沒有子彈在飛行時,調用該多線程1。子彈產生後,每隔100毫秒向上運動4個像素,即yBullet增加-4。如果子彈擊中敵機或者子彈到達掌控板OLED顯示屏上方時自動消失,存活狀態設置為假。
那麼如何判斷子彈是否擊中敵機呢?其實非常簡單,只要子彈進入敵機內部,便可以判斷為擊中飛機,由於飛機是不規則的圖形,我們可以把敵機當作是一個矩形,矩形左邊界橫座標為xEnemy-5,右邊界橫座標為xEnemy+5,頭部縱座標為yEnemy,擊中敵機的條件是(xBullet>=xBullet-5且xBullet<=xEnemy+5或者yBullet<=yEnemy)擊中目標敵機後,玩家可以根據實際情況增加一個爆炸的效果,增加遊戲的趣味性。(圖9)
圖 9 發射子彈
通過編寫以上的代碼,我們已經可以實現飛機大戰的基本功能了。但是遊戲還可以更加完善,還可以給遊戲增加積分系統、生成多架敵機、加入連續發射子彈等等,當然編程難度會上升,如果你覺得不錯,和小陳老師一起動手完成飛機大戰吧。(圖10)