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中PDB模块中的命令来调试Python代码的教程
Mar 30 Python
python代码过长的换行方法
Jul 19 Python
idea创建springMVC框架和配置小文件的教程图解
Sep 18 Python
Python 给某个文件名添加时间戳的方法
Oct 16 Python
Python图像处理之颜色的定义与使用分析
Jan 03 Python
对pyqt5多线程正确的开启姿势详解
Jun 14 Python
Python分析彩票记录并预测中奖号码过程详解
Jul 09 Python
windows安装TensorFlow和Keras遇到的问题及其解决方法
Jul 10 Python
Django使用Jinja2模板引擎的示例代码
Aug 09 Python
Python如何应用cx_Oracle获取oracle中的clob字段问题
Aug 27 Python
使用Python+selenium实现第一个自动化测试脚本
Mar 17 Python
Python包argparse模块常用方法
Jun 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加速的eAccelerator dll支持文件打包下载
2007/09/30 PHP
解析如何修改phpmyadmin中的默认登陆超时时间
2013/06/25 PHP
php实现数组中索引关联数据转换成json对象的方法
2015/07/08 PHP
PHP在线打包下载功能示例
2016/10/15 PHP
PHP命名空间定义与用法实例分析
2019/08/14 PHP
浅析PHP反序列化中过滤函数使用不当导致的对象注入问题
2020/02/15 PHP
解决3.01版的jquery.form.js中文乱码问题的解决方法
2012/03/08 Javascript
正则表达式搭配js轻松处理json文本方便而老古
2013/02/17 Javascript
ExtJS中设置下拉列表框不可编辑的方法
2014/05/07 Javascript
javascript实现类似百度分享功能的方法
2015/07/27 Javascript
js实现div模拟模态对话框展现URL内容
2016/05/27 Javascript
AngularJS中的按需加载ocLazyLoad示例
2017/01/11 Javascript
Web 开发中Ajax的Session 超时处理方法
2017/01/19 Javascript
JavaScript实现打印星型金字塔功能实例分析
2017/09/27 Javascript
vue 系列——vue2-webpack2框架搭建踩坑之路
2017/12/22 Javascript
vue页面跳转后返回原页面初始位置方法
2018/02/11 Javascript
为什么说JavaScript预解释是一种毫无节操的机制详析
2018/11/18 Javascript
详解如何快速配置webpack多入口脚手架
2018/12/28 Javascript
Python中使用bidict模块双向字典结构的奇技淫巧
2016/07/12 Python
Python爬虫工程师面试问题总结
2018/03/22 Python
解决Spyder中图片显示太小的问题
2018/04/27 Python
Python3.8中使用f-strings调试
2019/05/22 Python
为什么说Python可以实现所有的算法
2019/10/04 Python
Python使用enumerate获取迭代元素下标
2020/02/03 Python
Pytorch转keras的有效方法,以FlowNet为例讲解
2020/05/26 Python
python 通过文件夹导入包的操作
2020/06/01 Python
python实现二分类和多分类的ROC曲线教程
2020/06/15 Python
Python爬虫后获取重定向url的两种方法
2021/01/19 Python
canvas实现扭蛋机动画效果的示例代码
2018/10/17 HTML / CSS
萌新的HTML5 入门指南
2020/11/06 HTML / CSS
酒店工作职员求职简历的自我评价
2013/10/23 职场文书
内衣营销方案
2014/03/15 职场文书
2014年业务工作总结
2014/11/17 职场文书
2019财务毕业实习报告
2019/06/27 职场文书
使用jpa之动态插入与修改(重写save)
2021/11/23 Java/Android
CSS SandBox应用场景及常见问题
2022/06/25 HTML / CSS