pygame之事件与设备轮询

一、pygame事件
1.简介
pygame事件可以处理游戏中的各种事情。其实在前两节的博客中,我们已经使用过他们了。如下是pygame的完整事件列表:
QUIT

ACTIVEEVENT;
KEYDOWN;
MOUSEMOTION;
MOUSEBUTTONUP;
MOUSEBUTTONDOWN;
JOYAXISMOTION;
JOYBALLMOTION;
JOYHATMOTION........
image.gif

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

2.实时事件循环

pygame中的事件处理是放在一个实时的循环中来完成的。将代码都放在一个while True的循环中,但是这样会造成死循环,所以在里面加一句sys.exit()来退出。

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

上面的代码将会创建当前等待处理的事件的一个列表,然后使用for循环来遍历里面的事件。这样,我们将会根据事件产生的顺序依次地进行不同的操作。常见的事件是按键按下,按键释放以及鼠标移动。通常需要最先处理QUIT事件(在用户关闭窗口的时候会产生该事件。)

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

[图片上传中...(image-70da96-1549802471486-9)]

3.键盘事件

键盘事件包括最典型的keyup 和 keydown 当按键按下的时候响应KEYDOWN事件,按键弹起的时候响应KEYDOWN事件。通常可以设置一个事件变量,然后根据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)]

默认的话pygame不会重复地去响应一个被一直按住的键,只是在按键第一次被按下的时候响应一次,如果需要重复响应一个按键的话下面的操作:

pygame.key.set_repeat(10)
#参数是一个以毫秒为单位的值

[图片上传中...(image-99b333-1549802471486-7)]

4.鼠标事件

pygame支持一些鼠标事件,他们包括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)]

二、设备轮询

在pygame中除了pygame事件,还可以使用设备轮询的方法来检测是否有事件发生。而且在python里面是没有switch语句的,因此当需要处理的事件过多时,我们肯定不会去一条一条的去写if...elif....else来匹配,而设备轮询正好解决了这个棘手的问题。

1.轮询键盘

在pygame中,使用pygame.key.get_pressed()来轮询键盘接口。这个方法会返回布尔值的一个列表,其中每个键一个标志。使用键常量值来匹配按键,这样的好处就是不必遍历事件系统就可以检测多个键的按下。例如:

keys = pygame.key.get_pressed()

if keys[K_ESCAPE]:

   pygame.quit()

   sys.exit()

[图片上传中...(image-e85b8-1549802471486-3)]

例1:

#导包
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("键盘被抬起")
        #鼠标事件
        #鼠标移动
        elif event.type == MOUSEMOTION:
            #获得坐标位置
            print(event.pos)
            #获取鼠标移动量
            print(event.rel)
        # elif event.type == MOUSEBUTTONDOWN:
        #     print(event.pos)
    #获取鼠标按钮的状态
    keys = pygame.key.get_pressed()

#设备轮询
    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)]

在这个程序中,我们使用到了一些新的模块和函数,让我们来了解一下。
Random.randint(x,y);看名字知道这个函数的作用了,它可以返回一个x~y之间的随机数。
2.轮询鼠标
同样,我们可以使用类似的方法去轮询鼠标事件。
这里有3个相关的函数:
(1)pygame.mouse.get_pos(),这个函数会返回鼠标当前的坐标x,y;
(2)pygame.mouse.get_rel();
rel_x ,rel_y = pygame.mouse.get_rel().利用这个函数可以读取鼠标的相对移动。
(3)btn_one,btn_two,btn_three = pygame.mouse.get_pressed();
利用这个函数,可以获取鼠标按钮的状态。比如当左键按下的时候btn_one 的值会被赋值为1,鼠标按键弹起是会被赋值为0。

鼠标拖拽椭圆移动

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
#移动设置为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 # 设置屏幕尺寸
WHITE = 255,255,255
BLACK = 0,0,0

screen = pygame.display.set_mode(size) # 创建surface对象
pygame.display.set_caption('画圆及拖拽') # 创建标题

# 圆心位置定义
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: # 获取点击鼠标事件
            if event.button == 1: # 点击鼠标左键
                moving = True
        if event.type == pygame.MOUSEBUTTONUP: # 获取松开鼠标事件
            if event.button == 1: # 松开鼠标左键
                moving = False
    if moving:
        position = pygame.mouse.get_pos() # 更新圆心位置为鼠标当前位置

    screen.fill(WHITE) # 填充屏幕
    # 画各种尺寸颜色的圆
    pygame.draw.circle(screen, BLACK, position, 50, 1)

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

[图片上传中...(image-626642-1549802471485-0)]

你可能感兴趣的:(pygame之事件与设备轮询)