咦,發生了什么事件?父與子的編程之旅 學習筆記(16)2018-09-25

第十八章 一種新的輸入——事件

事件(event)其實就是一種特殊的輸入~通過它,Python可以知道具體發生了什么事情,并由此展開一系列行動。

18.1 事件

事件到底是什么呢?我們舉些例子來理解:

(1)移動或點擊鼠標;

(2)按鍵;

(3)經過某段時間

這些都是事件。他們可以作為一種特殊的輸入依據,假如滿足了特定的時間,就會觸發事件驅動程序(event-driven program)。Windows操作系統(或其他GUI)就是很好的例子:打開計算機后,你不動,計算機是不可能自己進行操作的;但當你移動鼠標、敲擊鍵盤或等待足夠長時間,它就會有相應的反應(最后一個會啟動屏幕保護程序)。

我們再看看以下概念:

(1)事件循環(event loop):不斷尋找時間的特殊循環叫做事件循環,通常是最后的那個while循環。

(2)事件隊列(event queue):內存中存儲事件的部分叫做事件隊列,它是個列表,用來存儲要發生的所有事件。

(3)事件處理器(event handler):事件有很多,如鼠標可以產生mouse_move和mouse_click等事件。并不是每個事件都值得處理,所以程序中特別開辟出處理某個事件的部分,稱為事件處理器(如專門處理mouse_click的處理器)。

18.2 鍵盤事件

在Pygame中,使用KEYDOWN告訴電腦“我想按下鍵盤上的鍵就觸發其他事情發生”?,F在看下面一個例子:

上面是常用的退出游戲事件,下面是新建的keydown事件

一些常用的鍵盤事件:

KEYDOWN

KEYUP

可以在這里查看更多的pygame鍵盤事件。

18.3 鼠標事件

跟上面鍵盤事件一樣,這里同樣在elif中可以使用以下鼠標事件:

MOUSEMOTION : 鼠標移動

MOUSEBUTTONDOWN : 按下鼠標

MOUSEBUTTONUP : 松開鼠標

18.4 定時器事件

使用定時器事件,我們可以自定義事件以及它的生效時間(就像鬧鐘):

pygame.time.set_timer(EVENT_NUMBER, interval)

其中的EVENT_NUMBER代表用戶設置的事件編號(就像我玩“富甲天下”時用到的錦囊,在游戲里是用編號來表示的),用戶可以從24~32中選一個數字來代表;不過最好還是先用pygame.USEREVENT來代替免得出錯。

這里使用了自定的用戶事件,使球來回移動

18.5 另一個游戲——PyPongs

將前面所學的整合起來,咱們來玩新的游戲——PyPongs!

前后試錯8次,終于成功啦~
運行結果

這是一個不完整的游戲,接下來還會繼續補充~

記錄分數,并用pygame.font顯示

現在我們來補充游戲:

(1)建立font對象,告訴Pygame你想要的字體樣式和大小

(2)渲染文本,向字體對象傳入一個字符串,它會返回一個繪制這個文本的表面

(3)把這個表面移到顯示面

我們需要在paddle = MyPaddleClass([270, 400])后面加上:

# 創建字體對象

score_font = pygame.font.Font(None, 50)

# 渲染文本到表面surf,后面記得將int改為str

score_surf = score_font.render(str(score), 1, (0,0,0))

# 設置文本位置

score_pos = [10,10]

然后,因為在游戲運行的過程中,分數需要不斷改變,所以在事件循環內部,我們需要這行代碼,把含有分數文本的那個表面移到最上面來:

screen.blit(score_surf, score_pos)?

并且在font前面創建一個score = 0的變量,這樣就不會報錯了。

跟蹤分數

if self.rect.top <= 0 :

? ? self.speed[1] = - self.speed[1]

? ? score = score + 1

? ? score_surf = socre_font.render(str(score), 1, (0,0,0))

其實就是將上面的代碼加到if檢測中;但這樣運行后,會有命名空間的報錯,這時候我們需要重新給score、score_font還有socre_surf這三個變量進行全局命名:

def move(self):

? ? global score, score_font, score_surf

跟蹤還有幾條命

首先我們需要建立一個生命對象lives = 3。

然后設計:玩家漏了球后,lives減1,等待數秒,然后提供一個新球:

if myBall.rect.top >= screen.get_rect().bottom:

? ? lives = lives - 1

? ? pygame.time.delay(2000)

? ? myBall.rect.topleft = [50,50]

增加一個生命計數器

for i in range(lives):?

? ? width = screen.get_rect.width

? ? screen.blit(myBall.image, [width - 40 * i, 20])

思考一下,這個代碼要放在那兒?

因為它要進行循環計數功能,所以要放在while循環中;但要在screen.blit代碼行后。

游戲結束

最后在游戲結束時,我們要彈出消息提示,并終止再次產生球。

if myBall.rect.top >= screen.get_rect().bottom:

? ? lives = lives - 1

? ? if lives == 0 :

? ? ? ? final_text1 = "GAME OVER"

? ? ? ? final_text2 = "YOUR FINAL SCORE IS:????" + str(score)

? ? ? ? ft1_font = pygame.font.Font(None, 70)

# 居中文本

? ? ? ? ft1_surf = ft1_font.render(final_text1, 1, (0,0,0))?

? ? ? ? ft2_font = pygame.font.Font(None, 50)

? ? ? ? ft2_surf = ft2_font.render(final_text2, 1, (0,0,0))

? ? ? ? screen.blit(ft1_surf, [screen.get_width()/2 - \

? ? ? ? ? ? ? ? ? ? ? ? ? ? ft1_surf.get_width()/2, 100])

? ? ? ? screen.blit(ft2_surf, [screen.get_width()/2 - \

? ? ? ? ? ? ? ? ? ? ? ? ? ? ft2_surf.get_width()/2, 100])

? ? ? ? pygame.display.flip()

? ? ? ? done = True

? ? else: # Wait 2 seconds, then start the next ball

? ? ? ? pygame.time.delay(2000)

? ? ? ? myBall.rect.topleft = [(screen.get_rect().width) - 40 * lives, 20]

最終的PyPong代碼

最終的代碼有70多行,期間也試過有報錯,但還是克服啦

你學到了什么

在這一章,我們學到了以下內容:

(1)事件

(2)Pygame事件循環

(3)事件處理

(4)鍵盤、鼠標、定時器等事件

(5)pygame.font

小結

這一章也是中等燒腦的一章,不算太難,很多知識點都是以前學過的,滾雪球一樣來到我們面前,或許技能就是在這種一復一日地練習中掌握的吧。繼續~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,967評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,273評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,870評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,742評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,527評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,010評論 1 322
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,108評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,250評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,769評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,656評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,853評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,371評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,103評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,472評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,717評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,487評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,815評論 2 372

推薦閱讀更多精彩內容

  • 你走吧 回來幹什麼 就祘 全世界都歡迎你 都不該這樣草莽 默默地 把自己幹掉 淺淺的 踩幾個腳烙 緩緩的 寫幾段文...
    望舍閱讀 158評論 1 3
  • 存在的源頭 “谷神不死,是謂玄牝。玄牝之門,是謂天地根。綿綿若存,用之不勤。” 這段文字用齊豫橄欖樹的一句歌詞來理...
    閻耀永閱讀 391評論 1 2
  • DisUnity git:https://github.com/ata4/disunity UnityStudio...
    gttt閱讀 2,260評論 0 0
  • Android狀態欄顏色修改 名稱糾結 參考了一系列的文章,開頭都會闡述一下沉浸式狀態欄和狀態欄著色的區別。這里我...
    獅_子歌歌閱讀 399評論 0 1