Pygame(九)按键事件(2)

前情提要

前情提要

作业解析

完整代码

# /usr/bin/python3

# Author: 爱编程的章老师# @Time: 2021/1/7 0007# E-mail: Bluesand2010@163.comimport pygame, sys, timefrom random import randint

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

# 挡板矩形    board = pygame.Rect(350, 550, 100, 10)    board_color = 139, 90, 43    pygame.draw.rect(s, board_color, board)

# 小球矩形    bx = randint(0, 780)    ball = pygame.Rect(bx, 100, 20,20)    ball_color = 255, 255, 255    pygame.draw.ellipse(s, ball_color, ball)

    pygame.display.update()    pygame.key.set_repeat(pygame.KEYDOWN)while 1:for event in pygame.event.get():if event.type == pygame.QUIT:                sys.exit()        ball.move_ip(0, 2)        keys = pygame.key.get_pressed()if keys[pygame.K_LEFT]:            board.move_ip(-5, 0)elif keys[pygame.K_RIGHT]:            board.move_ip(5, 0)

if ball.bottom - board.top > 5:            print("你失败了,游戏结束")breakif ball.colliderect(board):            print("你胜利了")break

        s.fill((0, 0, 0))        pygame.draw.rect(s, board_color, board)        pygame.draw.ellipse(s, ball_color, ball)        pygame.display.update()        time.sleep(0.01)

if __name__ == '__main__':    homework()

几点说明:

  • 画小球,用了ellipse().是因为这样操作起来比较方便.不然,还要计算小球的球心,虽然只需要用一个rect.center()就可以解决.

  • 按键检测用了key.get_presssed(). 更简洁一点.用事件的话,还要先检测有没有按下按键,再检测按键是不是我们想要的.

  • 这0.01秒更新一次.相当于一秒100帧

本节提要

本节提要

内容详解

组合按键

上节课,我们学会了对单个按键的响应.今天我们来学习一下组合键(多键)响应

示例: 按ALT + F4 来关闭程序

代码:

def combo_keydown():    pygame.init()    s = pygame.display.set_mode((800, 600))while 1:for event in pygame.event.get():if event.type == pygame.QUIT:                sys.exit()        keys = pygame.key.get_pressed()if keys[pygame.K_LALT] or keys[pygame.K_RALT] and keys[pygame.K_F4]:            sys.exit()

备注:

  • 功能键alt 与 ctrl 是分左右的.不要直接用K_ALT 与 K_CTRL 来判断

  • 这里用key.get_pressed()方法比直接用事件更简洁.因为key.get_pressed()是专业的_

在我们开发游戏的时候,组合键的功能还是比较常用的.比如我们需要让人物同时按下U + I 时发一个大招.
示例代码

def combination_key2():    pygame.init()    s = pygame.display.set_mode((800, 600))

while 1:for event in pygame.event.get():if event.type == pygame.QUIT:                sys.exit()        keys = pygame.key.get_pressed()if keys[pygame.K_u] and keys[pygame.K_i]:            print("我发动了大招,就问你怕不怕")

效果图:

image.png

鼠标响应

鼠标点击事件

event == pygame.MOUSEBUTTONDOWN

属性:button

意义
1 左键单击
2 滚轮单击
3 右键单击
4 滚轮朝上滚
5 滚轮朝下滚

示例:

# 鼠标单击事件def mouse_click():    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.MOUSEBUTTONDOWN:if event.button == 1:                    print("左键单击")elif event.button == 2:                    print("按下滚轮键")elif event.button == 3:                    print("按下右键")elif event.button == 4:                    print("滚轮朝上")elif event.button == 5:                    print("按下朝下")

属性:pos
获取鼠标点击时的坐标

示例:

print("鼠标点击的位置:", event.pos)

鼠标移动

event.type == pygame.MOUSEMOTION

属性:pos 实时获取鼠标当前位置的坐标
属性:rel 鼠标的移动逻辑(dx,dy)从上一个记录点到这一个记录点的坐标变化情况
属性:buttons:三个按键的按下情况的三元组.分别表示左中右三个按键.当按下时,值为1,松开时值为0
举例:按下左键时移动,buttons的值(1,0,0),按下右键的时候移动,buttons的值为(0,0,1)

示例:

# 鼠标移动def mouse_motion():    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.MOUSEMOTION:                print(event.pos)                print(event.rel)                print(event.buttons)

松开鼠标

event.type == pygame.MOUSEBUTTONUP:

用法同鼠标点击

# 鼠标松开事件def mouse_up():    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.MOUSEBUTTONUP:                print(event.button)                print(event.pos)

鼠标拖拽

举例:
鼠标左键按下后拖拽效果
代码:

def mouse_drag():'''鼠标左键拖拽效果'''    pygame.init()    s = pygame.display.set_mode((800, 600))    start_pos = 0, 0    end_pos = 0, 0    drag_flag = False    width, height = 0, 0    rect_color = GREEN = 0, 255, 0while 1:for event in pygame.event.get():if event.type == pygame.QUIT:                sys.exit()if event.type == pygame.MOUSEBUTTONUP and event.button == 1:                drag_flag = False                s.fill((0,0,0))                pygame.display.update()if not drag_flag and event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:                drag_flag = True                start_pos = event.posif drag_flag and event.type == pygame.MOUSEMOTION:                end_pos = event.posif start_pos[0]  > end_pos[0]:                    left = end_pos[0]else:                    left = start_pos[0]if start_pos[1] > end_pos[1]:                    top = end_pos[1]else:                    top = start_pos[1]                width = abs(start_pos[0] - end_pos[0])                height = abs(start_pos[1] - end_pos[1])                s.fill((0,0,0))                pygame.draw.rect(s, rect_color, (left, top, width, height), 1)                pygame.display.update()

效果图:

鼠标拖拽效果图

代码解析:

  • 鼠标拖拽的起点:drag_flag为假且鼠标左键点击

  • 鼠标拖拽的终点:drag_flag为真,且鼠标移动

  • 放弃拖拽:drag_flag为假

当处于拖拽终点时,要画矩形.
当处于放弃拖拽时,要清空屏幕

作业

  1. 随心圆:以鼠标左键点击为圆心,画一个半径50 ,颜色随机的圆

  2. 点不中的矩形:在屏幕中初始化一个矩形,当鼠标点击这个矩形时,矩形移动到鼠标没有点到的地方.
    备注:判断一下点有没有在矩形内,可以用矩形的collidepoint(x,y) 当点(x,y)在矩形内时返回True,否则返回False

  3. 组合键:以上两个的游戏关闭方法都是用组合键:alt + F4实现

  4. 复制与粘贴:屏幕上初始一个矩形, 当鼠标框选中矩形时,按CTRL + C 复制 这个矩形,然后在鼠标下一次点击时以鼠标点击处为矩形的中心粘贴这个矩形

后记

终于把按键的响应讲完了.今天的内容比较多,也比较有用.是我们以后常用的内容.请多多练习巩固

判断按键值_Pygame(九)按键事件(2)相关推荐

  1. 在MTK6572当中如何增加一个新按键,而且此按键值在虚拟按键当中可以使用

    在物理按键当中如果你要增加一个新按键: [Description] How to add a new key on android ICS/ICS2   [Solution] 1.在DCT tool ...

  2. LINUX内核下跑单片机按键,S3C2440下linux按键驱动编写及测试程序

    module_init(dev_init);//模块初始化,仅当使用 insmod/podprobe 命令加载时有用,如果设备不是通过模块方式加载,此处将不会被调用 module_exit(dev_e ...

  3. 判断按键值_ALIENTEK 阿波罗 STM32F767 开发板资料连载第七章 按键输入实验

    1)实验平台:alientek 阿波罗 STM32F767 开发板2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第七章 按键输入实验 上 ...

  4. linux驱动的中断函数,嵌入式Linux驱动开发(四)——字符设备驱动之中断方式以及中断方式获取按键值...

    之前我们完成了关于通过查询的方式获取按键键值的驱动程序,可以参考:嵌入式Linux开发--裸板程序之中断控制器. 虽然读取键值没有什么问题,但是测试程序占用CPU过高,一直在不断的查询,资源消耗过大, ...

  5. 事件——事件绑定||事件函数传参||事件修饰符||按键修饰符||自定义按键修饰符

    事件绑定 <!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8& ...

  6. 矩阵键盘数 码管显示多位数 c语言,4×4矩阵键盘数码管显示按键值程序

    4×4矩阵键盘数码管显示按键值程序本文引用地址:http://www.eepw.com.cn/article/201607/294422.htm //电路说明如下. //单片机:使用51系列兼容的即可 ...

  7. android模拟全局按键,android命令行模拟输入事件(文字、按键、触摸等)

    前言 通过adb shell input可以模拟android各种输入事件,比如文字.按键.触摸等等. adb shell input Usage: input [] [...] The source ...

  8. 51单片机怎么显示当前时间_(进阶篇)51单片机之按键控制蜂鸣器、数码管、按键值移位显示...

    一.实操演示- 按键控制蜂鸣器 1.图文详细 独立按键硬件电路 蜂鸣器硬件电路 2.连接方式: J20的第3号引脚连接到J7引脚,即P15连接J7. J29的第7.8号引脚连接到JP1的第1.2号引脚 ...

  9. python字典按键值排序_在Python中按键或值按升序和降序对字典排序

    python字典按键值排序 Problem Statement: Write a Python program to sort (ascending and descending) a diction ...

最新文章

  1. python采集第一步
  2. Virtio:针对 Linux 的 I/O 虚拟化框架
  3. IP地址、子网掩码和地址分类
  4. boost::transpose_graph用法的测试程序
  5. python 机器学习管道_构建机器学习管道-第1部分
  6. block与inline,inline和inline-block,块级和行内元素,行内替换和行内非替换元素
  7. 关于hibernate的mappedBy的使用:
  8. HttpClient4
  9. IE插件技术 BHO C# IE 插件
  10. Java SSL HTTPS进行双重认证开发实践
  11. 【运维】在阿里云服务器上给Ubuntu安装桌面系统
  12. 根据年月日计算今天是一年中的第几天
  13. C语言之素数判断及输出(1~100所有的素数)
  14. 20200404-斜坡补偿
  15. Access转出到Mysql,咱自己动手丰衣足食.. -- 纯JS代码
  16. 高效程序员系列 别做机器人——让工作自动化
  17. Mathematica对函数表达式求导并设置为新的自定义函数
  18. 数据结构 - 树、常用树分类
  19. 人工智能+医疗与生命科学行业研究报告
  20. 哈工大计算机网络第二章——应用层复习

热门文章

  1. 系统架构设计师 - 软件架构设计 - 特定领域软件架构DSSA(Domain Speciffic Softwore Architecture)
  2. css隐藏滚动条、兼容
  3. 学java要算法吗_学习java不可不知的几种算法
  4. Java错误提示框口怎么使用_如何在Swing中显示错误消息对话框?
  5. C/C++ getchar函数 - C语言零基础入门教程
  6. Python int函数 - Python零基础入门教程
  7. React之组件与模块
  8. BugkuCTF-MISC题linux与linux2
  9. 乐橙本地录像回放不了_乐橙智能锁来告诉你:你家门真的安全吗?
  10. xrdpdf卡片在哪可下载_暑假学习英语字母,就是这样简单(附可打印字母卡下载)...