Python之pygame,從入門到精通(二)

2021-09-29 17:09:28 字數 4304 閱讀 2630

上次我們試著寫了乙個最簡單的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函式也接受這些值中的任何...