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中requests模块的使用方法
Apr 08 Python
python采用django框架实现支付宝即时到帐接口
May 17 Python
Python实现屏幕截图的代码及函数详解
Oct 01 Python
使用Python的turtle模块画图的方法
Nov 15 Python
为什么Python中没有"a++"这种写法
Nov 27 Python
python中bs4.BeautifulSoup的基本用法
Jul 27 Python
python性能测量工具cProfile使用解析
Sep 26 Python
python运用sklearn实现KNN分类算法
Oct 16 Python
使用opencv将视频帧转成图片输出
Dec 10 Python
Python开发之pip安装及使用方法详解
Feb 21 Python
你应该知道的Python3.6、3.7、3.8新特性小结
May 12 Python
Python使用20行代码实现微信聊天机器人
Jun 05 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开发模式(简写版)
2007/03/15 PHP
php模拟js函数unescape的函数代码
2012/10/20 PHP
Laravel 5 学习笔记
2015/03/06 PHP
php实现兼容2038年后Unix时间戳转换函数
2015/03/18 PHP
PHP7新增运算符用法实例分析
2016/09/26 PHP
Javascript学习笔记2 函数
2010/01/11 Javascript
ASP.NET jQuery 实例2 (表单中使用回车在TextBox之间向下移动)
2012/01/13 Javascript
jquery对元素拖动排序示例
2014/01/16 Javascript
三种检测iPhone/iPad设备方向的方法
2014/04/23 Javascript
jQuery validate插件实现ajax验证重复的2种方法
2016/01/22 Javascript
jQuery实现鼠标经过购物车出现下拉框代码(推荐)
2016/07/21 Javascript
BootStrap实现响应式布局导航栏折叠隐藏效果(在小屏幕、手机屏幕浏览时自动折叠隐藏)
2016/11/30 Javascript
JS和Canvas实现图片的预览压缩和上传功能
2018/03/30 Javascript
vue实现通讯录功能
2018/07/14 Javascript
原生JS实现的简单轮播图功能【适合新手】
2018/08/17 Javascript
Electron + vue 打包桌面操作流程详解
2019/06/24 Javascript
JS实现放大镜效果
2020/09/21 Javascript
Python smallseg分词用法实例分析
2015/05/28 Python
python字符串与url编码的转换实例
2018/05/10 Python
django从请求到响应的过程深入讲解
2018/08/01 Python
基于wxPython的GUI实现输入对话框(1)
2019/02/27 Python
Django视图类型总结
2021/02/17 Python
HTML5视频支持检测(检查浏览器是否支持视频播放)
2013/06/08 HTML / CSS
HTML5本地存储localStorage、sessionStorage基本用法、遍历操作、异常处理等
2014/05/08 HTML / CSS
英国在线自行车商店:Evans Cycles
2016/09/26 全球购物
Sixt美国租车:高端豪华车型自驾体验
2017/09/02 全球购物
Marlies Dekkers内衣荷兰官方网店:荷兰奢侈内衣品牌
2020/03/27 全球购物
秋季婚礼证婚词
2014/01/11 职场文书
志愿者活动总结范文
2014/04/26 职场文书
解除劳动合同协议书
2014/09/17 职场文书
英文慰问信
2015/02/14 职场文书
2016年妇联“6﹒26国际禁毒日”宣传活动总结
2016/04/05 职场文书
Nginx+Tomcat实现负载均衡、动静分离的原理解析
2021/03/31 Servers
python编写五子棋游戏
2021/05/25 Python
Java循环队列与非循环队列的区别总结
2021/06/22 Java/Android