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实现面向对像的ASP程序实例
Nov 10 Python
Python保存MongoDB上的文件到本地的方法
Mar 16 Python
Centos Python2 升级到Python3的简单实现
Jun 21 Python
Python使用pyautogui模块实现自动化鼠标和键盘操作示例
Sep 04 Python
python 获取一个值在某个区间的指定倍数的值方法
Nov 12 Python
django开发post接口简单案例,获取参数值的方法
Dec 11 Python
python判断文件是否存在,不存在就创建一个的实例
Feb 18 Python
pytorch加载自定义网络权重的实现
Jan 07 Python
用pytorch的nn.Module构造简单全链接层实例
Jan 14 Python
Python sklearn中的.fit与.predict的用法说明
Jun 28 Python
Biblibili视频投稿接口分析并以Python实现自动投稿功能
Feb 05 Python
如何用 Python 制作 GitHub 消息助手
Feb 20 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实例分享之通过递归实现删除目录下的所有文件详解
2014/05/15 PHP
PHP错误Cannot use object of type stdClass as array in错误的解决办法
2014/06/12 PHP
PHP将二维数组某一个字段相同的数组合并起来的方法
2016/02/26 PHP
一个无限级XML绑定跨框架菜单(For IE)
2007/01/27 Javascript
B/S开发中常用javaScript技术与代码
2007/03/09 Javascript
通过修改referer下载文件的方法
2008/05/11 Javascript
jquery实现在页面加载完毕后获取图片高度或宽度
2014/06/16 Javascript
[原创]Javascript 实现广告后加载 可加载百度谷歌联盟广告
2016/05/11 Javascript
深入理解JQuery循环绑定事件
2016/06/02 Javascript
JavaScript提升性能的常用技巧总结【经典】
2016/06/20 Javascript
BootStrap入门教程(一)之可视化布局
2016/09/19 Javascript
Vue input控件通过value绑定动态属性及修饰符的方法
2017/05/03 Javascript
vue组件初学_弹射小球(实例讲解)
2017/09/06 Javascript
浅析Vue.js 中的条件渲染指令
2018/11/19 Javascript
three.js欧拉角和四元数的使用方法
2020/07/26 Javascript
vue 验证两次输入的密码是否一致的方法示例
2020/09/29 Javascript
Python实现文件复制删除
2016/04/19 Python
python实现字符串加密 生成唯一固定长度字符串
2019/03/22 Python
浅谈Django2.0 加xadmin踩的坑
2019/11/15 Python
python列表推导式入门学习解析
2019/12/02 Python
Docker部署Python爬虫项目的方法步骤
2020/01/19 Python
利用Python脚本批量生成SQL语句
2020/03/04 Python
Django使用Profile扩展User模块方式
2020/05/14 Python
Django 解决阿里云部署同步数据库报错的问题
2020/05/14 Python
Expedia英国:全球最大的在线旅游公司
2017/09/07 全球购物
Visual-Click葡萄牙:欧洲领先的在线眼镜商
2020/02/17 全球购物
什么是重载?CTS、CLS和CLR分别做何解释
2012/05/06 面试题
小区门卫工作职责
2013/12/14 职场文书
2014世界杯球队球队口号
2014/06/05 职场文书
2014年社区居委会主任重阳节讲话稿
2014/09/25 职场文书
庆祝国庆节标语
2014/10/09 职场文书
2014年度安全工作总结
2014/12/04 职场文书
2015年学校安全管理工作总结
2015/05/11 职场文书
严以律己学习心得体会
2016/01/13 职场文书
2016年中学法制宣传日活动总结
2016/04/01 职场文书
如何在C++中调用Python
2021/05/21 Python