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/ironpython:从入门到精通
Oct 02 Python
pymssql ntext字段调用问题解决方法
Dec 17 Python
python基础教程之自定义函数介绍
Aug 29 Python
Python使用multiprocessing创建进程的方法
Jun 04 Python
Python创建二维数组实例(关于list的一个小坑)
Nov 07 Python
Python编程实现蚁群算法详解
Nov 13 Python
详解python中的Turtle函数库
Nov 19 Python
对python 读取线的shp文件实例详解
Dec 22 Python
对Python实现累加函数的方法详解
Jan 23 Python
python对绑定事件的鼠标、按键的判断实例
Jul 17 Python
Python简易版停车管理系统
Aug 12 Python
Python 使用Opencv实现目标检测与识别的示例代码
Sep 08 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设计模式之命令模式的应用详解
2013/05/21 PHP
PHP取余函数介绍MOD(x,y)与x%y
2014/05/15 PHP
Linux下PHP连接Oracle数据库
2014/08/20 PHP
Codeigniter购物车类不能添加中文的解决方法
2014/11/29 PHP
用window.location.href实现刷新另个框架页面
2007/03/07 Javascript
AppBaseJs 类库 网上常用的javascript函数及其他js类库写的
2010/03/04 Javascript
关于URL中的特殊符号使用介绍
2011/11/03 Javascript
jQuery EasyUI API 中文文档 - DataGrid数据表格
2011/11/17 Javascript
推荐40个简单的 jQuery 导航插件和教程(下篇)
2012/09/14 Javascript
AngularJS 模型详细介绍及实例代码
2016/07/27 Javascript
Bootstrap分页插件之Bootstrap Paginator实例详解
2016/10/15 Javascript
Bootstrap实现基于carousel.js框架的轮播图效果
2017/05/02 Javascript
React中使用UEditor百度富文本的方法
2018/08/22 Javascript
vue动画打包后失效问题的解决方法
2018/09/18 Javascript
微信小程序云开发使用方法新手初体验
2019/05/16 Javascript
浅谈在vue-cli3项目中解决动态引入图片img404的问题
2020/08/04 Javascript
Node.js利用Express实现用户注册登陆功能(推荐)
2020/10/26 Javascript
[04:44]DOTA2英雄梦之声_第12期_矮人直升机
2014/06/21 DOTA
[33:17]OG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Django读取Mysql数据并显示在前端的实例
2018/05/27 Python
解决vscode python print 输出窗口中文乱码的问题
2018/12/03 Python
Python3.5 处理文本txt,删除不需要的行方法
2018/12/10 Python
Python Selenium 之关闭窗口close与quit的方法
2019/02/13 Python
Python 隐藏输入密码时屏幕回显的实例
2019/02/19 Python
python实现人工智能Ai抠图功能
2019/09/05 Python
Python实现汇率转换操作
2020/05/03 Python
Python实现电视里的5毛特效实例代码详解
2020/05/15 Python
迷你唐卡软皮鞋:Minnetonka Moccasin
2018/05/01 全球购物
为什么说Ruby是一种真正的面向对象程序设计语言
2012/10/30 面试题
法学专业应届生求职信
2013/10/16 职场文书
《再别康桥》教学反思
2014/02/12 职场文书
我的兄弟姐妹观后感
2015/06/15 职场文书
小学教师读书笔记
2015/07/01 职场文书
物资采购管理制度
2015/08/06 职场文书
2019年教师节祝福语精选,给老师送上真诚的祝福
2019/09/09 职场文书
详解Python中__new__方法的作用
2022/03/31 Python