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和pyqt实现360的CLable控件
Feb 21 Python
Python实现将目录中TXT合并成一个大TXT文件的方法
Jul 15 Python
从源码解析Python的Flask框架中request对象的用法
Jun 02 Python
python实现基于SVM手写数字识别功能
May 27 Python
Python使用sort和class实现的多级排序功能示例
Aug 15 Python
解决pycharm运行程序出现卡住scanning files to index索引的问题
Jun 27 Python
Python:type、object、class与内置类型实例
Dec 25 Python
在python3中使用shuffle函数要注意的地方
Feb 28 Python
通过Django Admin+HttpRunner1.5.6实现简易接口测试平台
Nov 11 Python
python3.7中安装paddleocr及paddlepaddle包的多种方法
Nov 27 Python
Python基于Tkinter开发一个爬取B站直播弹幕的工具
May 06 Python
Python天气语音播报小助手
Sep 25 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
域名查询代码公布
2006/10/09 PHP
PHP生成及获取JSON文件的方法
2016/08/23 PHP
PHP+Session防止表单重复提交的解决方法
2018/04/09 PHP
Ubuntu彻底删除PHP7.0的方法
2018/07/27 PHP
JavaScript Event学习第四章 传统的事件注册模型
2010/02/07 Javascript
简单的代码实现jquery定时器
2013/11/17 Javascript
JavaScript匿名函数之模仿块级作用域
2015/12/12 Javascript
AngularJS入门教程之AngularJS指令
2016/04/18 Javascript
JS中页面与页面之间超链接跳转中文乱码问题的解决办法
2016/12/15 Javascript
vue.js提交按钮时进行简单的if判断表达式详解
2018/08/08 Javascript
详解Vue一个案例引发「内容分发slot」的最全总结
2018/12/02 Javascript
vue element upload实现图片本地预览
2019/08/20 Javascript
python调用机器喇叭发出蜂鸣声(Beep)的方法
2015/03/23 Python
python多进程控制学习小结
2018/10/31 Python
对Django项目中的ORM映射与模糊查询的使用详解
2019/07/18 Python
Pandas透视表(pivot_table)详解
2019/07/22 Python
python BlockingScheduler定时任务及其他方式的实现
2019/09/19 Python
pycharm不以pytest方式运行,想要切换回普通模式运行的操作
2020/09/01 Python
利用python绘制正态分布曲线
2021/01/04 Python
简单介绍CSS3中Media Query的使用
2015/07/07 HTML / CSS
Melissa香港官网:MDreams
2016/07/01 全球购物
巴西最大的巴士票务门户:Quero Passagem
2020/11/21 全球购物
分布式数据库需要考虑哪些问题
2013/12/08 面试题
考试不及格检讨书
2014/01/09 职场文书
珍珠奶茶店创业计划书
2014/01/11 职场文书
怎么写好自荐书
2014/03/02 职场文书
聘用意向书范本
2014/04/01 职场文书
党的群众路线教育实践活动心得体会(医院)
2014/11/03 职场文书
试用期旷工辞退通知书
2015/04/17 职场文书
公务员保密工作承诺书
2015/05/04 职场文书
淮海战役观后感
2015/06/11 职场文书
2016年情人节问候语
2015/11/11 职场文书
签证扫盲贴,41个常见签证知识,需要的拿走
2019/08/09 职场文书
react中的DOM操作实现
2021/06/30 Javascript
一篇文章弄懂Python中的内建函数
2021/08/07 Python
Pygame如何使用精灵和碰撞检测
2021/11/17 Python