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使用arp欺骗伪造网关的方法
Apr 24 Python
在Python中操作时间之strptime()方法的使用
Dec 30 Python
django 使用 request 获取浏览器发送的参数示例代码
Jun 11 Python
Python设计模式之职责链模式原理与用法实例分析
Jan 11 Python
详解Python基础random模块随机数的生成
Mar 23 Python
django的csrf实现过程详解
Jul 26 Python
Python中的单下划线和双下划线使用场景详解
Sep 09 Python
基于python2.7实现图形密码生成器的实例代码
Nov 05 Python
Python定义函数时参数有默认值问题解决
Dec 19 Python
python正则表达式匹配IP代码实例
Dec 28 Python
Pycharm如何导入python文件及解决报错问题
May 10 Python
解决python 在for循环并且pop数组的时候会跳过某些元素的问题
Dec 11 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中的字符串函数
2006/10/09 PHP
PHP中的正则表达式函数介绍
2012/02/27 PHP
那些年一起学习的PHP(二)
2012/03/21 PHP
php中session过期时间设置及session回收机制介绍
2014/05/05 PHP
php判断用户是否手机访问代码
2015/06/08 PHP
Yii2下session跨域名共存的解决方案
2017/02/04 PHP
PHP大文件切割上传并带进度条功能示例
2019/07/01 PHP
javascript preload&lazy load
2010/05/13 Javascript
JavaScript去除空格的三种方法(正则/传参函数/trim)
2013/02/06 Javascript
js创建子窗口并且回传值示例代码
2013/07/02 Javascript
JavaScript splice()方法详解
2020/09/22 Javascript
jquery ajax jsonp跨域调用实例代码
2013/12/11 Javascript
JS将数字转换成三位逗号分隔的样式(示例代码)
2014/02/19 Javascript
IE9+已经不对document.createElement向下兼容的解决方法
2015/09/14 Javascript
基于jquery实现日历签到功能
2020/09/11 Javascript
jquery ztree异步搜索(搜叶子)实践
2016/02/25 Javascript
一个字符串中出现次数最多的字符 统计这个次数【实现代码】
2016/04/29 Javascript
判断是否存在子节点的实现代码
2016/05/18 Javascript
jQuery grep()方法详解及实例代码
2016/10/30 Javascript
select自定义小三角样式代码(实用总结)
2017/08/18 Javascript
详解使用VueJS开发项目中的兼容问题
2018/08/02 Javascript
基于Vue插入视频的2种方法小结
2019/04/02 Javascript
使用express获取微信小程序二维码小记
2019/05/21 Javascript
python实现ip查询示例
2014/03/26 Python
pthon贪吃蛇游戏详细代码
2019/01/27 Python
Python实现的统计文章单词次数功能示例
2019/07/08 Python
Django中Middleware中的函数详解
2019/07/18 Python
python opencv实现证件照换底功能
2019/08/19 Python
基于Python获取城市近7天天气预报
2019/11/26 Python
Python namedtuple命名元组实现过程解析
2020/01/08 Python
python+tifffile之tiff文件读写方式
2020/01/13 Python
dpn网络的pytorch实现方式
2020/01/14 Python
市场营销方案范文
2014/03/11 职场文书
市场总监岗位职责
2015/02/11 职场文书
见习期个人总结
2015/03/05 职场文书
病房管理制度范本
2015/08/06 职场文书