判断按键值_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元素&#…

python 快速删除程序_如何快速一次性卸载所有python包(第三方库)呢

很多时候我们都会有一个麻烦事&#xff0c;就是打开pycharm或者VScode等的时候&#xff0c;都有可能因为自己电脑上面安装的第三方模块过多&#xff0c;导致电脑很卡&#xff0c;风扇转速不停地增加&#xff0c;这时候我们就会想去卸载一些不太用得着的第三方模块&#xff0c;但…

python正则表达式修饰符_Python正则表达式

正则表达式是一个特殊的字符序列&#xff0c;它能帮助你方便的检查一个字符串是否与某种模式匹配。re 模块使 Python 语言拥有全部的正则表达式功能。compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。r…

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

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

备抵附加账户的期末余额_会计账户的分类(二)

待摊费用账户的格式和运用方法同盘存类账户&#xff0c;即&#xff1a;期初如果有余额在借方&#xff0c;本期发生额的增加数在借方&#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…

MySQL不走联合索引_mysql group by 多列优化思路?为什么不走联合索引?

explain SELECT a, b, COUNT(*) FROM tbnameGROUP BY a, border by a DESClimit 1a 和 b 列已经设置联合索引&#xff0c; 为什么这种操作也会执行全表扫描呢&#xff1f;explain SELECT a, b FROM tbnameGROUP BY a, border by a DESC去掉 COUNT 和 limit 则走索引没有扫描&am…

mysql ddl 锁_MySQL Online DDL导致全局锁表案例分析

MySQL Online DDL导致全局锁表案例分析我这边遇到了什么问题?线上给某个表执行新增索引SQL, 然后整个数据CPU打到100%, 连接数暴增到极限, 最后导致所有访问数据库的应用都奔溃.SQL如下:ALTER TABLE bookADD INDEX idx_sub_title (sub_title ASC);能看到什么?10063293, root,…

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…

dokcer mysql修改编码_默认支持utf8编码的mysql docker镜像

其他人都是不正确的使用mysql容器镜像可以很快速的运行mysql&#xff0c;免去了传统的虚拟机安装方式的繁琐配置。但是使用官方的mysql镜像&#xff0c;你会遇到中文乱码的问题&#xff0c;原因是官方镜像的字符集默认值不是utf8。这时候你去google&#xff0c;会找到一些文章&…

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

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

locust mysql_locust性能压测连接mysql,随机取出班级,绑定学生

from locust import HttpLocust, TaskSet, taskimport pymysqlimport randomclass UserBehavior(TaskSet):def on_start(self):db pymysql.connect("ip地址", "用户名", "密码", "数据库")cursor db.cursor()cursor.execute("S…

mysql无法添加或更新子行_违反完整性约束:1452无法添加或更新子行:

我试图在我的注释表中插入值&#xff0c;但出现错误。俗话说&#xff0c;我不能添加或更新子行&#xff0c;我也不知道这意味着什么。我的架构看起来像这样-- ------------------------------ Table structure for comments-- ----------------------------DROP TABLE IF EXIST…

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

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

python解析response的json_从HTML responseTex解析JSON

因此&#xff0c;我大体上同意&#xff0c;更好的解决方案是确保服务器只返回JSON&#xff0c;不过这是通过客户端Javascript实现的一种快速方法&#xff0c;如Barmer所建议的那样&#xff0c;将html解析到DOM&#xff0c;获取body中的文本childNode并在其上运行JSONParse。在v…

mysql 密码修改时间_Mysql修改密码的方法

修改mysql密码的方法&#xff1a;最简单的&#xff0c;在Navicat连接后点用户&#xff0c;找到rootlocalhost直接修改。注意如果装了xampp&#xff0c;在phpmyadmin配置文件也需要改两处密码。下面是在命令行修改的方法。方法1&#xff1a;用mysqladmin----------------亲测这个…

svn版本库浏览器_在SVN版本库浏览器中直接编辑文件保存后不会弹..._网络编辑_帮考网...

原因是没有实际添加到版本库中&#xff0c;要添加到版本库必须执行“Commit”。具体分析如下&#xff1a;SVN错误处理svn : Couldn’t perform atomic initialization. 临时解决办法&#xff1a;升级sqlite。原本安装的是 subversion 1.6.16 sqlite 3.6.13&#xff0c;一直报”…

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

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