在学习飞机大战(我也不知道为什么都拿这个练手),飞机左右控制都是按键按一次移动一次,不能按住一个键后持续移动,离开后停止移动。

为了解决这个,查看了参考手册,说让用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()

以上这篇python按键按住不放持续响应的实例代码就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持爱蒂网。

python按键持续按下响应_python按键按住不放持续响应的实例代码相关推荐

  1. python对逻辑回归进行显著性_python sklearn库实现简单逻辑回归的实例代码

    Sklearn简介 Scikit-learn(sklearn)是机器学习中常用的第三方模块,对常用的机器学习方法进行了封装,包括回归(Regression).降维(Dimensionality Red ...

  2. python爬虫找工作怎么找_python爬虫判断招聘信息是否存在的实例代码

    在找工作的时候,我们会选择上网查询招聘的信息,或者是通过一些招聘会进行现场面试.但由于信息更新不及时,有一些岗位会出现下架的情况,如果我们不注意的话,可能就扑了空.在时间上耽误了不说,面试的信息也会受 ...

  3. python 怎么将数字转大写_Python将数字转化为中文大写的实例代码

    Python将阿拉伯数字转化为中文大写,关键点在于中间空多个0的问题. 这种情况下,采用拆分法则,将一个大数字,先拆分成整数部分和小数部分,再对整数部分按照仟.万.亿.兆分位拆分为四个字符串组成的Li ...

  4. python中if语句求最大值_python 判断三个数字中的最大值实例代码

    python 判断三个数字中的最大值,具体代码如下所示: #判断三个数中最大值 n1= int(input('please enter the firest number:')) n2 = int(i ...

  5. python爬去百度文库资料_python urllib爬取百度云连接的实例代码

    翻看自己以前写的程序,发现写过一个爬取盘多多百度云资源的东西,完全是当时想看变形金刚才自己写的,而且当时第一次接触python大概写了有2天才搞出来这个程序,学习python语言,可以看得出来那时候的 ...

  6. 模拟linux设备按键工具,linux下如何模拟按键输入和模拟鼠标

    linux下如何模拟按键输入和模拟鼠标 发布时间:2008-08-19 21:11:54来源:红联作者:anopup 查看/dev/input/eventX是什么类型的事件, cat /proc/bu ...

  7. python获取文件夹下文件_Python 获取指定文件夹下的目录和文件的实现

    经常有需要扫描目录,对文件做批量处理的需求,所以对目录处理这块做了下学习和总结.Python 中扫描目录有两种方法:os.listdir 和 os.walk. 一.os.listdir 方法 os.l ...

  8. python怎么打出长下划线_Python 中的各种下划线操作你了解吗?

    原标题:Python 中的各种下划线操作你了解吗? 我们在定义一些变量或者方法的时候,常常会用到下划线.在 Python 中,下划线的出镜率非常高,比如变量,有些是一个下划线开头的(_xx),有些是两 ...

  9. python获取电脑几核几线程_python编程测试电脑开启最大线程数实例代码

    本文实例代码主要实现python编程测试电脑开启最大线程数,具体实现代码如下. #!/usr/bin/env python #coding=gbk import threading import ti ...

最新文章

  1. ps aux参数说明
  2. 《皇帝:中国的崛起》从入门到精通
  3. php删除多表数据,mysql – 从多个表中删除数据
  4. MYSQL如何导出存储过程和触发器?
  5. 东京见闻:快速走红日本市场 阿里云的三大秘密
  6. Spring-Cloud中常见的服务组件
  7. redis 硬件要求_Redis持久化机制
  8. UnrealEngine4 学习总结备忘
  9. 计算机操作系统第三章测试题及答案
  10. ubuntu20.04下编译仿真智能车racecar的错误解决汇总
  11. 2017CNCC会议总结(一)
  12. Ubuntu 解压 zip、z01、z02等文件方法
  13. QT小游戏(五子棋)
  14. 基于jsp的消防知识宣传网站ssh框架
  15. 人工智能初学笔记系列(1):基础概念与进化流程
  16. xamarin android 微信,转换微信SDK为Xamarin绑定库 Android5.5.8 iOS1.8.6.2
  17. 遇到的奇葩问题和解决方法
  18. 微信零钱明细删除后服务器有记录吗,微信零钱明细怎么删除记录?教你微信零钱明细记录如何删除...
  19. 产品运营眼中,「好的产品经理」是什么样子?
  20. springboot毕设项目大学生租房系统s9331(java+VUE+Mybatis+Maven+Mysql)

热门文章

  1. 这种app.asar文件怎么做修改啊
  2. 网红警犬成长记:训导员“和它在一起时间比家人多”
  3. Zadig 推出手把手教程,一起来尝试吧!
  4. Qt入门--在windows7-64系统上安装Qt
  5. 关于AD10如何输出自己想要的BOM表
  6. (一)VirtualBox及其扩展包下载安装
  7. 交互原型图设计必备软件,这5款太赞了
  8. 桌面背单词,单词图片做背景
  9. 【新的开始】记录每天背的单词,准备考研。(6月7日)
  10. 【Poco学习笔记】Poco库win10下编译(超详细,小白都能看得懂)