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

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. 【1】【MOOC】Python游戏开发入门-北京理工大学【第二部分-游戏开发之框架】

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

  2. 【4】【MOOC】Python游戏开发入门-北京理工大学【第三部分-游戏开发之机制(色彩与绘图)】

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

  3. 【2】【MOOC】Python游戏开发入门-北京理工大学【第三部分-游戏开发之机制(屏幕绘制机制)】

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

  4. [币严区块链]以太坊(ETH)Dapp开发入门教程之宠物商店领养游戏

    阅读本文前,你应该对以太坊.智能合约有所了解,如果你还不了解,建议你先看以太坊是什么 除此之外,你最好还了解一些HTML及JavaScript知识. 本文通过实例教大家来开发去中心化应用,应用效果如图 ...

  5. python爬虫从入门到放弃(三)之 Urllib库的基本使用

    官方文档地址:https://docs.python.org/3/library/urllib.html 什么是Urllib Urllib是python内置的HTTP请求库包括以下模块urllib.r ...

  6. #Python编程从入门到实践#第三章笔记

      列表简介 ​​​1.什么是列表 列表:由一系列按也顶顺序排列的元素组成.元素之间可以没有任何关系. 列表:用方括号[]表示,并用逗号分隔其中元素.名称一般为复数 2.访问元素 (1)列表是有序集合 ...

  7. Cassandra开发入门文档第三部分(非规范化关系结构、批处理)

    非规范化关系结构 第二部分我们讲了复合主键,这可以灵活的解决主从关系,也即是一对多关系,那么多对多关系呢?多对多关系的数据模型应该回答两个问题: 我跟着谁? 谁跟着我? -- 建表,我们发现这里有个不 ...

  8. 前端开发入门到进阶第三集【sublime 的package control ——install package报错】

    参考:https://www.cnblogs.com/ae6623/p/5338049.html,解决2帮我解决问题. 解决Sublime包管理package control 报错 There are ...

  9. 前端开发入门到进阶第三集【js高度计算公式】

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

随机推荐

  1. ListView和BaseAdapter

    参考资料:http://www.runoob.com/w3cnote/android-tutorial-listview.html <LinearLayout xmlns:android=&qu ...

  2. [转]在windows service中使用timer

    本文转自:http://blog.csdn.net/sharpnessdotnet/article/details/7637180 一定要使用System.Timers.Timer timer 而不是 ...

  3. 关键业务系统的JVM参数推荐(2018仲夏版) (强烈推荐 唯品会)

    年更贴,因为两年里遇到的事情,一些想法变了.也补充了不少VJTools的内容,比如为伸手党们准备的jvm-options.sh. 在关键的业务系统里,除了继续追求技术人员最爱的高吞吐与低延时之外,系统 ...

  4. CSS之Flex 布局

    Flex 布局教程:语法篇 网页布局(layout)是 CSS 的一个重点应用. 布局的传统解决方案,基于盒状模型,依赖 display 属性 + position属性 + float属性.它对于那些 ...

  5. bzoj3697_FJ2014集训_采药人的路径_solution

    小道士的矫情之路: 点分治, 对于每个子树,处理其内经过根(重心)的路径,然后递归下一层子树: 如何处理经过根的合法路径 合法有两个要求: 把输入的0改成-1后 1.len=0; 2.存在一个点i使被 ...

  6. Bootstrap Modal多个弹出层顺序

    Bootstrap Modal多个弹出层顺序与div的顺序关联.后来者居上:即div靠后的modal层弹出的时候会在上层. 比如上图所示,模态框2弹出的时候会在模态框1上面.

  7. vue如何下载报表

    _export() { const _c = this.$createElement; this.$msgbox({ title: '请确认', showCancelButton: true, con ...

  8. 【Android】14.0 UI开发(五)——列表控件RecyclerView的瀑布布局排列实现

    1.0 列表控件RecyclerView的瀑布布局排列实现,关键词StaggeredGridLayoutManager LinearLayoutManager 实现顺序布局 GridLayoutMan ...

  9. Nodejs + express + ejs

    特性 <% %> 用于控制流 <%= %> 用于转义的输出 (会对数据字符进行转义) // 数据源 // app.js var tem={ title:"我是中间部分 ...

  10. can't start Git: git.exe

    can't start Git: git.exe :不能启动Git 这是因为Git的可执行文件的路径不正确,需要手动设置,. 找到设置Git的窗口 然后修改一下路径就行了 点击OK就可以了.