【3】【MOOC】Python游戏开发入门-北京理工大学【第三部分-游戏开发之机制(事件处理机制)】
Pygame事件处理机制 1.Pygame事件处理机制简介


=================================================================================== 2.键盘事件及类型的使用




按键的修饰符
event.mod
修饰符的按位或运算
event.mod = KMOD_ALT | KMOD_SHITF 测试一下键盘的事件吧:
测试代码:
import pygame, sys pygame.init()
screen = pygame.display.set_mode((600, 400))
pygame.display.set_caption("Pygame事件处理") while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.unicode == "":
print("[KEYDOWN]:", "#", event.key, event.mod)
else:
print("[KEYDOWN]:", event.unicode, event.key, event.mod)
elif event.type == pygame.MOUSEMOTION:
print("[MOUSEMOTION]:", event.pos, event.rel, event.buttons)
elif event.type == pygame.MOUSEBUTTONUP:
print("[MOUSEBUTTONUP]:", event.pos, event.button)
elif event.type == pygame.MOUSEBUTTONDOWN:
print("[MOUSEBUTTONDOWN]:", event.pos, event.button) pygame.display.update()
PygameEventPrint.py
=================================================================================== 3.鼠标事件及类型的使用
鼠标事件及属性
pygame.event.MOUSEMOTION 鼠标移动事件
pygame.event.MOUSEBUTTONUP 鼠标键释放事件
pygame.event.MOUSEBUTTONDOWN 鼠标键按下事件
-------------------------------------------------------------
鼠标事件及属性
pygame.event.MOUSEMOTION 鼠标移动事件 •event.pos 鼠标当前坐标值(x,y),相对于窗口左上角
•event.rel 鼠标相对运动距离(X,Y),相对于上次事件
•event.buttons 鼠标按钮状态(a,b,c),对应于鼠标的三个键
------------------------------------------------------------
鼠标事件及属性
pygame.event.MOUSEBUTTONUP 鼠标键释放事件 •event.pos 鼠标当前坐标值(x,y),相对于窗口左上角
•event.button 鼠标按下键编号n 取值0/1/2,分别对应三个键
-------------------------------------------------------------
鼠标事件及属性
pygame.event.MOUSEBUTTONDOWN 鼠标键按下事件
•event.pos 鼠标当前坐标值(x,y),相对于窗口左上角 •event.button 鼠标按下键编号n 取值为整数,左键为1,右键为3,设备相关 用上面测试键盘事件的代码再测试一下鼠标事件吧!
=================================================================================== 4.壁球小游戏(鼠标型)
壁球小游戏(鼠标型)
需求:
鼠标可以通过左键摆放壁球,当释放按键时壁球运动
从需求到实现的关键要素:
•鼠标事件:对于鼠标键按下和释放的合理处置
-------------------------------------------------------------
壁球小游戏(鼠标型)
鼠标左键按下(左键按下拖拽小球)
鼠标左键释放(左键释放小球继续运动)
-------------------------------------------------------------
壁球小游戏(鼠标型)
局部处理:
增加一种交互方式要考虑
额外的局部处理
游戏逻辑的调试
源代码:
# 壁球小游戏(鼠标型)源代码
import pygame, sys pygame.init()
size = width, height = 600, 400
speed = [1, 1]
BLACK = 0, 0, 0
screen = pygame.display.set_mode(size, pygame.RESIZABLE) # 窗口大小可调 icon = pygame.image.load("PYG03-flower.png")
pygame.display.set_icon(icon)
pygame.display.set_caption("Pygame壁球")
ball = pygame.image.load("PYG02-ball.gif")
ballrect = ball.get_rect()
fps = 300
fclock = pygame.time.Clock()
still = False while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
speed[0] = speed[0] if speed[0] == 0 else (abs(speed[0]) - 1) * int(speed[0] / abs(speed[0]))
elif event.key == pygame.K_RIGHT:
speed[0] = speed[0] + 1 if speed[0] > 0 else speed[0] - 1
elif event.key == pygame.K_UP:
speed[1] = speed[1] + 1 if speed[1] > 0 else speed[1] - 1
elif event.key == pygame.K_DOWN:
speed[1] = speed[1] if speed[1] == 0 else (abs(speed[1]) - 1) * int(speed[1] / abs(speed[1]))
elif event.key == pygame.K_ESCAPE:
sys.exit()
elif event.type == pygame.VIDEORESIZE:
size = width, height = event.size[0], event.size[1]
screen = pygame.display.set_mode(size, pygame.RESIZABLE)
elif event.type == pygame.MOUSEBUTTONDOWN:
if event.button == 1:
still = True
elif event.type == pygame.MOUSEBUTTONUP:
still = False
if event.button == 1:
ballrect = ballrect.move(event.pos[0] - ballrect.left, event.pos[1] - ballrect.top)
elif event.type == pygame.MOUSEMOTION:
if event.buttons[0] == 1:
ballrect = ballrect.move(event.pos[0] - ballrect.left, event.pos[1] - ballrect.top)
if pygame.display.get_active() and not still:
ballrect = ballrect.move(speed)
if ballrect.left < 0 or ballrect.right > width:
speed[0] = - speed[0]
if ballrect.right > width and ballrect.right + speed[0] > ballrect.right:
speed[0] = - speed[0]
if ballrect.top < 0 or ballrect.bottom > height:
speed[1] = - speed[1]
if ballrect.bottom > height and ballrect.bottom + speed[1] > ballrect.bottom:
speed[1] = - speed[1] screen.fill(BLACK)
screen.blit(ball, ballrect)
pygame.display.update()
fclock.tick(fps)
壁球小游戏(鼠标型)源代码
===================================================================================
5.Pygame事件处理函数

事件处理的重要函数:
处理事件:
pygame.event.get()
pygame.event.poll()
pygame.event.clear()
操作事件队列:
pygame.event.set_blocked()
pygame.event.get_blocked()
pygame.event.set_allowed()
生成事件:
pygame.event.post()
pygame.event.Event() Pygame事件队列
事件队列(同时仅能存储128个事件 当队列满时,更多事件将被丢弃)
pygame.event.set_blocked()
pygame.event.set_allowed()
pygame.event.get_blocked()
•设置事件队列能够缓存事件的类型
-------------------------------------------------------------
事件处理函数: pygame.event.get()
•从事件队列中获得事件列表,即获得所有在队列的事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
•可以增加参数,获得某类或某些类事件:
pygame.event.get(type)
pygame.event.get(typelist) pygame.event.poll()
•从事件队列中获得一个事件
While True:
event= pygame.event.poll()
•事件获取将从事件队列中删除
•如果事件队列为空,则返回event.NOEVENT pygame.event.clear()
•从事件队列中删除事件,默认删除所有事件
•该函数与pygame.event.get()类似,区别仅是不对事件进行处理
•可以增加参数,删除某类或某些类事件:
pygame.event.clear(type)
pygame.event.clear(typelist)
-------------------------------------------------------------
事件处理函数: pygame.event.set_blocked(type or typelist)
•控制哪些类型事件不允许被保存到事件队列中
pygame.event.set_allowed(type or typelist)
•控制哪些类型事件允许被保存到事件队列中 pygame.event.get_blocked(type)
•测试某个事件类型是否被事件队列所禁止
•如果事件类型被禁止,则返回True,否则返回False pygame.event.post(Event)
•产生一个事件,并将其放入事件队列
•一般用于放置用户自定义事件(pygame.USEREVENT)
•也可以用于放置系统定义事件(如鼠标或键盘等),给定参数 pygame.event.Event(type, dict)
•创建一个给定类型的事件
•其中,事件的属性和值采用字典类型复制,属性名采用字符串形式
•如果创建已有事件,属性需要一致 测试事件产生机制
源代码:
import pygame, sys pygame.init()
screen = pygame.display.set_mode((600, 400))
pygame.display.set_caption("Pygame事件处理")
fps = 1
fclock = pygame.time.Clock()
num = 1 while True:
uevent = pygame.event.Event(pygame.KEYDOWN, {"unicode": 123, "key": pygame.K_SPACE, "mod": pygame.KMOD_ALT})
pygame.event.post(uevent)
num = num + 1
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.unicode == "":
print("[KEYDOWN {}]:".format(num), "#", event.key, event.mod)
else:
print("[KEYDOWN {}]:".format(num), event.unicode, event.key, event.mod) pygame.display.update()
fclock.tick(fps)
测试事件产生机制
【3】【MOOC】Python游戏开发入门-北京理工大学【第三部分-游戏开发之机制(事件处理机制)】的更多相关文章
- 【1】【MOOC】Python游戏开发入门-北京理工大学【第二部分-游戏开发之框架】
学习地址链接:http://www.icourse163.org/course/0809BIT021E-1001873001?utm_campaign=share&utm_medium=and ...
- 【4】【MOOC】Python游戏开发入门-北京理工大学【第三部分-游戏开发之机制(色彩与绘图)】
学习地址链接:http://www.icourse163.org/course/0809BIT021E-1001873001?utm_campaign=share&utm_medium=and ...
- 【2】【MOOC】Python游戏开发入门-北京理工大学【第三部分-游戏开发之机制(屏幕绘制机制)】
学习地址链接:http://www.icourse163.org/course/0809BIT021E-1001873001?utm_campaign=share&utm_medium=and ...
- [币严区块链]以太坊(ETH)Dapp开发入门教程之宠物商店领养游戏
阅读本文前,你应该对以太坊.智能合约有所了解,如果你还不了解,建议你先看以太坊是什么 除此之外,你最好还了解一些HTML及JavaScript知识. 本文通过实例教大家来开发去中心化应用,应用效果如图 ...
- python爬虫从入门到放弃(三)之 Urllib库的基本使用
官方文档地址:https://docs.python.org/3/library/urllib.html 什么是Urllib Urllib是python内置的HTTP请求库包括以下模块urllib.r ...
- #Python编程从入门到实践#第三章笔记
列表简介 1.什么是列表 列表:由一系列按也顶顺序排列的元素组成.元素之间可以没有任何关系. 列表:用方括号[]表示,并用逗号分隔其中元素.名称一般为复数 2.访问元素 (1)列表是有序集合 ...
- Cassandra开发入门文档第三部分(非规范化关系结构、批处理)
非规范化关系结构 第二部分我们讲了复合主键,这可以灵活的解决主从关系,也即是一对多关系,那么多对多关系呢?多对多关系的数据模型应该回答两个问题: 我跟着谁? 谁跟着我? -- 建表,我们发现这里有个不 ...
- 前端开发入门到进阶第三集【sublime 的package control ——install package报错】
参考:https://www.cnblogs.com/ae6623/p/5338049.html,解决2帮我解决问题. 解决Sublime包管理package control 报错 There are ...
- 前端开发入门到进阶第三集【js高度计算公式】
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...
随机推荐
- IOS使用Auto Layout中的VFL适配
做登录页面,之前做都是用frame做,今天想着用Auto Layout中的VFL来做.觉得做的效果还是可以的(自恋一下下). 首先看下效果图和标记图 自己在做的过程中也遇到了好多问题,不过也一个一个的 ...
- 在用户控件(ASCX)创建用户控件(ASCX)
"我建了两个ascx,ascxA,ascxBascxA中放了一个PlaceHold,ascxB中放了一个textBoxascxA在page_load中动态创建了5个ascxB但是页面上什么都 ...
- sublime下package control安装无效解决
使用快捷键:ctrl+`打开控制台执行如下命令 sublime2: import urllib2,os,hashlib; h = 'df21e130d211cfc94d9b0905775a7c0f' ...
- [linux] C语言Linux系统编程进程基本概念
1.如果说文件是unix系统最重要的抽象概念,那么进程仅次于文件.进程是执行中的目标代码:活动的.生存的.运行的程序. 除了目标代码进程还包含数据.资源.状态以及虚拟化的计算机. 2.进程体系: 每一 ...
- 撩课-Java每天5道面试题第25天
156.mvc:view-controller有什么作用? 当我们发送一个请求时,如果没有找到对应的mapping 则会对配置文件当中匹配mvc:view-controller 注意点:使用时要添加后 ...
- 自定义Jquery插件——由于项目需要,对页面中过长的文本进行截取,鼠标移上去有一个title的提示,所以做了一个Jquery过长文本处理的插件
由于项目需要,对页面中过长的文本进行截取,鼠标移上去有一个title的提示,所以做了一个Jquery过长文本处理的插件下面是代码: // 掉用方式支持 $('select').textBeauty(1 ...
- Oracle数据库基本操作 (六) —— 数据的导出与导入
一.cmd 下登录oracle数据库下的指定用户 方式一:命令行明文连接登录 打开cmd,输入:sqlplus/nolog 输入:conn username/passworld@数据库实例名 方式二: ...
- BZOJ1031 [JSOI2007]字符加密
Description 喜欢钻研问题的JS同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法 :把需要加密的信息排成一圈,显然,它们有很多种不同的读法.例如下图,可以读作 ...
- 前端动画小记---bilibili ( ゜-゜)つロ客户下载小动画
逛哔哩哔哩 ( ゜-゜)つロPC版的时候看到一个蛮有意思的动画,指导用户去下载客户端,于是摸索实现了一个. 原动画效果 可以看到,一个静止的小电视人,当鼠标移动到电视人身上时,电视人慢慢变身成为一个小 ...
- Word 关闭 Passive Voice
Sheryl prefers passive voice for some of her writing (such as business documents and correspondenc ...



