python按键按住不放持续响应的实例代码


Posted in Python onJuly 17, 2019

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

为了解决这个,查看了参考手册,说让用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程序中的应用示例
Mar 02 Python
离线安装Pyecharts的步骤以及依赖包流程
Apr 23 Python
Python根据文件名批量转移图片的方法
Oct 21 Python
解决python ogr shp字段写入中文乱码的问题
Dec 31 Python
Python multiprocess pool模块报错pickling error问题解决方法分析
Mar 20 Python
python替换字符串中的子串图文步骤
Jun 19 Python
Python使用itchat 功能分析微信好友性别和位置
Aug 05 Python
Python中PyQt5/PySide2的按钮控件使用实例
Aug 17 Python
python 实现快速生成连续、随机字母列表
Nov 28 Python
Ubuntu16.04安装python3.6.5步骤详解
Jan 10 Python
python读取当前目录下的CSV文件数据
Mar 11 Python
python字典key不能是可以是啥类型
Aug 04 Python
python数据预处理之数据标准化的几种处理方式
Jul 17 #Python
解决Python正则表达式匹配反斜杠''\''问题
Jul 17 #Python
python小程序实现刷票功能详解
Jul 17 #Python
python 获取sqlite3数据库的表名和表字段名的实例
Jul 17 #Python
Python math库 ln(x)运算的实现及原理
Jul 17 #Python
Python_查看sqlite3表结构,查询语句的示例代码
Jul 17 #Python
10分钟用python搭建一个超好用的CMDB系统
Jul 17 #Python
You might like
php 过滤器实现代码
2010/08/09 PHP
php警告Creating default object from empty value 问题的解决方法
2014/04/02 PHP
深入理解Yii2.0乐观锁与悲观锁的原理与使用
2017/07/26 PHP
Laravel解决nesting level错误和隐藏index.php的问题
2019/10/12 PHP
多广告投放代码 推荐
2006/11/13 Javascript
JQuery 弹出框定位实现方法
2010/12/02 Javascript
ASP.NET jQuery 实例9  通过控件hyperlink实现返回顶部效果
2012/02/03 Javascript
javascript中自定义对象的属性方法分享
2013/07/12 Javascript
浅析JavaScript原型继承的陷阱
2013/12/03 Javascript
JS折半插入排序算法实例
2015/12/02 Javascript
js实现精确到秒的日期选择器完整实例
2016/04/30 Javascript
BootStrap组件之进度条的基本用法
2017/01/19 Javascript
AngularJS页面带参跳转及参数解析操作示例
2017/06/28 Javascript
js禁止Backspace键使浏览器后退的实现方法
2017/09/01 Javascript
node-sass安装失败的原因与解决方法
2017/09/04 Javascript
vue组件详解之使用slot分发内容
2018/04/09 Javascript
JS实现select选中option触发事件操作示例
2018/07/13 Javascript
详解webpack 最简打包结果分析
2019/02/20 Javascript
[01:08:32]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第二场 1月18日
2021/03/11 DOTA
使用Python进行稳定可靠的文件操作详解
2013/12/31 Python
Python和Sublime整合过程图示
2019/12/25 Python
Pycharm内置终端及远程SSH工具的使用教程图文详解
2020/03/19 Python
如何基于python3和Vue实现AES数据加密
2020/03/27 Python
keras 自定义loss损失函数,sample在loss上的加权和metric详解
2020/05/23 Python
浅谈keras.callbacks设置模型保存策略
2020/06/18 Python
里程积分管理买卖交换平台:Points.com
2017/01/13 全球购物
什么叫应用程序域?什么是受管制的代码?什么是强类型系统?什么是装箱和拆箱?
2016/08/13 面试题
linux面试题参考答案(1)
2016/01/22 面试题
开业庆典邀请函
2014/01/08 职场文书
护士自我评价
2014/02/01 职场文书
2014学雷锋活动总结
2014/03/09 职场文书
给老婆道歉的话
2015/01/20 职场文书
浅谈如何提高PHP代码质量之端到端集成测试
2021/05/28 PHP
海弦WR-800F
2022/04/05 无线电
Windows下载并安装MySQL8.0.x 版本的完整教程
2022/04/10 MySQL
MySQL表字段数量限制及行大小限制详情
2022/07/23 MySQL