一、pygame事件

1.简介

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

QUIT,ACTIVEEVENT,KEYDOWN,KEYDOWN,MOUSEMOTION,MOUSEBUTTONUP,MOUSEBUTTONDOWN,JOYAXISMOTION,

JOYBALLMOTION,JOYHATMOTION........

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

查看pygame的文档是一种非常好的学习方式。

2.实时事件循环

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

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

while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
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:
key_flag = True
elif event.type == KEYUP:
key_flag = False
默认的话pygame不会重复地去响应一个被一直按住的键,只是在按键第一次被按下的时候响应一次,如果需要重复响应一个按键的话下面的操作:

pygame.key.set_repeat(10)
#参数是一个以毫秒为单位的值
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
MOUSEBUTTONDOWN里面的属性:

event.type == MOUSEBUTTONDOWN:
mouse_down = event.button
mouse_down_x,mouse_down_y = event.pos
MOUSEBUTTONUP里面的属性:

event.type == MOUSEBUTTONUP:
mouse_up = event.button
mouse_up_x,mouse_up_y = event.pos
二、设备轮询

在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()
我们可以设计一个打字测速小游戏来综合练习一下键盘的轮询:

import sys, random, time, pygame
from pygame.locals import *
'''
想要学习Python?Python学习交流群:1004391443满足你的需求,资料都已经上传群文件,可以自行下载!
'''
def print_text(font, x, y, text, color=(255,255,255)):
imgText = font.render(text, True, color)
screen.blit(imgText, (x,y))

#主程序
pygame.init()
screen = pygame.display.set_mode((600,500))
pygame.display.set_caption("Keyboard Demo")
font1 = pygame.font.Font(None, 24)
font2 = pygame.font.Font(None, 200)
white = 255,255,255
yellow = 255,255,0
color = 125,100,210

key_flag = False
correct_answer = 97
seconds = 10
score = 0
clock_start = 0
game_over = True

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

keys = pygame.key.get_pressed()
if keys[K_ESCAPE]:
sys.exit()

if keys[K_RETURN]:
if game_over:
game_over = False
score = 0
seconds = 11
clock_start = time.clock()

current = time.clock() - clock_start
speed = score * 6
if seconds-current < 0:
game_over = True
elif current <= 10:
if keys[correct_answer]:
correct_answer = random.randint(97,122)
score += 1

#清屏
screen.fill(color)

print_text(font1, 0, 20, "Try to keep up for 10 seconds...")

if key_flag:
print_text(font1, 450, 0, "you are keying...")

if not game_over:
print_text(font1, 0, 80, "Time: " + str(int(seconds-current)))

print_text(font1, 0, 100, "Speed: " + str(speed) + " letters/min")

if game_over:
print_text(font1, 0, 160, "Press Enter to start...")

print_text(font2, 0, 240, chr(correct_answer-32), yellow)

#更新
pygame.display.update()
在这个程序中,我们使用到了一些新的模块和函数,让我们来了解一下。

Random.randint(x,y);看名字知道这个函数的作用了,它可以返回一个x~y之间的随机数。

另外一个模块是time。time.clock()函数会返回从程序启动到现在为止的时间。

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。

同样我们可以设计一个小案例来熟悉一下鼠标轮询,比如当鼠标按下的时候 打印鼠标按的是左键还是右键,鼠标点击的位置,鼠标当前的坐标等等。这里就不给出实现代码了,感兴趣的可以自己实现一下。

---------------------

python游戏开发:pygame事件与设备轮询的更多相关文章

  1. 【Python游戏编程03--pygame事件与设备轮询】

    一.pygame事件 1.pygame事件可以处理游戏中的各种事情,完整的事件列表如下: QUIT,ACTIVEEVENT,KEYDOWN,KEYDOWN,MOUSEMOTION,MOUSEBUTTO ...

  2. 【python游戏编程之旅】第三篇---pygame事件与设备轮询

    本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 在上一篇博客中,我们学习了pygame中的IO.数据http://www.cnblogs.com/msxh/ ...

  3. Python -- 游戏开发 -- PyGame的使用

    弹球 pong.py import sys import pygame from pygame.locals import * class MyBallClass(pygame.sprite.Spri ...

  4. 【1】【MOOC】Python游戏开发入门-北京理工大学【第二部分-游戏开发之框架】

    学习地址链接:http://www.icourse163.org/course/0809BIT021E-1001873001?utm_campaign=share&utm_medium=and ...

  5. Python游戏开发:pygame游戏开发常用数据结构

    一.数组与列表 数组可以理解为简化的列表.像我们之前使用的pygame.sprite.Group这样的精灵组,也是一个列表.列表的元素是可变的,它具有添加.删除.搜索.排序等多种方法. 1.一维列表 ...

  6. Python游戏编程(Pygame)

    安装Pygame pip install pygame C:\Users> pip install pygame Collecting pygame Downloading https://fi ...

  7. Python游戏开发入门

    Pygame简介与安装 1.Pygame安装 pip install pygame2.检测pygame是否安装成功 python -m pygame.examples.aliens Pygame最小开 ...

  8. Python游戏开发——打砖块

    打砖块游戏向来大家也不会很陌生,今天来用python来开发一下这个小游戏 1.引用对应数据库 import pygame from pygame.locals import * import sys, ...

  9. Coco2d-x android win7 Python 游戏开发环境的搭建

    1:我用的电脑配置 win7 3 核 内存8G 桌面.一直想学习Coco2d 游戏开发,所以,一个星期后,需要找到,最终建立了一个良好的环境 2:我使用的版本号版本号,至于建筑android开发环境略 ...

随机推荐

  1. C/C++实现正负数四舍五入

    首先我们来看看 (int) 强制类型转换: #include <stdio.h> #include <stdlib.h> int main(){ int a = (int)(- ...

  2. iOS 多线程,ARC

    iOS自己创建的线程需要自己定时的创建autorelease pools,否则对象不能及时自动释放. 方法1是不对的,while中的对象会无法及时释放. 1:-(void)Thread{ @autor ...

  3. JPG文件格式

    开始:0xFF 0xD8 结束:0xFF 0xD9 文件的宽高:0xFF 0xC0 之后隔二个字节(0x11 0x08 这二个字节一般是固定的.描述这个块的长度.) 然后用四个字节来存储图片的高和宽0 ...

  4. TC SRM 597 DEV2

    第一次玩TC的SRM,只完成了一题,有点失落,不过还是要把每个问题都研究清楚才是我的本性,呵呵 第一题思路: 任意一个数,不断除掉2以后的剩下的数若相同则YES否则NO 第二题: 最开始判断字母个数是 ...

  5. 【转载pku】三十分钟掌握STL

    三十分钟掌握STL 这是本小人书.原名是<using stl>,不知道是谁写的.不过我倒觉得很有趣,所以化了两个晚上把它翻译出来.我没有对翻译出来的内容校验过.如果你没法在三十分钟内觉得有 ...

  6. 使用vue-cli启动项目出错

    Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的渐进式框架. Vue 只关注视图层, 采用自底向上增量开发的设计. Vue 的目标是通过尽可能简单的 API 实现响应的数据 ...

  7. MyBatis基本应用

    框架的概念: 框架(Framework)是一个提供了可重用的公共结构的半成品. 数据持久化: 数据持久化是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型的统称. ORM(Obj ...

  8. E20180109-E

    auxilary  adj. 辅助的; 备用的,补充的; 附加的; 副的;               n. 助动词; 辅助者,辅助人员; 附属机构,附属团体; 辅助设备; 

  9. [SDOI2011]消防(单调队列,树的直径,双指针)

     消防 2011年  时间限制: 2 s  空间限制: 256000 KB  题目等级 : 大师 Master   题目描述 Description 某个国家有n个城市,这n个城市中任意两个都连通且有 ...

  10. Mybatis Generator插件升级版

    一.目的: 1. *mapper.java 文件名称 改为*DAO.java2. mapper以及mapper.xml 重复执行,只会覆盖原模板方法,不会覆盖自定义方法3. 实体类添加中文注释 二.步 ...