Python Pygame 按两个方向键和另一个键射击没有子弹

2024-01-24

I am trying to make a ship shoot a bullet, and everything it works as expected except when I press both UP, LEFT and then SPACE. Then there's no bullet being fired. There's no bullet being fired for RIGHT + DOWN + SPACE, UP + LEFT + SPACE either.

However, when I press both UP, RIGHT and then SPACE, it workes. In fact, every other direction key LEFT + DOWN, UP + RIGHT, UP + DOWN works with SPACE key.

这是代码:

 #!/usr/bin/python
import sys
import pygame 

class Setting:
    def __init__(self, width, height):
        self.w = width
        self.h = height
        self.flag = pygame.RESIZABLE
        self.color = (255, 255, 255)
        self.speed = 1.5
        self.screen = pygame.display.set_mode((self.w, self.h), self.flag)
        pygame.display.set_caption("Muhaha")
        self.bullet_s = 1.5
        self.bullet_w = 5
        self.bullet_h = 20
        self.bullet_c = (0, 0, 0)

class Bullet(pygame.sprite.Sprite):
    def __init__(self, setting, char):
        super().__init__()
        self.rect = pygame.Rect(0, 0, setting.bullet_w, setting.bullet_h)
        self.rect.centerx = char.ship_rect.centerx
        self.rect.top = char.ship_rect.top
        self.color = setting.bullet_c
        self.speed = setting.bullet_s
        self.y = float(self.rect.centery)
    
    def move_bullet(self):
        self.y -= self.speed
        self.rect.y = self.y
    
    def draw_bullet(self, setting):
        pygame.draw.rect(setting.screen, self.color, self.rect)

    def blit_bullet(self, bullets, setting):
        for bullet in bullets.sprites():
             pygame.draw.rect(setting.screen, bullet.color, bullet.rect)
             bullet.y -= bullet.speed
             bullet.rect.y = bullet.y
       

class Char:
    def __init__(self, screen, setting):
        bk = pygame.image.load("image/muha.png").convert()
        self.bkg = pygame.transform.smoothscale(bk, (setting.w, setting.h))
        temp = pygame.image.load("image/title.jpg").convert_alpha()
        self.ship = pygame.transform.smoothscale(temp, (200, 200))
        self.screen = screen
        self.screen_rect = screen.get_rect()
        self.ship_rect = self.ship.get_rect()

        self.ship_rect.center = self.screen_rect.center
        self.ship_rect.bottom = self.screen_rect.bottom
       
        self.x = float(self.ship_rect.centerx)
        self.y = float(self.ship_rect.centery)

    def blit_screen(self):
        self.screen.blit(self.bkg, (0, 0))
    
    def blit_ship(self):
        self.screen.blit(self.ship, self.ship_rect)

        
class Check_event:
     def __init__(self):
        self.moving_up   = False
        self.moving_down = False
        self.moving_left = False
        self.moving_right = False
     
     def event(self, bullets, setting, char):      
         for event in pygame.event.get():
             if event.type == pygame.QUIT:
                 sys.exit()
             elif event.type == pygame.KEYDOWN:
                 if event.key == pygame.K_SPACE:
                    bullets.add(Bullet(setting, char))
                 elif event.key == pygame.K_UP:
                     self.moving_up = True
                 elif event.key == pygame.K_DOWN:
                     self.moving_down = True
                 elif event.key == pygame.K_LEFT:
                     self.moving_left = True
                 elif event.key == pygame.K_RIGHT:
                     self.moving_right = True

             elif event.type == pygame.KEYUP:
                 if event.key == pygame.K_UP:
                     self.moving_up = False
                 elif event.key == pygame.K_DOWN:
                     self.moving_down = False
                 elif event.key == pygame.K_LEFT:
                     self.moving_left = False
                 elif event.key == pygame.K_RIGHT:
                     self.moving_right = False

     def move(self, setting, char):
         if self.moving_up == True and char.ship_rect.top >= 0:
            char.y -= setting.speed
         if self.moving_down == True and char.ship_rect.bottom <= setting.h:
             char.y += setting.speed
         if self.moving_left == True and char.ship_rect.left >= 0:
             char.x -= setting.speed
         if self.moving_right == True and char.ship_rect.right <= setting.w:
             char.x += setting.speed
             # press both "up" &"left" then press "space"
         char.ship_rect.centerx = char.x
         char.ship_rect.centery = char.y

def game():
    pygame.init()
    setting = Setting(1200, 800)
    screen = setting.screen 
    char = Char(screen, setting)
    check_event = Check_event()
    bullet = Bullet(setting, char)
    bullets = pygame.sprite.Group()
                      

    while True:
        check_event.event(bullets, setting, char)
        
        char.blit_screen()
        check_event.event(bullets, setting, char)
        check_event.move(setting, char)
        bullet.blit_bullet(bullets, setting)
        
        char.blit_ship()
        pygame.display.flip()
game()

If you press UP + LEFT + SPACE then the SPACE key doesn't appear to be pressed immediately. You've to release the UP or LEFT key to get the pygame.KEYDOWN event for SPACE.

这是 pygame 中的一个已知错误,似乎尚未解决:按键处理不正确#235 https://github.com/pygame/pygame/issues/235

Sadly even pygame.key.get_pressed() https://www.pygame.org/docs/ref/key.html#pygame.key.get_pressed doesn't state the SPACE key in this case, so I can't even think a workaround.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python Pygame 按两个方向键和另一个键射击没有子弹 的相关文章

  • 在 Python 中,部分函数应用(柯里化)与显式函数定义

    在 Python 中 以下方式是否被认为是更好的风格 根据更一般的 可能是内部使用的功能显式定义有用的功能 或者 使用偏函数应用来显式描述函数柯里化 我将通过一个人为的例子来解释我的问题 假设编写一个函数 sort by scoring 它
  • 以 str.format 切片字符串

    我想实现以下目标str format x y 1234 5678 print str x 2 str y 2 我能够做到这一点的唯一方法是 print 0 1 format str x 2 str y 2 现在 这是一个例子 我真正拥有的是
  • 使用 glGetFloatv 检索 pyglet 中的模型视图矩阵

    我正在使用 pyglet 在 python 中进行 3D 可视化 并且需要检索模型视图和投影矩阵来进行一些选择 我使用以下方式定义我的窗口 from pyglet gl import from pyglet window import wi
  • 当语料库有100亿个独特的DNA序列时,如何使用BK树实现快速模糊搜索引擎?

    我正在尝试使用BK tree https news ycombinator com item id 14022424python 中的数据结构 用于存储约 100 亿个条目的语料库 1e10 以实现快速模糊搜索引擎 一旦我添加超过 1000
  • Huggingface 变形金刚模块未被 anaconda 识别

    我正在使用 Anaconda python 3 7 Windows 10 我尝试通过安装变压器https huggingface co transformers https huggingface co transformers 在我的环境
  • 将文件标记为从 Python 中删除?

    在我的一个脚本中 我需要删除当时可能正在使用的文件 我知道我无法删除正在使用的文件 直到它不再使用为止 但我也知道我可以将该文件标记为由操作系统 Windows XP 删除 我将如何在 Python 中做到这一点 以及另一个不依赖于 pyw
  • TCP打孔问题

    我尝试使用 Python 3 中概述的原则为防火墙编写一个基本的 TCP 打孔器本文 http www bford info pub net p2pnat index html 不过 我无法连接任何东西 这是代码 usr bin pytho
  • Python实时读取串口数据

    我正在使用 Python 中的脚本通过串行端口以 2Mbps 的速度从 PIC 微控制器收集数据 PIC 在 2Mbps 下完美定时工作 FTDI USB 串行端口在 2Mbps 下工作也很好 均通过示波器验证 我每秒发送消息 大小约为 1
  • 将数字转换为整数列表[重复]

    这个问题在这里已经有答案了 我该如何写magic下面的函数 gt gt gt num 123 gt gt gt lst magic num gt gt gt gt gt gt print lst type lst 1 2 3
  • 使用pip安装pylibmc时出错

    您好 当我尝试使用 pip 在 OSX Lion 上安装 pylibmc 时 出现以下错误 pylibmcmodule h 42 10 fatal error libmemcached memcached h file not found
  • 使用 Python 将阿拉伯语或任何从右到左书写系统的字符串打印到 Linux 终端

    非常简单的例子是 city print city 我期望输出是 但实际上输出是相反的字符串 字母看起来有点不同 因为它们有开始 中间和结束形式 我无法将其粘贴到此处 因为复制粘贴会再次更正字符串的顺序 如何在 Linux 终端上正确打印阿拉
  • 按字符串子字符串的列过滤 Pandas 数据框

    我正在尝试使用列中的字符串值是数据框外部字符串的子字符串的条件来过滤数据框 下面的例子 df a b c hello bye hello reference str hello there output a c 一种方法可能是使用正则表达式
  • 为什么最简单的 requests_mock 示例在 pytest 中失败?

    我有一个特殊的问题requests mock 我想用它pytest测试我的 API 包装器库 我尝试过使用requests mock 文档中的第一个示例 http requests mock readthedocs io en latest
  • 如何从 Python 3.5 降级到 3.4

    我想安装 kivy 链接在这里 https kivy org docs installation installation windows html install win dist 用于项目 但是 当尝试使用 pip 安装它所依赖的包时
  • 是否可以在 Jupyter 笔记本中显示控制台?

    我希望能够使用 Jupyter 笔记本中的控制台在环境中进行摆弄 添加额外的单元格意味着我总是必须滚动到最底部或在我想要 类似控制台 文本字段的任何地方创建新单元格 是否可以有一个永久的控制台窗口 例如在窗口底部 Thanks 您可以启动连
  • 从网站上抓取数字和详细信息的数据

    我想从网站上抓取联系电话以及快递服务的相应详细信息 我无法从所有快递服务中获取联系电话和其他详细信息 例如姓名地址和评级 我分析的数据位于脚本标签中 请提出修复此问题的建议 import requests import pandas as
  • 如何向 RetrievalQA.from_chain_type 添加内存?或者,如何向 ConversationalRetrievalChain 添加自定义提示?

    如何向 RetrievalQA from chain type 添加内存 或者 如何向 ConversationalRetrievalChain 添加自定义提示 在过去的两周里 我一直在尝试制作一个可以通过文档聊天的聊天机器人 因此不仅仅是
  • 执行许多插入重复键更新错误:未使用所有参数

    所以我一直在尝试使用 python 2 7 15 使用 mysql connector 执行此查询 但由于某种原因 它似乎不起作用并且总是返回错误 并非所有参数都被使用 表更新有一个主键 即 ID 这是我尝试运行此 SQL 的查询 sql
  • 对 Python 列表元素进行分组

    我有一个 python 列表 如下所示 my list 25 1 0 65 25 3 0 63 25 2 0 62 50 3 0 65 50 2 0 63 50 1 0 62 我想根据以下规则对它们进行排序 1 gt 0 65 0 62 l
  • 将 .parquet 编码为 io.Bytes

    目标 将 Parquet 文件上传到 MinIO 这需要将文件转换为字节 我已经能够做到这一点了 csv json and txt bytes data to csv encode utf 8 bytes json dumps self d

随机推荐