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实现一个简单的多线程TCP服务器的教程
May 05 Python
浅谈Python单向链表的实现
Dec 24 Python
详细介绍Python的鸭子类型
Sep 12 Python
利用aardio给python编写图形界面
Aug 21 Python
Python连接Redis的基本配置方法
Sep 13 Python
python实现知乎高颜值图片爬取
Aug 12 Python
在Python中字符串、列表、元组、字典之间的相互转换
Nov 15 Python
tensorflow之tf.record实现存浮点数数组
Feb 17 Python
详解用Python调用百度地图正/逆地理编码API
Jul 02 Python
Django ORM判断查询结果是否为空,判断django中的orm为空实例
Jul 09 Python
解决Python 写文件报错TypeError的问题
Oct 23 Python
Python办公自动化之教你如何用Python将任意文件转为PDF格式
Jun 28 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
自编函数解决pathinfo()函数处理中文问题
2014/11/03 PHP
yii 2.0中表单小部件的使用方法示例
2017/05/23 PHP
PHP实现批量重命名某个文件夹下所有文件的方法
2017/09/04 PHP
js菜单点击显示或隐藏效果的简单实例
2014/01/13 Javascript
js鼠标滑轮滚动事件绑定的简单实例(兼容主流浏览器)
2014/01/14 Javascript
javascript中style.left和offsetLeft的用法说明
2014/03/07 Javascript
javascript异步编程代码书写规范Promise学习笔记
2015/02/11 Javascript
jQuery实现菜单式图片滑动切换
2015/03/14 Javascript
省市区三级联动下拉框菜单javascript版
2015/08/11 Javascript
BootstrapValidator超详细教程(推荐)
2016/12/07 Javascript
Bootstrap Table使用整理(三)
2017/06/09 Javascript
JavaScript条件判断_动力节点Java学院整理
2017/06/26 Javascript
基于LayUI实现前端分页功能的方法
2017/07/22 Javascript
原生js实现简单的焦点图效果实例
2017/12/14 Javascript
AngularJS实现的简单拖拽功能示例
2018/01/02 Javascript
Vue 动态设置路由参数的案例分析
2018/04/24 Javascript
vue实现的下拉框功能示例
2019/01/29 Javascript
JavaScript ES6常用基础知识总结
2019/02/09 Javascript
pm2发布node配置文件ecosystem.json详解
2019/05/15 Javascript
如何在Node和浏览器控制台中打印彩色文字
2020/01/09 Javascript
Vue 监听元素前后变化值实例
2020/07/29 Javascript
jQuery实现容器间的元素拖拽功能
2020/12/01 jQuery
Python字典推导式将cookie字符串转化为字典解析
2019/08/10 Python
解决django接口无法通过ip进行访问的问题
2020/03/27 Python
django model的update时auto_now不被更新的原因及解决方式
2020/04/01 Python
python:删除离群值操作(每一行为一类数据)
2020/06/08 Python
Subside Sports德国:足球球衣和球迷商品
2019/06/08 全球购物
《纸船和风筝》教学反思
2014/02/15 职场文书
玩手机检讨书1000字
2014/10/20 职场文书
2016年第32个教师节红领巾广播稿
2015/12/18 职场文书
关于做家务的心得体会
2016/01/23 职场文书
申论不会写怎么办?教您掌握这6点思维和原则
2019/07/17 职场文书
Python使用random模块实现掷骰子游戏的示例代码
2021/04/29 Python
Java并发编程之Executor接口的使用
2021/06/21 Java/Android
排查并解决MySQL生产库内存使用率高的报警
2022/04/11 MySQL
MySQL表字段数量限制及行大小限制详情
2022/07/23 MySQL