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自动化测试之setUp与tearDown实例
Sep 28 Python
使用Python对IP进行转换的一些操作技巧小结
Nov 09 Python
Python贪吃蛇游戏编写代码
Oct 26 Python
Python实现的密码强度检测器示例
Aug 23 Python
聊聊python里如何用Borg pattern实现的单例模式
Jun 06 Python
python中对数据进行各种排序的方法
Jul 02 Python
利用python求积分的实例
Jul 03 Python
Python绘制堆叠柱状图的实例
Jul 09 Python
python数据分析工具之 matplotlib详解
Apr 09 Python
Expected conditions模块使用方法汇总代码解析
Aug 13 Python
python 调用API接口 获取和解析 Json数据
Sep 28 Python
Pandas-DataFrame知识点汇总
Mar 16 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解答方法
2012/02/04 PHP
ThinkPHP模板输出display用法分析
2014/11/26 PHP
Session 失效的原因汇总及解决丢失办法
2015/09/30 PHP
一段实用的php验证码函数
2016/05/19 PHP
PHP中静态变量的使用方法实例分析
2016/12/01 PHP
php提供实现反射的方法和实例代码
2019/09/17 PHP
JSQL SQLProxy 的 php 版本代码
2010/05/05 Javascript
JavaScript实现的一个日期格式化函数分享
2014/12/06 Javascript
jquery实现标签上移、下移、置顶
2015/04/26 Javascript
深入学习jQuery Validate表单验证(二)
2016/01/18 Javascript
D3.js实现折线图的方法详解
2016/09/21 Javascript
JQuery Dialog对话框 不能通过Esc关闭的原因分析及解决办法
2017/01/18 Javascript
bootstrapValidator.min.js表单验证插件
2017/02/09 Javascript
详解ES6语法之可迭代协议和迭代器协议
2018/01/13 Javascript
使用proxy实现一个更优雅的vue【推荐】
2018/06/19 Javascript
解决layui前端框架 form表单,table表等内置控件不显示的问题
2018/08/19 Javascript
Next.js项目实战踩坑指南(笔记)
2018/11/29 Javascript
Vue CLI 3.x 自动部署项目至服务器的方法
2019/04/02 Javascript
jQuery实现文本显示一段时间后隐藏的方法分析
2019/06/20 jQuery
es6中比较有用的7个技巧小结
2019/07/12 Javascript
[36:33]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第二场 11.29
2020/12/02 DOTA
python实现简单的计时器功能函数
2015/03/14 Python
Python3的urllib.parse常用函数小结(urlencode,quote,quote_plus,unquote,unquote_plus等)
2016/09/18 Python
python登录并爬取淘宝信息代码示例
2017/12/09 Python
Python实现繁体中文与简体中文相互转换的方法示例
2018/12/18 Python
python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形)
2019/05/30 Python
Django文件上传与下载(FileFlid)
2019/10/06 Python
Django Haystack 全文检索与关键词高亮的实现
2020/02/17 Python
英国一家集合了众多有才华设计师品牌的奢侈店:Wolf & Badger
2018/04/18 全球购物
Troy-Bilt官网:草坪割草机、吹雪机、分蘖机等
2019/02/19 全球购物
业务员岗位职责范本
2013/12/15 职场文书
快递业务员岗位职责
2014/01/06 职场文书
三严三实对照检查材料
2014/08/25 职场文书
授权委托书(公民个人适用)
2014/09/19 职场文书
2016年小学“我们的节日·中秋节”活动总结
2016/04/05 职场文书
如何更改Win11声音输出设备?Win11声音输出设备四种更改方法
2022/04/08 数码科技