Pygame(八)事件(1)
Pygame(八)事件(1)
前情提要
作业讲解
作业内容
自由落体
- 画一个棕色的扁长方形当地板
- 画一个蓝色小正方形(有能力的可以画球)当小球
- 小球自上而下.起始高度差200
- 每次落地后反弹高度为掉落高度的一半.直到反弹高度<5时停止
- 不考虑加速度.即速度在下落与反弹过程中假高是恒定的
思维分析
方块有两种运动:弹起(向上)与下落(向下)
向上运动按距离来算
向下运动按碰撞来算.
(也可以考虑用时间来算,下落的时间是弹起的时间的两倍)
运动结束的条件是弹起的距离<5
代码:
# /usr/bin/python3# Author: 爱编程的章老师
# @Time: 2021/1/6 0006
# E-mail: Bluesand2010@163.comimport sys
import pygame
import timedef homework():'''第七课作业:自落体''''''1. 画一个棕色的扁长方形当地板2. 画一个蓝色小正方形(有能力的可以画球)当小球3. 小球自上而下.起始高度差2004. 每次落地后反弹高度为掉落高度的一半.直到反弹高度<5时停止5. 不考虑加速度.即速度在下落与反弹过程中假高是恒定的'''pygame.init()s = pygame.display.set_mode((800, 600))# 地板: floorfloor = pygame.Rect(0, 550, 800, 50)floor_color = 139, 90, 43,pygame.draw.rect(s, floor_color, floor)# 球: ballball = pygame.Rect(390, 330,20,20)ball_color = 0, 0, 255pygame.draw.circle(s, ball_color, ball.center, 10)# 球的下面距离地板上面的距离: 反弹的距离等于下落高度的一半distance = (floor.top - ball.bottom)//2# 运动标记:是向上,还是向下dy = 1 # 表示向下, -1 表示向上print(distance)pygame.display.update()while 1:for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()ball.move_ip(0, dy)if dy == 1:if ball.colliderect(floor):dy = -1elif floor.top - ball.bottom >= distance:dy = 1distance //=2if distance < 5:breaks.fill((0, 0,0 ))pygame.draw.circle(s, ball_color, ball.center, 10)pygame.draw.rect(s, floor_color, floor)pygame.display.update()time.sleep(0.01)if __name__ == '__main__':homework()
效果图
作业反思:
从效果来看,已经初步达成了我们的作业要求.
但是从实际情况来看,这个效果并不太符合自由落体的真实效果,原因如下 :
- 自由落体的速度不是匀速的. 下落是加速,反弹是减速
- 反弹的时候也不是一半,而是受阻力影响,如果没有阻力,理论上可以无限反弹.
这些细致的效果,读者自行去思考.
本节提要
内容详情
事件是一个非常非常重要的内容.
它是我们处理人机交互的关键所在.
本节我们应该学会简单的事件读取与判断机制,以及简单的事件处理机制
读取事件
方法一:
pygame.event.get()
这种方法可以将当前的所有事件读取出来,形成一个生成器.以便我们遍历与处理
最经典的处理方法:
for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()
这里的event就是我们这节课的主角:事件(event)
事件的内容有很多,我们可以根据不同的事件选择不同的处理方法.
比如:pygame.QUIT事件就是表示按了窗口的那个X按钮.这个时候正常的操作逻辑是退出游戏.
但是我们经常可以看到一些游戏,当你按了X以后不会直接退出游戏,而是弹出一个框,询问你是否真的退出(或者要不要保存)等等.
因此,响应这个事件的,不一定必须是sys.quit(),也可以是其他代码.
pygame.QUIT
pygame.QUIT:退出(按了关闭窗口,X)事件
def event_quit():# 退出事件不退出哦pygame.init()s = pygame.display.set_mode((800, 600))while 1:for event in pygame.event.get():if event.type == pygame.QUIT:print("我就是不退出")
以上代码,在我们点击了窗口的X按钮的时候,会在控件台输出:我就是不退出.
然后,你会发现,这个窗口就关闭不了.
当然,在实际应中,我们不建议这么操作.
pygame.ACTIVEEVENT
pygame.ACTIVEEVENT: 鼠标有没有在窗口内事件, 有gain, state属性
当event.gain == 1时,鼠标在窗口内,event.gain == 0时鼠标在窗口外
def event_activeevent():pygame.init()s = pygame.display.set_mode((800, 600))while 1:for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()if event.type == pygame.ACTIVEEVENT:if event.gain == 1:print("窗口是激活的")elif event.gain == 0:print("窗口不是激活的")
pygame.KEYDOWN 和 pygame.KEYUP
pygame.KEYDOWN:键盘键按下时触发, 有 unicode, key,mod属性
pygame.KEYUP键盘键松开时触发, 有key, mod属性
控件方块移动小程序
def event_keydown():pygame.init()s = pygame.display.set_mode((800, 600))rect = pygame.Rect(400, 300, 100,100)pygame.draw.rect(s, (0,0, 255), rect)while 1:for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()# 如果是按键事件,是判断是按下了那个键if event.type == pygame.KEYDOWN:print(event.key)print(pygame.K_UP)if event.key == pygame.K_UP:rect.move_ip(0, -1)elif event.key == pygame.K_DOWN:rect.move_ip(0,1)elif event.key == pygame.K_LEFT:rect.move_ip(-1, 0)elif event.key == pygame.K_RIGHT:rect.move_ip(1, 0)s.fill((0,0,0))pygame.draw.rect(s, (0,0,255), rect)pygame.display.update()
以上程序实现的控件方块移动,按一次,只能移动一下,要想实现长按连续移动,需要使用pygame中专门检测按键的函数
pygame.key.set_repeat(pygame.KEYDOWN, 10)
参数说明:
- pygame.KEYDOWN:哪个事件要重复
- 重复的周期(多久重复一次)
def event_hold_keypressed():pygame.init()s = pygame.display.set_mode((800, 600))rect = pygame.Rect(400, 300, 100, 100)pygame.draw.rect(s, (0, 0, 255), rect)# 新增的代码pygame.key.set_repeat(pygame.KEYDOWN, 10)# 新增结束while 1:for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()if event.type == pygame.KEYDOWN:print(event.key)print(pygame.K_UP)if event.key == pygame.K_UP:rect.move_ip(0, -1)elif event.key == pygame.K_DOWN:rect.move_ip(0,1)elif event.key == pygame.K_LEFT:rect.move_ip(-1, 0)elif event.key == pygame.K_RIGHT:rect.move_ip(1, 0)s.fill((0, 0, 0))pygame.draw.rect(s, (0, 0, 255), rect)pygame.display.update()
注意:
按键的检测,我们还可以用另一种方式实现,专门用来处理按键事件
keys = pygame.key.get_pressed()
获取一个按键检测类.
用来判断指定的键是否被按下.如:方向上键被按了:
keys[pygame.K_UP] 的值为True
反之,如方向下键没有按
keys[pygame.K_DOWN] 的值为False
根据这种情况,我们可能实现控制方块的第二种实现:
def event_keydown2():pygame.init()s = pygame.display.set_mode((800, 600))rect = pygame.Rect(400, 300, 100, 100)pygame.draw.rect(s, (0, 0, 255), rect)# 新增的代码pygame.key.set_repeat(pygame.KEYDOWN, 10)# 新增结束while 1:for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()# 改动的代码keys = pygame.key.get_pressed()if keys[pygame.K_UP]:rect.move_ip(0, -1)elif keys[pygame.K_DOWN]:rect.move_ip(0, 1)elif keys[pygame.K_LEFT]:rect.move_ip(-1, 0)elif keys[pygame.K_RIGHT]:rect.move_ip(1, 0)# 改动结束s.fill((0, 0, 0))pygame.draw.rect(s, (0, 0, 255), rect)pygame.display.update()
pygame.KEYUP事件同KEYDOWN,这里不再详解.
须要注意的是KEUP事件是没有第二种实现的.请注意
作业
- 挡板接球
一个宽100 ,高10的棕色挡板,一个直径20的小球
小球从档板上方纵向距离200以上,左右位置随机的位置处以每次2单位,0.01秒一次的速度从上往下掉
用左右方向键(a 和 d也可以)来控制挡板左右移动来接住小球.
接住小不球,游戏胜利,
未接住,游戏失败.
未接住定义:当注球的最下方位于与挡板的最上方.3 个以上单位的时候
接住定义:当小球的圆心横坐标在挡板左右之间,小球与挡板相交,且小球的下方-挡板上方<=3
后记
事件的内容比较复杂
我们从最简单的基本的事件着手
Pygame(八)事件(1)相关推荐
- pygame 键盘事件
pygame 键盘事件 Pygame事件 事件类型及属性 事件处理函数 键盘事件及类型的使用 键盘事件及属性 按键的常量名称 按键的修饰符 按键的修饰符 代码测试 Pygame事件 pygame.ev ...
- Pygame Event事件模块(示例)
Pygame Event事件模块(示例) 原文链接 参考文章 事件(Event)是 Pygame 的重要模块之一,它是构建整个游戏程序的核心,比如鼠标点击.键盘敲击.游戏窗口移动.调整窗口大小.触发特 ...
- pygame按键事件
函数 pygame.key.get_focused() - 当窗口获得键盘的输入焦点时返回 True pygame.key.get_pressed() - 获取键盘上所有按键的状态 pygame.ke ...
- Pygame Event事件模块(详细示例)
Pygame Event事件模块(详细示例) 事件(Event)是 Pygame 的重要模块之一,它是构建整个游戏程序的核心,比如鼠标点击.键盘敲击.游戏窗口移动.调整窗口大小.触发特定的情节.退出游 ...
- PYGAME - Event 事件
pygame.event 用于处理事件与事件队列的 Pygame 模块. 函数 pygame.event.pump() - 让 Pygame 内部自动处理事件 pygame.event.get() ...
- 19、任务十八——事件委托、数组处理
0.题目 如图,模拟一个队列,队列的每个元素是一个数字,初始队列为空 有一个input输入框,以及4个操作按钮 点击"左侧入",将input中输入的数字从左侧插入队列中: 点击&q ...
- python键盘事件_Python之pygame学习键盘事件操作(9)
pygame键盘事件操作 ✕ 什么是事件呢?按下键盘某个按键,鼠标移动,包括点击关闭按钮都可以算是事件操作. pygame中事件模块是pygame.event,官方说法是用于与事件和队列进行交互. 不 ...
- python pygame模块按键延迟_Python之pygame学习键盘事件操作(9)
pygame键盘事件操作 ✕ 什么是事件呢?按下键盘某个按键,鼠标移动,包括点击关闭按钮都可以算是事件操作. pygame中事件模块是pygame.event,官方说法是用于与事件和队列进行交互. 不 ...
- python鼠标事件_Python之pygame的鼠标事件
鼠标 当显示模式设置后,事件队列就会开始收到鼠标事件.当按下和释放鼠标的按键时,会产生 pygame.MOUSEBUTTONDOWN和pygame.MOUSEBUTTONUP事件.这些事件包含一个bu ...
最新文章
- 移动端不利用HTML5和echarts开发一样可以实现大数据展示及炫酷统计系统(产品技术综合)...
- mybatis报错Type interface xxx.Dao is not...
- Mac与centos的ip配置
- c语言单链表超市出库,c语言-单链表(二)
- 教你一个快速视频处理的神器:Python moviepy
- 蓝桥杯51单片机之利用中断实现倒计数与停表【单片机开发初学者掌握案例】
- python classmethod static_python classmethod和 staticmethod的心得
- Note :提取图像空间频率、色度、亮度、饱和度Python—Opencv
- Vue-pdf预览pdf文档
- Linux下的C语言编程教程-Chinaitlab制作
- 【Windows】 rundll32.exe 在 Windows10 上的应用
- Java 网络编程:(七)UDP网络编程
- 微软软件测试部门裁剪,Windows 10稳定性太差是因为测试团队被裁撤?微软发布博客进行回应...
- 写给大家看的机器学习书【Part3】直观易懂的感知机学习算法PLA
- 被深信服上网行为管理器AC拒绝的操作如何正常访问
- c++数独游戏3.2
- 【Android】用Cubism 2制作自己的Live2D——官方App样例源码学习(4)!
- 蘑菇导航源码安装教程,wordpress导航主题免费下载[Wordpress主题]
- QT: skipping incompatible xx/xxx.dll when searching for -lxxx
- 作品合集的封面应该如何优化,作品合集封面如何制作