Python項目實戰學習 外星人入侵遊戲開發總結

外星人入侵開發總結

設置屏幕大小、遊戲名稱、背景顏色
	pygame.init()  #初始化背景設置
    ai_settings = Settings()
    screen = pygame.display.set_mode((120, 800))
    pygame.display.set_caption("外星人入侵")

set_mode()就是設置遊戲屏幕寬高的函數,座標原點在電腦屏幕左上角。
set_caption()就是設置遊戲名稱的函數

背景顏色

	#設置背景顏色
    bg_color = (230, 230, 230)
    screen.fill(ai_settings.bg_color)    #只能有一個參數

screen.fill()函數只能傳遞一個參數,設置背景的顏色。
這些基本的參數可用在一個文件中寫,然後在其他文件中引用。

讓屏幕繪製可見

    # 讓最近繪製的屏幕可見
    pygame.display.flip()

這句代碼必須有,不然所有的screen設置都無法顯示。 正常在每個循環中都會重新設置

設置鍵盤和鼠標監聽事件
def check_events(ai_settings,screen,ship,bullets):
    """ 響應按鍵和鼠標事件,在這個方法中指定需要檢查的事件 """
    # 事件都是通過pygame.event.get()方法獲取
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
         # 每次按鍵都會註冊一個KEYDOWN
         # 檢測到KEYDOWN事件時,我們需要檢查按下的是否是特定的鍵
        elif event.type == pygame.KEYDOWN:
            check_keydown_events(event,ai_settings,screen,ship,bullets)
        # 鬆開方向鍵時觸發的事件,將moving_right or moving_left設爲false
        elif event.type == pygame.KEYUP:
            check_keyup_events(event,ship)

爲了能夠訪問Pygame檢測到的事件,需要使用pygame.event.get()函數,獲取事件,然後再通過event.type來判斷獲取的事件類型

鍵盤按鍵事件編碼大全

KeyASCII ASCII Common Name
K_BACKSPACE \b backspace
K_TAB \t tab
K_CLEAR clear
K_RETURN \r return
K_PAUSE pause
K_ESCAPE ^[ escape
K_SPACE space
K_EXCLAIM ! exclaim
K_QUOTEDBL " quotedbl
K_HASH # hash
K_DOLLAR $ dollar
K_AMPERSAND & ampersand
K_QUOTE quote
K_LEFTPAREN ( left parenthesis
K_RIGHTPAREN ) right parenthesis
K_ASTERISK * asterisk
K_PLUS + plus sign
K_COMMA , comma
K_MINUS - minus sign
K_PERIOD . period
K_SLASH / forward slash
K_0 0 0
K_1 1 1
K_2 2 2
K_3 3 3
K_4 4 4
K_5 5 5
K_6 6 6
K_7 7 7
K_8 8 8
K_9 9 9
K_COLON : colon
K_SEMICOLON ; semicolon
K_LESS < less-than sign
K_EQUALS = equals sign
K_GREATER > greater-than sign
K_QUESTION ? question mark
K_AT @ at
K_LEFTBRACKET [ left bracket
K_BACKSLASH \ backslash
K_RIGHTBRACKET ] right bracket
K_CARET ^ caret
K_UNDERSCORE _ underscore
K_BACKQUOTE ` grave
K_a a a
K_b b b
K_c c c
K_d d d
K_e e e
K_f f f
K_g g g
K_h h h
K_i i i
K_j j j
K_k k k
K_l l l
K_m m m
K_n n n
K_o o o
K_p p p
K_q q q
K_r r r
K_s s s
K_t t t
K_u u u
K_v v v
K_w w w
K_x x x
K_y y y
K_z z z
K_DELETE delete
K_KP0 keypad 0
K_KP1 keypad 1
K_KP2 keypad 2
K_KP3 keypad 3
K_KP4 keypad 4
K_KP5 keypad 5
K_KP6 keypad 6
K_KP7 keypad 7
K_KP8 keypad 8
K_KP9 keypad 9
K_KP_PERIOD . keypad period
K_KP_DIVIDE / keypad divide
K_KP_MULTIPLY * keypad multiply
K_KP_MINUS - keypad minus
K_KP_PLUS + keypad plus
K_KP_ENTER \r keypad enter
K_KP_EQUALS = keypad equals
K_UP up arrow
K_DOWN down arrow
K_RIGHT right arrow
K_LEFT left arrow
K_INSERT insert
K_HOME home
K_END end
K_PAGEUP page up
K_PAGEDOWN page down
K_F1 F1
K_F2 F2
K_F3 F3
K_F4 F4
K_F5 F5
K_F6 F6
K_F7 F7
K_F8 F8
K_F9 F9
K_F10 F10
K_F11 F11
K_F12 F12
K_F13 F13
K_F14 F14
K_F15 F15
K_NUMLOCK numlock
K_CAPSLOCK capslock
K_SCROLLOCK scrollock
K_RSHIFT right shift
K_LSHIFT left shift
K_RCTRL right control
K_LCTRL left control
K_RALT right alt
K_LALT left alt
K_RMETA right meta
K_LMETA left meta
K_LSUPER left Windows key
K_RSUPER right Windows key
K_MODE mode shift
K_HELP help
K_PRINT print screen
K_SYSREQ sysrq
K_BREAK break
K_MENU menu
K_POWER power
K_EURO Euro
加載圖片 添加圖片元素

ship.py爲例

class Ship():
    def __init__(self,ai_settings, screen):
        """ 初始化飛船設置其初始化位置"""
        self.screen = screen
        self.ai_settings = ai_settings
        # 加載飛船圖像並獲取其外接矩形
        self.image = pygame.image.load('images/ship.bmp')
        self.rect = self.image.get_rect() 
        self.screen_rect = screen.get_rect()
        #將每艘新飛船放在屏幕底部中央
        self.rect.centerx = self.screen_rect.centerx
        self.rect.bottom = self.screen_rect.bottom
        # 在飛船的屬性center中存儲小數值
        self.center = float(self.rect.centerx)
        # 添加一個向右移動的屬性 初始化爲False
        # 在向右鍵按下時,爲真,鬆開爲False,實現按住持續移動
        self.moving_right = False
        self.moving_left = False

通過pygame.image.load()函數加載圖片,存放圖片素材的文件最好與ship.py在同一級目錄。
self.image.get_rect() 是獲取圖片所佔用的矩形,此後就像操作一個矩形一樣操控圖片,簡單快捷高效。
screen.get_rect() 同理就是獲取屏幕的矩形。
兩個獲取的矩形rect其實都是爲了獲取對象的參數,方便設置位置等。可用使用矩形的四角和中心(x,y)座標來設置圖片的位置。
rect的對象還有center,centerx,centery屬性。

屬性 作用
center 即矩形中心,返回的是矩形中心的座標
centerx 矩形x軸的中心,返回的是矩形x軸中心的x值
centery 矩形y軸的中心,返回的是矩形y軸中心的y值
top 矩形頂部
bottom 矩形底部
left 矩形左邊
right 矩形右邊

這些值都是可用修改的。

在指定位置繪製圖片元素

		""" 在指定位置繪製飛船"""
        self.screen.blit(self.image,self.rect)

blit()向屏幕添加圖片元素,self.image傳遞的是圖片,self.rect傳遞是矩形元素,通過rect的centerx和bottom屬性設置的矩形圖片在屏幕中的位置

事件響應

def check_keydown_events(event,ai_settings,screen,ship,bullets):
    # 響應按鍵 右方向鍵
    # 通過讀取event.key,檢查按下的是否是右箭頭鍵
    if event.key == pygame.K_RIGHT:
        # 向右移動飛船
        # ship.rect.centerx += 1  飛船向右移動
        ship.moving_right = True
    elif event.key == pygame.K_LEFT:
        # 向左移動飛船
        # ship.rect.centerx -= 1
        ship.moving_left = True
    elif event.key == pygame.K_SPACE: # 設置開火指令
        fire_bullet(ai_settings, screen, ship, bullets)
    # 按下Q時退出遊戲
    elif event.key == pygame.K_q:
        sys.exit()

def check_keyup_events(event ,ship):
    # 響應鬆開
    if event.key == pygame.K_RIGHT:
        ship.moving_right = False
    elif event.key == pygame.K_LEFT:
        ship.moving_left = False
        
def check_events(ai_settings,screen,ship,bullets):
    """ 響應按鍵和鼠標事件,在這個方法中指定需要檢查的事件 """
    # 事件都是通過pygame.event.get()方法獲取
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
         # 每次按鍵都會註冊一個KEYDOWN
         # 檢測到KEYDOWN事件時,我們需要檢查按下的是否是特定的鍵
        elif event.type == pygame.KEYDOWN:
            check_keydown_events(event,ai_settings,screen,ship,bullets)
        # 鬆開方向鍵時觸發的事件,將moving_right or moving_left設爲false
        elif event.type == pygame.KEYUP:
            check_keyup_events(event,ship)

簡單的講,就是按某個鍵,pygame檢測到這個鍵被觸發,然後找到對應的處理方法,然後觸發相應的響應事件。
這裏就是控制飛船的移動,也就是修改飛船的位置參數。
有按鍵按下事件,鬆開事件,單擊按動事件

將子彈設置成從飛船頂部發出

        # 設置子彈的位置,位於飛船的正上方。
        self.rect.centerx = ship.rect.centerx
        self.rect.top = ship.rect.top

理解:pygame中元素的佈局其實是相對佈局。將A元素的rect參數設置成B元素的rect,則B元素是相對於A元素的佈局位置

創建元素編組,存儲生成的元素
    # 創建一個用於存儲子彈的編組,存儲所有有效的子彈,
    # 管理髮射出去的子彈
    bullets = Group()
    # 創建一個空編組,用於存儲全部外星人
    aliens=Group()

其實就是將元素建個數組存起來,方便在需要的查找到該元素。

飛船開火事件

這種開火事件其實就是按一下空格生成一顆子彈,並且讓子彈移動。

    elif event.key == pygame.K_SPACE: # 設置開火指令
        fire_bullet(ai_settings, screen, ship, bullets)
def fire_bullet(ai_settings, screen, ship, bullets):
    # 如果還沒有到達限制,就發射一顆子彈
    # 創建一顆子彈,並將其加入到編組bullets中
    # 按下空格時,發射子彈,並且限制子彈數量
    if len(bullets) < ai_settings.bullets_allowed:
        new_bullet = Bullet(ai_settings, screen, ship)
        bullets.add(new_bullet)

感想

這樣的遊戲開發其實非常簡單,就是添加幾個元素,然後通過修改它的位置屬性來實現它的移動。
對動態的理解,遊戲的動態效果其實就是基於電腦高速的計算速度,每一次的繪製其實都是靜態的,但是通過非常快的速度對飛船的位置進行細微的修改,就實現了動態的效果,也就在不斷的循環刷新遊戲界面,所以一般電腦屏幕刷新率高的遊戲更流暢,電腦運行速度快的也更流暢。系統裏面其實有一個死循環,在不停的根據事件響應來刪掉舊的,更新添加。所以在遊戲開發中這個循環是必不可少的,而且最好是while循環來實現

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