Pygame(八)事件(1)

前情提要

作业讲解

作业内容

自由落体

  1. 画一个棕色的扁长方形当地板
  2. 画一个蓝色小正方形(有能力的可以画球)当小球
  3. 小球自上而下.起始高度差200
  4. 每次落地后反弹高度为掉落高度的一半.直到反弹高度<5时停止
  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事件是没有第二种实现的.请注意

作业

  1. 挡板接球
    一个宽100 ,高10的棕色挡板,一个直径20的小球
    小球从档板上方纵向距离200以上,左右位置随机的位置处以每次2单位,0.01秒一次的速度从上往下掉
    用左右方向键(a 和 d也可以)来控制挡板左右移动来接住小球.
    接住小不球,游戏胜利,
    未接住,游戏失败.
    未接住定义:当注球的最下方位于与挡板的最上方.3 个以上单位的时候
    接住定义:当小球的圆心横坐标在挡板左右之间,小球与挡板相交,且小球的下方-挡板上方<=3

后记

事件的内容比较复杂
我们从最简单的基本的事件着手

Pygame(八)事件(1)相关推荐

  1. pygame 键盘事件

    pygame 键盘事件 Pygame事件 事件类型及属性 事件处理函数 键盘事件及类型的使用 键盘事件及属性 按键的常量名称 按键的修饰符 按键的修饰符 代码测试 Pygame事件 pygame.ev ...

  2. Pygame Event事件模块(示例)

    Pygame Event事件模块(示例) 原文链接 参考文章 事件(Event)是 Pygame 的重要模块之一,它是构建整个游戏程序的核心,比如鼠标点击.键盘敲击.游戏窗口移动.调整窗口大小.触发特 ...

  3. pygame按键事件

    函数 pygame.key.get_focused() - 当窗口获得键盘的输入焦点时返回 True pygame.key.get_pressed() - 获取键盘上所有按键的状态 pygame.ke ...

  4. Pygame Event事件模块(详细示例)

    Pygame Event事件模块(详细示例) 事件(Event)是 Pygame 的重要模块之一,它是构建整个游戏程序的核心,比如鼠标点击.键盘敲击.游戏窗口移动.调整窗口大小.触发特定的情节.退出游 ...

  5. PYGAME - Event 事件

    pygame.event 用于处理事件与事件队列的 Pygame 模块. 函数 pygame.event.pump()  -  让 Pygame 内部自动处理事件 pygame.event.get() ...

  6. 19、任务十八——事件委托、数组处理

    0.题目 如图,模拟一个队列,队列的每个元素是一个数字,初始队列为空 有一个input输入框,以及4个操作按钮 点击"左侧入",将input中输入的数字从左侧插入队列中: 点击&q ...

  7. python键盘事件_Python之pygame学习键盘事件操作(9)

    pygame键盘事件操作 ✕ 什么是事件呢?按下键盘某个按键,鼠标移动,包括点击关闭按钮都可以算是事件操作. pygame中事件模块是pygame.event,官方说法是用于与事件和队列进行交互. 不 ...

  8. python pygame模块按键延迟_Python之pygame学习键盘事件操作(9)

    pygame键盘事件操作 ✕ 什么是事件呢?按下键盘某个按键,鼠标移动,包括点击关闭按钮都可以算是事件操作. pygame中事件模块是pygame.event,官方说法是用于与事件和队列进行交互. 不 ...

  9. python鼠标事件_Python之pygame的鼠标事件

    鼠标 当显示模式设置后,事件队列就会开始收到鼠标事件.当按下和释放鼠标的按键时,会产生 pygame.MOUSEBUTTONDOWN和pygame.MOUSEBUTTONUP事件.这些事件包含一个bu ...

最新文章

  1. 移动端不利用HTML5和echarts开发一样可以实现大数据展示及炫酷统计系统(产品技术综合)...
  2. mybatis报错Type interface xxx.Dao is not...
  3. Mac与centos的ip配置
  4. c语言单链表超市出库,c语言-单链表(二)
  5. 教你一个快速视频处理的神器:Python moviepy
  6. 蓝桥杯51单片机之利用中断实现倒计数与停表【单片机开发初学者掌握案例】
  7. python classmethod static_python classmethod和 staticmethod的心得
  8. Note :提取图像空间频率、色度、亮度、饱和度Python—Opencv
  9. Vue-pdf预览pdf文档
  10. Linux下的C语言编程教程-Chinaitlab制作
  11. 【Windows】 rundll32.exe 在 Windows10 上的应用
  12. Java 网络编程:(七)UDP网络编程
  13. 微软软件测试部门裁剪,Windows 10稳定性太差是因为测试团队被裁撤?微软发布博客进行回应...
  14. 写给大家看的机器学习书【Part3】直观易懂的感知机学习算法PLA
  15. 被深信服上网行为管理器AC拒绝的操作如何正常访问
  16. c++数独游戏3.2
  17. 【Android】用Cubism 2制作自己的Live2D——官方App样例源码学习(4)!
  18. 蘑菇导航源码安装教程,wordpress导航主题免费下载[Wordpress主题]
  19. QT: skipping incompatible xx/xxx.dll when searching for -lxxx
  20. 作品合集的封面应该如何优化,作品合集封面如何制作

热门文章

  1. 13条建议,睡个好觉吧
  2. ACS Catal:导向基和配体协同促进的炔烃高选择性反式氢化乙酰氧基化反应
  3. 请问FXAA、FSAA与MSAA有什么区别?效果和性能上哪个好?
  4. for_each用法
  5. 周鸿祎访谈(二)(转)
  6. tp5 验证码不显示
  7. Git报错:fatal: Authentication failed for https://gitee.com
  8. java annotation 属性_java annotation 获取属性
  9. LIS3DH双击测试
  10. Html 文本框只读