python 外星人大戰 之實現遊戲主迴圈
阿新 • • 發佈:2019-02-05
在我們開始下一篇的內容之前,我們先來聊聊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
好了一個簡單的遊戲雛形就完成了,下一篇開始我們就開始寫我們的小遊戲邏輯了。