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字符遍历的艺术
Sep 06 Python
python实现汉诺塔递归算法经典案例
Mar 01 Python
tensorflow实现逻辑回归模型
Sep 08 Python
python requests.post带head和body的实例
Jan 02 Python
python单线程下实现多个socket并发过程详解
Jul 27 Python
python3正则模块re的使用方法详解
Feb 11 Python
Python3标准库glob文件名模式匹配的问题
Mar 13 Python
通过cmd进入python的步骤
Jun 16 Python
python产生模拟数据faker库的使用详解
Nov 04 Python
python生成word合同的实例方法
Jan 12 Python
用Python制作灯光秀短视频的思路详解
Apr 13 Python
python+pytest接口自动化之token关联登录的实现
Apr 06 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/01/13 PHP
php最简单的删除目录与文件实现方法
2014/11/28 PHP
不错的asp中显示新闻的功能
2006/10/13 Javascript
javascript 字符串连接的性能问题(多浏览器)
2008/11/18 Javascript
父元素与子iframe相互获取变量和元素对象的具体实现
2013/10/15 Javascript
window resize和scroll事件的基本优化思路
2014/04/29 Javascript
jquery实现文本框数量加减功能的例子分享
2014/05/10 Javascript
Nodejs进程管理模块forever详解
2014/06/01 NodeJs
浅谈javascript中字符串String与数组Array
2014/12/31 Javascript
Css3制作变形与动画效果
2015/07/24 Javascript
JS实现自动固定顶部的悬浮菜单栏效果
2015/09/16 Javascript
Js遍历键值对形式对象或Map形式的方法
2016/08/08 Javascript
深入理解bootstrap框架之第二章整体架构
2016/10/09 Javascript
网络传输协议(http协议)
2016/11/18 Javascript
深入理解vue-router之keep-alive
2017/08/31 Javascript
360提示[高危]使用存在漏洞的JQuery版本的解决方法
2017/10/27 jQuery
Vue配合iView实现省市二级联动的示例代码
2018/07/27 Javascript
详解js 创建对象的几种方法
2019/03/08 Javascript
js回溯法计算最佳旅行线路代码实例
2019/09/11 Javascript
微信小程序:报错(in promise) MiniProgramError
2020/10/30 Javascript
[07:54]DOTA2 MV《我的动力鞋》 ImbaTV 出品
2014/11/21 DOTA
在Python的Django框架中使用通用视图的方法
2015/07/21 Python
python实现外卖信息管理系统
2018/01/11 Python
利用Python实现在同一网络中的本地文件共享方法
2018/06/04 Python
Tensorflow 合并通道及加载子模型的方法
2018/07/26 Python
Python打包方法Pyinstaller的使用
2018/10/09 Python
python多进程使用及线程池的使用方法代码详解
2018/10/24 Python
python版本五子棋的实现代码
2018/12/11 Python
pycharm不能运行.py文件的解决方法
2020/02/12 Python
Python实现删除某列中含有空值的行的示例代码
2020/07/20 Python
解决Pyinstaller打包软件失败的一个坑
2021/03/04 Python
18-35岁旅游团的全球领导者:Contiki
2017/02/08 全球购物
义和团口号
2014/06/17 职场文书
党员干部反四风对照检查材料思想汇报
2014/09/14 职场文书
2015年公司工作总结
2015/04/25 职场文书
《天净沙·秋思》教学反思三篇
2019/11/02 职场文书