作者:還在琢磨
來源:CSDN
原文:https://blog.csdn.net/mbl114/article/details/78074742
版權聲明:本文為部落客原創文章,轉載請附上博文連結
家裡孩子在學python,用了其中的pygame來教學。也想和他一起學,搜了很多文章,感覺作者“還在琢磨”寫得條理清晰,由淺入深,又加上了OOP的思想,便于後期維護及修改。就把他的代碼再學習一邊,擴充了一些功能。最終效果如下:
簡單的遊戲實作流程應該是:
1. 計算遊戲中元素的坐标。也就是遊戲每重新整理一次,遊戲中的元素,例如子彈坐标、 英雄飛機、敵人飛機的坐标計算等等;
2. 計算出了遊戲中的元素,飛機或者子彈的坐标,那麼就需要将飛機和子彈的圖檔繪制到這個坐标的位置;
3. 處理事件,遊戲進行過程中,玩家會通過鍵盤或者滑鼠點選、拖動、甚至關閉視窗等都屬于事件,當玩家有這些操作的時候,我們要對玩家的操作做出響應。比如,如果玩家點選了視窗右上角的X按鈕,我們就要停止遊戲并且關閉視窗結束程式,如果玩家按下w鍵,我們就讓飛機向上移動等等。
4. 碰撞檢測。這個遊戲核心邏輯,我們發出子彈,就要判斷子彈是否和敵人飛機碰到一起,如果碰到一起我們就要消失子彈,并且消失飛機,在碰撞坐标處播放動畫。如果敵人子彈擊中我們,也是類似思路。碰撞檢測我們主要通過判斷兩張圖檔的矩形是否相交。
5. 重新整理視窗。這個最為簡單,直接調用pygame.display.update()即可。
下面我們搭建流程代碼如下,這裡我們建立GameScene類,用于顯示視窗,并負責遊戲的核心邏輯及場景中各個遊戲元素的管理:
import pygame
# 主場景
class MainScene(object):
# 初始化主場景
def __init__(self):
# 場景尺寸
self.mSize = (512, 768)
# 場景對象
self.mScene = pygame.display.set_mode([self.mSize[0], self.mSize[1]])
# 設定标題
pygame.display.set_caption("飛機大戰-v1.0")
# 繪制
def draw_elements(self):
pass
# 動作
def action_elements(self):
pass
# 處理事件
def handle_event(self):
pass
# 碰撞檢測
def detect_conlision(self):
pass
# 主循環,主要處理各種事件
def run_scene(self):
while True:
# 計算元素坐标
self.action_elements()
# 繪制元素圖檔
self.draw_elements()
# 處理事件
self.handle_event()
# 碰撞檢測
self.detect_conlision()
# 重新整理顯示
pygame.display.update()
# 入口函數
if __name__ == "__main__":
# 建立主場景
mainScene = MainScene()
# 開始遊戲
mainScene.run_scene()
架構流程中的涉及到的功能函數,例如繪制、計算坐标等并沒有填寫内容,我們在以後具體添加功能中,再去實作。遊戲中需要用到的各種功能基本完備了,以後的代碼就是往這個架構裡填寫東西。我很喜歡這種風格,從架構到細部。一點一點學,一點一點填寫、測試。