python按键按住不放持续响应的实例代码
作者:Ya呼 发布时间:2021-12-30 16:42:54
标签:python,按键,响应
在学习飞机大战(我也不知道为什么都拿这个练手),飞机左右控制都是按键按一次移动一次,不能按住一个键后持续移动,离开后停止移动。
为了解决这个,查看了参考手册,说让用pygame.key.set_repeat() 方法,奈何我刚开始学也看不太明白,只能看懂一些。并且看别人的代码也比较费劲,毕竟不是自己的逻辑,得看一会儿,最后还是自己想了一个办法,用flag标签:
大体思路是这样的,比如向左持续移动,先在hero定一个属性标签设置布尔值为False,然后定义移动方法,在为真时,移动;再然后定义键盘的事件,当按下键盘时,标签为真,当抬起键盘时,设置为False。最后再while循环里执行这个移动方法和键盘函数。具体的代码部分举例为:(并不是全部代码,只是实现这个功能的核心代码),主要看Hero 类里的__init__方法里的四个属性以及move方法;key_control函数以及在main函数里的while循环里的 key_control(hero) 以及hero.move()。
import pygame
import time
from pygame.locals import * # 用来检测事件,比如键盘按键操作
class Hero(BasePlane):
"""定义我方飞机类"""
def __init__(self, screen, enemy_temp):
BasePlane.__init__(self, 140, 488, screen, "./spritesheets/hero_fly_1.png") # 继承飞机基类,这里不用管
self.enemy = enemy_temp
# 设置上下左右四个属性
self.key_right_status = False
self.key_left_status = False
self.key_up_status = False
self.key_down_status = False
# 以下方法是控制上下左右移动
def move(self):
if self.key_right_status:
self.x += 3
if self.key_left_status:
self.x -= 3
if self.key_down_status:
self.y += 3
if self.key_up_status:
self.y -= 3
def key_control(hero_temp):
"""控制键盘的函数"""
for event in pygame.event.get():
# 判断是否是点击了退出按钮
if event.type == QUIT:
print("exit")
exit()
# 在按下键盘时,设置hero的属性为True
elif event.type == KEYDOWN:
if event.key == K_a or event.key == K_LEFT:
hero_temp.key_left_status = True
elif event.key == K_d or event.key == K_RIGHT:
hero_temp.key_right_status = True
elif event.key == K_w or event.key == K_UP:
hero_temp.key_up_status = True
elif event.key == K_s or event.key == K_DOWN:
hero_temp.key_down_status = True
elif event.key == K_SPACE:
hero_temp.shoot() # 这里应该是飞机.显示 * 方法()
elif event.type == KEYUP:
if event.key == K_a or event.key == K_LEFT:
hero_temp.key_left_status = False
# 检测按键是否是d或者方向键right
elif event.key == K_d or event.key == K_RIGHT:
hero_temp.key_right_status = False
elif event.key == K_w or event.key == K_UP:
hero_temp.key_up_status = False
elif event.key == K_s or event.key == K_DOWN:
hero_temp.key_down_status = False
def main():
# 1.创建一个窗口,用来显示内容
screen = pygame.display.set_mode((320, 568), 0, 32)
# 2.创建一个跟窗口大小一致的图片,用来填充当背景
background = pygame.image.load("./spritesheets/background_2.png")
enemy = Enemy(screen)
hero = Hero(screen, enemy) # 创建我方飞机英雄对象
while True:
# 设定需要显示的图在窗口中哪个位置显示
screen.blit(background, (0, 0))
# 我方飞机英雄显示
hero.display()
# 敌方飞机显示
enemy.display()
enemy.move()
enemy.shoot()
# 获取事件,比如按键等
key_control(hero)
hero.move()
# 更新需要显示的内容
pygame.display.update()
time.sleep(0.01)
if __name__ == '__main__':
main()
来源:https://blog.csdn.net/baidu_39560388/article/details/84612605


猜你喜欢
- 以下是作者在学习Python中django框架时的学习笔记,并把测试的代码做了详细分析,最后还附上了学习心得,值得大家学习。URL配置(UR
- 引言:我们在页面上会看到,谁登录的就会显示谁的信息,那么这个页面上的变量信息是怎样实现的呢?这就是本文要讲述的内容——Django中的模板变
- 1、检测登录状态base.pydef checkLogin(func):""" 查看session
- python中@的用法@是一个装饰器,针对函数,起调用传参的作用。 有修饰和被修饰的区别,‘@function'作为一个装饰器,用来
- 前言使用 requests进行爬取、BeautifulSoup进行数据提取。主要分成两步: 第一步是解析图书列表页,并解析出里面的图书详情页
- 🔓一. CRUDCRUD : Create,Retrieve,Update,Delete新增数据查询数据修改数据删除数据MySQL的工作就是
- 本文实例讲述了javascript限制用户只能输汉字中文的方法。分享给大家供大家参考。具体实现方法如下:要验证函数时我们必须明白,如果是汉字
- 支持多种编码的中文字符串截取函数! /* * @todo&
- Bootstrap,来自 Twitter,是目前最受欢迎的前端框架。Bootstrap 是基于 HTML、CSS、JAVASCRIPT 的,
- 本文实例讲述了Python pymongo模块用法。分享给大家供大家参考,具体如下:MongoDB优点 MongoDB是一个为当代web应用
- 如下所示:import timedef date_compare(item1, item2): t1 = time.mktime(time.
- FME如何使用Python?安装FME后,在FME的安装路径中,找到 fmeobjects 文件夹(C:\Program Files\FME
- 在JavaScript开发中,被人问到:null与undefined到底有啥区别?一时间不好回答,特别是undefined,因为这涉及到un
- django中瀑布流初探img.html<!DOCTYPE html><html lang="en"&
- 利用tcpdump对mysql进行抓包操作如下所示:命令如下:tcpdump -s 0 -l -w - dst 192.168.244.10
- 在MySQL中,使用While语句循环与SQL Server中有所不同,代码测试通过。 MSSQL中使用while语句循环生成数据的方法:
- Jones向量假设光波沿z轴传播,那么其三个方向的电场分量可以表示为Jones矩阵能够保证二维列向量形状不变的运算有无穷多种,但最符合我们直
- <script language="javascript"> function disableRightCl
- 阅读上一篇:打造设计你自己的字体 Ⅱ永远都在寻觅字体设计的灵感。夏天过后,我买了一套便宜的书法钢笔,说服自己,它会让我的鸡爬字产生脱胎换骨的
- 1、什么是偏函数partialpython中提供一种对于函数固定属性的函数 2、偏函数的作用把一个函数的某些参数给固定住(也就是设