pygame之事件與設(shè)備輪詢

一榨了、pygame事件
1.簡(jiǎn)介
pygame事件可以處理游戲中的各種事情。其實(shí)在前兩節(jié)的博客中,我們已經(jīng)使用過(guò)他們了执泰。如下是pygame的完整事件列表:
QUIT

ACTIVEEVENT;
KEYDOWN渡蜻;
MOUSEMOTION术吝;
MOUSEBUTTONUP;
MOUSEBUTTONDOWN茸苇;
JOYAXISMOTION排苍;
JOYBALLMOTION;
JOYHATMOTION........
image.gif

更多的事件可以去查pygame的文檔学密。http://www.pygame.org/docs/index.html

2.實(shí)時(shí)事件循環(huán)

pygame中的事件處理是放在一個(gè)實(shí)時(shí)的循環(huán)中來(lái)完成的淘衙。將代碼都放在一個(gè)while True的循環(huán)中,但是這樣會(huì)造成死循環(huán)腻暮,所以在里面加一句sys.exit()來(lái)退出幔翰。

for event in pygame.event.get()
image.gif

上面的代碼將會(huì)創(chuàng)建當(dāng)前等待處理的事件的一個(gè)列表,然后使用for循環(huán)來(lái)遍歷里面的事件西壮。這樣遗增,我們將會(huì)根據(jù)事件產(chǎn)生的順序依次地進(jìn)行不同的操作。常見的事件是按鍵按下款青,按鍵釋放以及鼠標(biāo)移動(dòng)做修。通常需要最先處理QUIT事件(在用戶關(guān)閉窗口的時(shí)候會(huì)產(chǎn)生該事件。)

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()    

[圖片上傳中...(image-70da96-1549802471486-9)]

3.鍵盤事件

鍵盤事件包括最典型的keyup 和 keydown 當(dāng)按鍵按下的時(shí)候響應(yīng)KEYDOWN事件,按鍵彈起的時(shí)候響應(yīng)KEYDOWN事件饰及。通痴崤鳎可以設(shè)置一個(gè)事件變量,然后根據(jù)keyup或者keydown給它賦不同的值燎含。

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            sys.exit()
        elif event.type == KEYDOWN:
            print(event.unicode)
            key_flag = True
        elif event.type == KEYUP:
            print(event.unicode)
            key_flag = False

[圖片上傳中...(image-aff6bd-1549802471486-8)]

默認(rèn)的話pygame不會(huì)重復(fù)地去響應(yīng)一個(gè)被一直按住的鍵宾濒,只是在按鍵第一次被按下的時(shí)候響應(yīng)一次,如果需要重復(fù)響應(yīng)一個(gè)按鍵的話下面的操作:

pygame.key.set_repeat(10)
#參數(shù)是一個(gè)以毫秒為單位的值

[圖片上傳中...(image-99b333-1549802471486-7)]

4.鼠標(biāo)事件

pygame支持一些鼠標(biāo)事件屏箍,他們包括MOUSEMOTION,MOUSEBUTTONUP,MOUSEBUTTONDOWN.

在MOUSEMOTION中包含了一些屬性:event.pos,event.rel,event.buttons

for event in pygame.event.get():
        if event.type == MOUSEMOTION:
             mouse_x,mouse_y = event.pos
             move_x,move_y = event.rel

[圖片上傳中...(image-f8f171-1549802471486-6)]

MOUSEBUTTONDOWN里面的屬性:

event.type == MOUSEBUTTONDOWN:
            mouse_down = event.button
            mouse_down_x,mouse_down_y = event.pos

[圖片上傳中...(image-b22130-1549802471486-5)]

MOUSEBUTTONUP里面的屬性:

event.type == MOUSEBUTTONUP:
            mouse_up = event.button
            mouse_up_x,mouse_up_y = event.pos

[圖片上傳中...(image-cfb88b-1549802471486-4)]

二绘梦、設(shè)備輪詢

在pygame中除了pygame事件,還可以使用設(shè)備輪詢的方法來(lái)檢測(cè)是否有事件發(fā)生赴魁。而且在python里面是沒有switch語(yǔ)句的卸奉,因此當(dāng)需要處理的事件過(guò)多時(shí),我們肯定不會(huì)去一條一條的去寫if...elif....else來(lái)匹配颖御,而設(shè)備輪詢正好解決了這個(gè)棘手的問(wèn)題榄棵。

1.輪詢鍵盤

在pygame中,使用pygame.key.get_pressed()來(lái)輪詢鍵盤接口潘拱。這個(gè)方法會(huì)返回布爾值的一個(gè)列表疹鳄,其中每個(gè)鍵一個(gè)標(biāo)志。使用鍵常量值來(lái)匹配按鍵芦岂,這樣的好處就是不必遍歷事件系統(tǒng)就可以檢測(cè)多個(gè)鍵的按下尚辑。例如:

keys = pygame.key.get_pressed()

if keys[K_ESCAPE]:

   pygame.quit()

   sys.exit()

[圖片上傳中...(image-e85b8-1549802471486-3)]

例1:

#導(dǎo)包
import pygame
from pygame.locals import *
import sys
import random

#初始化
pygame.init()

screen = pygame.display.set_mode((600,500))
pygame.display.set_caption("my games")
myfont = pygame.font.Font(None, 80)

black = 0, 0, 0
white = 255, 255, 255

#定義字符ASCII碼獲取字母
num = random.randint(97, 122)
char = chr(num)
txtImage = myfont.render(char, True, white)

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
#鍵盤事件
        elif event.type == KEYDOWN:
            print(event.unicode)
            print("鍵盤被按下")
        elif event.type == KEYUP:
            print("鍵盤被抬起")
        #鼠標(biāo)事件
        #鼠標(biāo)移動(dòng)
        elif event.type == MOUSEMOTION:
            #獲得坐標(biāo)位置
            print(event.pos)
            #獲取鼠標(biāo)移動(dòng)量
            print(event.rel)
        # elif event.type == MOUSEBUTTONDOWN:
        #     print(event.pos)
    #獲取鼠標(biāo)按鈕的狀態(tài)
    keys = pygame.key.get_pressed()

#設(shè)備輪詢
    if keys[K_ESCAPE]:
        pygame.quit()
        sys.exit()
    elif keys[num]:
        num = random.randint(97, 122)
        char = chr(num)
        txtImage = myfont.render(char, True, white)

    screen.fill(black)
    screen.blit(txtImage, (100,100))

    pygame.display.update()

[圖片上傳中...(image-405624-1549802471485-2)]

在這個(gè)程序中,我們使用到了一些新的模塊和函數(shù)盔腔,讓我們來(lái)了解一下杠茬。
Random.randint(x,y);看名字知道這個(gè)函數(shù)的作用了,它可以返回一個(gè)x~y之間的隨機(jī)數(shù)弛随。
2.輪詢鼠標(biāo)
同樣瓢喉,我們可以使用類似的方法去輪詢鼠標(biāo)事件。
這里有3個(gè)相關(guān)的函數(shù):
(1)pygame.mouse.get_pos()舀透,這個(gè)函數(shù)會(huì)返回鼠標(biāo)當(dāng)前的坐標(biāo)x,y栓票;
(2)pygame.mouse.get_rel();
rel_x ,rel_y = pygame.mouse.get_rel().利用這個(gè)函數(shù)可以讀取鼠標(biāo)的相對(duì)移動(dòng)。
(3)btn_one,btn_two,btn_three = pygame.mouse.get_pressed();
利用這個(gè)函數(shù)愕够,可以獲取鼠標(biāo)按鈕的狀態(tài)走贪。比如當(dāng)左鍵按下的時(shí)候btn_one 的值會(huì)被賦值為1,鼠標(biāo)按鍵彈起是會(huì)被賦值為0惑芭。

鼠標(biāo)拖拽橢圓移動(dòng)

import pygame
from pygame.locals import *
import sys
import math

pygame.init()

size = (800, 600)
screen = pygame.display.set_mode(size)
pygame.display.set_caption("my games")
myfont = pygame.font.Font(None, 80)

black = 0, 0, 0
white = 255, 255, 255
#圓心
circleHeart = (500, 400)
#半徑
radius = 80
#移動(dòng)設(shè)置為False
moving = False
while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == MOUSEMOTION:
            if moving:
                moveXY = event.rel
                circleHeart = (circleHeart[0] + moveXY[0],circleHeart[1]+moveXY[1])

        elif event.type == MOUSEBUTTONDOWN:
            length = (circleHeart[0]-event.pos[0])*(circleHeart[0]-event.pos[0])+(circleHeart[1]-event.pos[1])*(circleHeart[1]-event.pos[1])
            #開平方
            length = math.sqrt(length)
            if event.button ==1 and length < radius:
                moving = True
        elif event.type == MOUSEBUTTONUP:
            if event.button ==1:
                moving = False
    screen.fill(black)

    pygame.draw.circle(screen, white, circleHeart, radius, 3)
    pygame.display.update()

[圖片上傳中...(image-2f65f2-1549802471485-1)]

import pygame
import sys

# 初始化
pygame.init()

size = width,height = 1000,600 # 設(shè)置屏幕尺寸
WHITE = 255,255,255
BLACK = 0,0,0

screen = pygame.display.set_mode(size) # 創(chuàng)建surface對(duì)象
pygame.display.set_caption('畫圓及拖拽') # 創(chuàng)建標(biāo)題

# 圓心位置定義
position = size[0] // 2 , size[1] // 2

moving = False

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        if event.type == pygame.MOUSEBUTTONDOWN: # 獲取點(diǎn)擊鼠標(biāo)事件
            if event.button == 1: # 點(diǎn)擊鼠標(biāo)左鍵
                moving = True
        if event.type == pygame.MOUSEBUTTONUP: # 獲取松開鼠標(biāo)事件
            if event.button == 1: # 松開鼠標(biāo)左鍵
                moving = False
    if moving:
        position = pygame.mouse.get_pos() # 更新圓心位置為鼠標(biāo)當(dāng)前位置

    screen.fill(WHITE) # 填充屏幕
    # 畫各種尺寸顏色的圓
    pygame.draw.circle(screen, BLACK, position, 50, 1)

    # 刷新屏幕
    pygame.display.flip()

[圖片上傳中...(image-626642-1549802471485-0)]

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末坠狡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子遂跟,更是在濱河造成了極大的恐慌逃沿,老刑警劉巖婴渡,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異凯亮,居然都是意外死亡边臼,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門假消,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)柠并,“玉大人,你說(shuō)我怎么就攤上這事富拗【视瑁” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵媒峡,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我葵擎,道長(zhǎng)谅阿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任酬滤,我火速辦了婚禮签餐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘盯串。我一直安慰自己氯檐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開白布体捏。 她就那樣靜靜地躺著冠摄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪几缭。 梳的紋絲不亂的頭發(fā)上河泳,一...
    開封第一講書人閱讀 51,754評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音年栓,去河邊找鬼拆挥。 笑死,一個(gè)胖子當(dāng)著我的面吹牛某抓,可吹牛的內(nèi)容都是我干的纸兔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼否副,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼汉矿!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起备禀,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤负甸,失蹤者是張志新(化名)和其女友劉穎流强,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體呻待,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡打月,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蚕捉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奏篙。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖迫淹,靈堂內(nèi)的尸體忽然破棺而出秘通,到底是詐尸還是另有隱情,我是刑警寧澤敛熬,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布肺稀,位于F島的核電站,受9級(jí)特大地震影響应民,放射性物質(zhì)發(fā)生泄漏话原。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一诲锹、第九天 我趴在偏房一處隱蔽的房頂上張望繁仁。 院中可真熱鬧,春花似錦归园、人聲如沸黄虱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)捻浦。三九已至,卻和暖如春桥爽,著一層夾襖步出監(jiān)牢的瞬間默勾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工聚谁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留母剥,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓形导,卻偏偏與公主長(zhǎng)得像环疼,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子朵耕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容