pygame庫寫遊戲——入門 遊戲中的關鍵——事件

1、Pygame對於事件的處理做法是把一系列的事件存放在一個隊列中,再逐個的進行處理。

2、事件檢索
pygam.event.get()處理所有的事件;
pygame.event.wait(),等到發生一個事件才繼續進行下去;
pygame.event.poll()較好一些,一旦調用,會根據當前的情形返回一個真實的事件或者一整個None(什麼都沒有)。

3、使用wait()來把所有的方法輸出:
程序如下:

# -*- coding: utf-8 -*-
"""
Created on Tue Nov 28 19:14:39 2017

@author: zhang
"""
import pygame
from pygame.locals import *
from sys import exit

pygame.init()
SCREEN_SIZE = (640, 480)
screen = pygame.display.set_mode(SCREEN_SIZE, 0, 32)

font = pygame.font.SysFont("arial", 16);
font_height = font.get_linesize()
event_text = []

while True:

    event = pygame.event.wait()
    event_text.append(str(event))
    #獲得時間的名稱
    event_text = event_text[-SCREEN_SIZE[1]//font_height:]
    #這個切片操作保證了event_text裏面只保留一個屏幕的文字

    if event.type == QUIT:
        pygame.quit()

    screen.fill((255, 255, 255))

    y = SCREEN_SIZE[1]-font_height
    #找一個合適的起筆位置,最下面開始但是要留一行的空
    for text in reversed(event_text):
        screen.blit( font.render(text, True, (0, 0, 0)), (0, y) )
        #以後會講
        y-=font_height
        #把筆提一行

    pygame.display.update()

event_text = event_text[-SCREEN_SIZE[1]//font_height:]
使用//來保證切片爲整數(因爲我的版本環境爲py3.6。

另外退出程序段仍舊使用pygme.quit(),但是我發現當使用窗口形式爲NOFRAME也就是無邊框的時候,沒有QUIT事件,可以用按鍵來退出程序。代碼如下

if event.type == KEYDOWN
  if event == K_SPACE
    pygame.quit()

4、 處理鍵盤事件
代碼如下

# -*- coding: utf-8 -*-
"""
Created on Tue Nov 28 21:22:20 2017

@author: zhang
"""
background_image_filename = 'sushiplate.jpg'

import pygame
from pygame.locals import *
from sys import exit

pygame.init()
screen = pygame.display.set_mode((640, 480), 0, 32)
background = pygame.image.load(background_image_filename).convert()

x, y = 0, 0
move_x, move_y = 0, 0

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
           pygame.quit()
        if event.type == KEYDOWN:
            #鍵盤有按下?
            if event.key == K_LEFT:
                #按下的是左方向鍵的話,把x座標減一
                move_x = -1
            elif event.key == K_RIGHT:
                #右方向鍵則加一
                move_x = 1
            elif event.key == K_UP:
                #類似了
                move_y = -1
            elif event.key == K_DOWN:
                move_y = 1
        elif event.type == KEYUP:
            #如果用戶放開了鍵盤,圖就不要動了
            move_x = 0
            move_y = 0

#計算出新的座標
x+= move_x
y+= move_y

screen.fill((0,0,0))
screen.blit(background, (x,y))
#在新的位置上畫圖
pygame.display.update()

KEYDOWN和KEYUP的參數描述:
①key – 按下或者放開的鍵值,是一個數字,估計地球上很少有人可以記住,所以Pygame中你可以使用K_xxx來表示,比如字母a就是K_a,還有K_SPACE和K_RETURN等。
②mod – 包含了組合鍵信息,如果mod & KMOD_CTRL是真的話,表示用戶同時按下了Ctrl鍵。類似的還有KMOD_SHIFT,KMOD_ALT。
③unicode – 代表了按下鍵的Unicode值,這個有點不好理解,真正說清楚又太麻煩,遊戲中也不太常用,說明暫時省略,什麼時候需要再講吧。

5、事件過濾
可以通過pygame.event.set_blocked(事件名)來完成。
如果需要過濾很多事件,可以傳遞一個列表,比如pygame.event.set_blocked(KEYDOWN,KEYUP),如果其中參數設定爲NONE,那麼所有的事件都被允許了。相對應的,我們使用pygame.event.set_allowed()來設定被允許的事件。

6、 產生事件
要想產生事件,必須先構造一個出來,然後再傳遞它:

my_event = pygame.event.Event(KEYDOWN,key=K_SPACE,mod=0,unicode=u'')
#也可以按下面的寫,更清晰明瞭
my_event = pygame.event.Event(KEYDOWN,{"key":K_SPACE,"mod":0,"unicode":u''})
pygame.event.post(my_event)
#這兩段代碼我不是很懂-_-

完全自定義一個全新事件,代碼演示爲

CATONKEYBOARD = USEREVENT+1
my_event = pygame.event.Event(CATONKEYBOARD, message="Bad cat!")
pgame.event.post(my_event)

#然後獲得它
for event in pygame.event.get():
    if event.type == CATONKEYBOARD:
        print event.message

但是我在運行之後出現了error: video system not initialized,經過嘗試,如果在程序前段加上pygame.init()對pygame庫進行一下初始化就能解決了,bingo!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章