1. 程式人生 > >python 外星人大戰 之實現遊戲主迴圈

python 外星人大戰 之實現遊戲主迴圈

在我們開始下一篇的內容之前,我們先來聊聊pygame中的事件處理。大家也知道,在一個遊戲中,我們要一直監聽使用者事件,根據相應的事件進行對應的邏輯處理。所以我們遊戲的應該是一直處理一個死迴圈中,知道使用者發出退出遊戲的事件。

在pygame中pygame.event模組就是用來和事件與佇列互動的。首先我們給大家看下這個模組有哪些東西:
這裡寫圖片描述

在我們的遊戲中我們要時時獲取事件佇列進行處理,那麼我們就要使用pygame.event.get()方法來獲取事件佇列:

pygame.event.get()
描述:get events from the queue
語法:get() -> Eventlist

該方法返回的是一個Eventlist,所以我們需要通過一個for迴圈來處理每一個事件,因此,我們遊戲的主迴圈程式碼應該是這樣寫的:

  while True:
            for event in pygame.event.get():
                do something

在pygame中每一個事件都有對應的事件型別標識,這些都是pygame定義的,我們可以通過這些事件型別來分門別類進行處理,在pygame中,常見的有以下事件型別:

QUIT             none
ACTIVEEVENT      gain, state
KEYDOWN          unicode, key, mod
KEYUP key, mod MOUSEMOTION pos, rel, buttons MOUSEBUTTONUP pos, button MOUSEBUTTONDOWN pos, button JOYAXISMOTION joy, axis, value JOYBALLMOTION joy, ball, rel JOYHATMOTION joy, hat, value JOYBUTTONUP joy, button JOYBUTTONDOWN joy, button VIDEORESIZE size, w, h VIDEOEXPOSE none
USEREVENT code

我們這次學習完成的小遊戲需要監聽鍵盤事件,所以我們在我們的程式中,我們可以監聽KEYDOWN,KEYUP事件,另外一個就是 QUIT 事件,這個事件是用來關閉程式的事件,是必不可少的。

那麼我們就實現一下這個事件監聽的最基礎的形式:

    while True:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    sys.exit()
                elif event.type == pygame.KEYDOWN:
                    pass
                elif event.type == pygame.KEYUP:
                    pass

在這裡我們處理了3類事件,當然了,我們還沒有相應的邏輯 程式碼。

對於event模組其他的用法我們不做過多瞭解,等我們需要使用的時候我們在詳細說明。

雖然在上面我們判斷了事件型別,對於我們的遊戲來說,我們需要知道使用者按下的是哪個鍵,才能做出對應的迴應。

pygame.key模組是專門用來處理鍵盤相關事件的,這裡我羅列一下按鍵對應的鍵碼:

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

好了一個簡單的遊戲雛形就完成了,下一篇開始我們就開始寫我們的小遊戲邏輯了。