判断按键值_Pygame(九)按键事件(2)

Pygame(九)按键事件(2)

前情提要

eff78fcb4f80b7831f4036535bf823a1.png

前情提要

作业解析

完整代码

# /usr/bin/python3

# Author: 爱编程的章老师
# @Time: 2021/1/7 0007
# E-mail: Bluesand2010@163.com
import pygame, sys, time
from 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("你失败了,游戏结束")
break
if 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帧

本节提要

d696cb8fa98bfff82b0e1ee3389280db.png

本节提要

内容详解

组合按键

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

示例: 按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("我发动了大招,就问你怕不怕")

效果图:

5e0ed03551b5dc814e44d3f59cb47c4a.png

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, 0
while 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.pos
if drag_flag and event.type == pygame.MOUSEMOTION:
end_pos = event.pos
if 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()

效果图:

1aab46cef81baaba62b50b11bfe1c67d.gif

鼠标拖拽效果图

代码解析:

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

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

  • 放弃拖拽:drag_flag为假

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

作业

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

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

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

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

后记

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/534268.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

动态添加input_前端提效必备:动态模版生成

前言在日常开发中&#xff0c;我们需要不停的新建页面和组件。以 Vue 项目为例&#xff0c;我们在新建一个页面的时候&#xff0c;需要经历一遍又一遍重复的过程&#xff1a;1、先新建一个文件夹2、然后新建一个 .vue 文件&#xff0c;写上 、", "" ],"…

在dom最前面插入_JavaScript中的DOM

1. 关于DOM文档对象模型(DocumentObject Model)&#xff0c;是基于浏览器编程的一套API接口&#xff0c;W3C出台的推荐标准&#xff0c;每个浏览器都有一些细微的差别&#xff0c;其中以Mozilla(火狐)的浏览器最与标准接近。通过 DOM&#xff0c;可以访问所有的 HTML元素&#…

当代最值得收藏的画家作品_当代最具潜力和收藏价值的十大画家

原标题&#xff1a;当代最具潜力和收藏价值的十大画家当代从事绘画的人成千上万&#xff0c;哪些名家作品值得收藏&#xff1f;当前都有哪些“潜力股”&#xff0c;相关专家综合市场分析&#xff0c;纯从艺术水准上列出值得收藏的“潜力股”&#xff0c;供爱好书画收藏的各界人…

mysql union all 别名_mysql union和union all

如下先创建2个表&#xff0c;aa bb.CREATE table aa(uid int(20) not null,name VARCHAR(30) not null)engineinnodb default charsetutf8mb4 COLLATE utf8mb4_general_ci;INSERT INTO aa(uid, name) VALUES (10, 张芳);INSERT INTO aa(uid, name) VALUES (11, 王凯);INSERT IN…

ci框架 乱码 mysql_mysql容器乱码问题

在docker-compose.yml文件中定义mysql导入utf-8的万国码services:mysql:image:mysql:5.7# command: [--character-set-serverutf8mb4, --collation-serverutf8mb4_unicode_ci]volumes:-./data/docker/mysql:/var/lib/mysql-./mysql/:/docker-entrypoint-initdb.d/-./conf/mys…

mysql分表 查询 优化_MySQL性能管理及架构(查询优化、分库分表)一遍文章搞定...

相关配置参数&#xff1a;slow_query_log # 启动停止记录慢查日志&#xff0c;慢查询日志默认是没有开启的可以在配置文件中开启(on)slow_query_log_file # 指定慢查日志的存储路径及文件&#xff0c;日志存储和数据从存储应该分开存储long_query_time # 指定记录慢查询日志SQL…

mysql临时表 清空_在数据库中临时表什么时候会被清除呢

展开全部我们仍使用 实验 05 中的环境&#xff0c;略去准备数据的过程。我们仍然使用两个会话&#xff0c;62616964757a686964616fe59b9ee7ad9431333433646439一个会话 run&#xff0c;用于运行主 SQL&#xff1b;另一个会话 ps&#xff0c;用于进行 performance_schema 的观察…

python医学图像分割_基于cv2的医学图像分割

例如&#xff0c;图像如下所示&#xff1a;import cv2import numpy as npimg cv2.imread("mdb168.pgm",0)import matplotlib.pyplot as pltplt.imshow(img, cmap"gray")我想删除图像中所有的伪影和不必要的部分。在为此&#xff0c;我首先对图像进行二值化…

ubuntu下使用python将ppt转成图片_Ubuntu下使用Python实现游戏制作中的切分图片功能...

本文实例讲述了Ubuntu下使用Python实现游戏制作中的切分图片功能。分享给大家供大家参考&#xff0c;具体如下&#xff1a;why拿到一个人物行走的素材&#xff0c;要用TexturePacker打包。TexturePacker打包后&#xff0c;助于游戏加载图片效率&#xff0c;且比较好管理。目前得…

世上最简单的mysql_mysql这样学最简单|基本操作上

这是数据库系列的第一篇文章&#xff0c;主要是对mysql的基本操作有一个了解。本系列的教程会先从基础出发&#xff0c;逐步过渡到优化。一、前提在这里我们不会从如何去安装数据库开始讲起&#xff0c;而是在安装完之后从操作数据库开始&#xff0c;文中所有的代码均在我自己的…

zabbix4.0添加mysql报警_Zabbix4.0系统告警“Zabbix server is not running”

第一步&#xff1a; 查看系统日志&#xff0c;进一步确认原因1 cat /var/log/zabbix/zabbix_server.log问题出现在数据库。第二步 数据库确认1 mysql -u root -p #root用户登陆数据库如果登录不成功&#xff0c;就看一下登录密码是否正确以及zabbix用户是否有权限登录数据库。1…

影响索引的mysql函数_mysql索引对排序的影响实例分析

本文实例讲述了mysql索引对排序的影响。分享给大家供大家参考&#xff0c;具体如下&#xff1a;索引不仅能提高查询速度&#xff0c;还可以添加排序速度&#xff0c;如果order by 后面的语句用到了索引&#xff0c;那么将会提高排序的速度。测试1、创建测试表&#xff1a;t15表…

php如何对 mysql 中text类型拆分存入一个数组_PHP递归实现无限级分类,可选返回字符串和数组...

正 文&#xff1a;在一些复杂的系统中&#xff0c;要求对信息栏目进行无限级的分类&#xff0c;以增强系统的灵活性。那么PHP是如何实现无限级分类的呢&#xff1f;我们在本文中使用递归算法并结合mysql数据表实现无限级分类。递归&#xff0c;简单的说就是一段程序代码的重复调…

python 开发框架 ant_Golang/python语言开发的分布式游戏服务器框架 mqant

软件介绍mqantmqant 是一款基于 Golang 语言的简洁&#xff0c;高效&#xff0c;高性能的分布式游戏服务器框架&#xff0c;研发的初衷是要实现一款能支持高并发&#xff0c;高性能&#xff0c;高实时性的游戏服务器框架&#xff0c;也希望 mqant 未来能够做即时通讯和物联网方…

java w3c xml_org.w3c.dom(java dom)解析XML文档

首先来了解点Java DOM 的 API:1.解析器工厂类&#xff1a;DocumentBuilderFactory创建的方法&#xff1a;DocumentBuilderFactory dbf DocumentBuilderFactory.newInstance();2.解析器&#xff1a;DocumentBuilder创建方法&#xff1a;通过解析器工厂类来获得 DocumentBuilder…

mysql migrations_Code First Migrations更新数据库结构(数据迁移)

背景 code first起初当修改model后&#xff0c;要持久化至数据库中时&#xff0c;总要把原数据库给删除掉再创建(DropCreateDatabaseIfModelChanges)&#xff0c;此时就会产生一个问题&#xff0c;当我们的旧数据库中包含一些测试数据时&#xff0c;当持久化更新后&#xff0c;…

java 机器码 虚拟机_Java虚拟机:源码到机器码

无论什么语言写的代码&#xff0c;其到最后都是通过机器码运行的&#xff0c;无一例外。那么对于 Java 语言来说&#xff0c;其从源代码到机器码&#xff0c;这中间到底发生了什么呢&#xff1f;这就是今天我们要聊的。如下图所示&#xff0c;编译器可以分为&#xff1a;前端编…

docker 远程连接 文件看不到_开发提升十倍生产力: IDEA 远程一键部署 Spring Boot 到 Docker...

一、开发前准备二、新建项目《Java 2019 超神之路》《Dubbo 实现原理与源码解析 —— 精品合集》《Spring 实现原理与源码解析 —— 精品合集》《MyBatis 实现原理与源码解析 —— 精品合集》《Spring MVC 实现原理与源码解析 —— 精品合集》《Spring Boot 实现原理与源码解析…

java多台_Java 多态

Java中多态的特性&#xff0c;在学习中就是很难懂&#xff0c;比较抽象的概念。学的时候就犯糊涂&#xff0c;但日后会发现&#xff0c;基础在日常工作的理解中占有重要的角色。下面&#xff0c;我将用一个代码实例&#xff0c;回忆和巩固多态的概念和存在的意义。理解多态&…

快准牌电脑发软件_做自媒体必备技能,视频剪辑软件排名(精品篇)

作者&#xff1a;老马引流定位&#xff1a;专业专注引流推广0X00 前言毫不客气的说&#xff0c;视频正日益成为社交媒体和营销的重要组成部分&#xff0c;有越来越多的人参与到视频剪辑当中来&#xff0c;而其中最为关键的就是视频剪辑软件。而市面上的视频剪辑软件当然也是五花…