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操作字符串之rindex()方法的使用
May 19 Python
Python检测生僻字的实现方法
Oct 23 Python
python3实现全角和半角字符转换的方法示例
Sep 21 Python
python opencv之SURF算法示例
Feb 24 Python
CentOS下Python3的安装及创建虚拟环境的方法
Nov 28 Python
python 定时器,实现每天凌晨3点执行的方法
Feb 20 Python
python 将字符串完成特定的向右移动方法
Jun 11 Python
Python3 利用face_recognition实现人脸识别的方法
Mar 13 Python
Python实现初始化不同的变量类型为空值
Jun 02 Python
Python实现寻找回文数字过程解析
Jun 09 Python
Python GUI之tkinter窗口视窗教程大集合(推荐)
Oct 20 Python
python实现KNN近邻算法
Dec 30 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
php5.3 废弃函数小结
2010/05/16 PHP
一组PHP加密解密函数分享
2014/06/05 PHP
jQuery Ajax使用 全解析
2010/12/15 Javascript
js中判断文本框是否为空的两种方法
2011/07/31 Javascript
jQuery中unbind()方法用法实例
2015/01/19 Javascript
深入理解JavaScript系列(48):对象创建模式(下篇)
2015/03/04 Javascript
解决WordPress使用CDN后博文无法评论的错误
2015/12/15 Javascript
Nodejs中 npm常用命令详解
2016/07/04 NodeJs
JS 正则表达式验证密码、邮箱格式的实例代码
2018/10/28 Javascript
Vue项目自动转换 px 为 rem的实现方法
2018/10/29 Javascript
你准备好迎接vue3.0了吗
2020/04/28 Javascript
[02:27]DOTA2英雄基础教程 莱恩
2014/01/17 DOTA
python动态加载包的方法小结
2016/04/18 Python
python+selenium 定位到元素,无法点击的解决方法
2019/01/30 Python
python利用蒙版抠图(使用PIL.Image和cv2)输出透明背景图
2020/08/04 Python
超级实用的8个Python列表技巧
2020/08/24 Python
html5中JavaScript removeChild 删除所有节点
2014/05/16 HTML / CSS
欧洲顶级的童装奢侈品购物网站:Bambini Fashion(面向全球)
2018/04/24 全球购物
初中地理教学反思
2014/01/11 职场文书
2014元旦晚会策划方案
2014/02/19 职场文书
规划编制实施方案
2014/03/15 职场文书
企业文化建设实施方案
2014/03/22 职场文书
教师师德承诺书
2014/03/26 职场文书
毕业生简历自我评价范文
2014/04/09 职场文书
五月的鲜花活动方案
2014/08/21 职场文书
审计局班子四风对照检查材料思想汇报
2014/10/07 职场文书
教师党员群众路线教育实践活动心得体会
2014/11/04 职场文书
给老师的一封感谢信
2015/01/20 职场文书
三八妇女节慰问信
2015/02/14 职场文书
英文慰问信范文
2015/03/24 职场文书
2015年劳动部工作总结
2015/05/23 职场文书
党校团干班培训心得体会
2016/01/06 职场文书
入党申请书格式
2019/06/20 职场文书
创业计划书之美容店
2019/09/16 职场文书
JavaScript与JQuery框架基础入门教程
2021/07/15 Javascript
人民币符号
2022/02/17 杂记