上次我們試著寫了乙個最簡單的pygame程式並且解釋了乙個大概的框架,這次就pygame中也是遊戲中最關鍵的事件來展開。
理解事件
事件是什麼,其實從名稱來看我們久能想到些什麼,而且你所想到的基本就是事件的真正意思了。我們上乙個程式,會一直執行下去,知道你關閉視窗而產生乙個quit事件,pygame會接受使用者的各種操作(比如按鍵盤,移動滑鼠等)產生事件。事件隨時可能發生,而且量也可能會很大,pygame的做法是把一系列的事件存放乙個佇列裡,逐個的處理。
事件檢索
上個程式中,使用了pygame.event.get()來處理所有的事件,這好像開啟大門讓所有的人進入。如果我們使用pygame.event.wait(),pygame就會等到發生乙個事件才繼續下去,就好像有哨兵把守的門一樣,來乙個進乙個…一般遊戲中不太實用,因為遊戲往往是需要動態運作的;而另乙個方法pygame.event.poll()就好一些,一旦呼叫,它會根據現在的情形返回乙個真實的事件,或者乙個「什麼都沒有」。下表是乙個常用事件集:
事件 產生途徑 引數
quit 使用者按下關閉按鈕 none
ativeevent pygame被啟用或者隱藏 gain, state
keydown 鍵盤被按下 unicode, key, mod
keyup 鍵盤被放開 key, mod
mousemotion 滑鼠移動 pos, rel, buttons
mousebuttondown 滑鼠按下 pos, button
mousebuttonup 滑鼠放開 pos, button
joyaxismotion 遊戲手柄(joystick or pad)移動 joy, axis, value
joyballmotion 遊戲球(joy ball)移動 joy, axis, value
joyhatmotion 遊戲手柄(joystick)移動 joy, axis, value
joybuttondown 遊戲手柄按下 joy, button
joybuttonup 遊戲手柄放開 joy, button
videoresize pygame視窗縮放 size, w, h
videoexpose pygame視窗部分公開(expose) none
userevent 觸發了乙個使用者事件 code
下面我們寫乙個把所有方法輸出的一段**,它的結果是這樣的:
我們這裡使用了wait(),因為這個程式在有事件發生的時候動彈就可以了。還用了font模組來顯示文字,下面是源**:
import pygame
from pygame.locals import *
from sys import exit
from random import randint
screen_size = (640, 480)
pygame.init()
screen = pygame.display.set_mode(screen_size, 0, 32)
font = pygame.font.sysfont("arial", 16)
font_height = font.get_linesize()
event_text =
event_text = event_text[-screen_size[1]/font_height:]
if event.type == quit:
exit()
screen.fill((255, 255, 255))
y = screen_size[1]-font_height
for text in event_text:
screen.blit(font.render(text, true, (randint(0, 255), randint(0, 255), randint(0, 255))), (0, y))
y -= font_height
pygame.display.update()
處理滑鼠事件
mousemotion事件會在滑鼠動作時發生,它有三個引數:
buttons:乙個含有三個數字的元組,三個值分別代表左鍵、中鍵和右鍵,1就是按下了。
pos:滑鼠游標的位置
rel:代表了現在距離上次產生滑鼠事件時的距離
和mousemotion類似的,我們還有mousebuttondown和mousebuttonup兩個事件,看名字就知道什麼意思了。很多時候,你只需要知道滑鼠點下就可以了,那就可以不用上面那個比較強大(也比較複雜)的事件了。它們的引數為:
button:看清楚了少了個s,這個值代表了哪個按鍵被操作
pos:滑鼠游標的位置
處理鍵盤事件
鍵盤和遊戲手柄的事件比較類似,為keydown和keyup,下面有乙個例子來演示使用方向鍵移動一些東西。
# 計算出新的座標
x += move_x
y += move_y
screen.fill((0, 0, 0))
screen.blit(background, (x, y))
# 在新的位置上畫圖
pygame.display.update()
keydown和keyup的引數秒速如下:
key -按下或者放開的鍵值,是乙個數字,估計地球上很少有人可以記住,所以pygame中你可以使用k_***來表示,比如字母a就是k_a,還有k_space和k_return等。
mod -包含了組合鍵資訊,如果mod & kmod_ctrl是真值,表示使用者同時按下了ctrl鍵。類似的還有kmod_shift,kmod_alt。
unicode -代表了按下鍵的unicode值,這個自行google。
事件過濾
並不是所有的事件都需要處理的,就好像不是所有登門造訪的人都是我們歡迎的一樣。比如,俄羅斯方塊就無視你的滑鼠,而在遊戲場景切換的時候,你按什麼都是徒勞的。我們應該有乙個方法來過濾掉一些我們不感興趣的事件(當然我們可以不處理這些沒興趣的事件,但最好的方法還是讓它們根本不進入我們的事件佇列),我們使用pygame.event.set_blocked(事件名)來完成。如果有好多事件需要過濾,可以傳遞乙個列表,比如pygame.event.set_blocked([keydown, keyup]),如果你設定引數none,那麼所有的事件都被開啟了。與之相對的,我們使用pygame.event,set_allowed()來設定允許的事件。
產生事件
通常玩家做什麼,pygame就產生對應的事件就可以了,不過有的時候我們西藥模擬出一些事件來,不如錄影回放的時候,我們就要把使用者的操作再現一遍。
為了產生事件,必須先造乙個出來,然後再傳遞它:
# _*_coding:utf-8_*_
import pygame
from pygame.locals import *
me_event = pygame.event.event(keydown, )
pygame.event.post(me_event)
Python之pygame,從入門到精通(二)
上次我們試著寫了乙個最簡單的pygame程式並且解釋了乙個大概的框架,這次就pygame中也是遊戲中最關鍵的事件來展開。理解事件 事件是什麼,其實從名稱來看我們久能想到些什麼,而且你所想到的基本就是事件的真正意思了。我們上乙個程式,會一直執行下去,知道你關閉視窗而產生乙個quit事件,pygame會...
Python 學習筆記之pygame的安裝
介紹最方便的方法吧 網上有很多實用的 但是可能年頭太遠 不能用了 我是windows 3.6版本的 一 安裝pip 在cmd下輸入 python m pip version 如果有下面這個 就是有pip 可以直接安裝pygame了 如果沒有這一條的話 訪問 如果出現對話方塊,請儲存檔案 如果出現 將...
Python之pygame學習矩形區域(5)
在pygame中矩形區域這個模擬較特殊,在遊戲中,所有可見的元素都是以矩形區域來描述位置。可以從left,top,width和height值的組合建立rect。也可以從已經是rect或具有名為 rect 的屬性的python物件建立rect。任何需要rect引數的pygame函式也接受這些值中的任何...