【问题标题】:First shot fired is superimposed by second shot or simply disappears after second shot and etc第一次射击被第二次射击叠加或在第二次射击后消失等等
【发布时间】:2020-02-13 16:07:10
【问题描述】:

如果我在短时间内发射第二颗子弹,我正在尝试解决触发子弹消失的原因。我想screen.fill(GRAY) 可能是一个原因,它应该在Class Bullet() 内,或者我可能需要在其他地方使用all_sprites_list.update()

这是我的 MWE 代码:

import pygame
BLUE = (0, 0, 255)
GREEN = (0, 255, 0)
GRAY = (128,128,128)
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
class Cowboy(pygame.sprite.Sprite):
      def __init__(self):
          super().__init__()

          self.image = pygame.Surface([14,20])
          self.image.fill(BLUE)
          self.rect = self.image.get_rect()
class Bullet(pygame.sprite.Sprite):
      def __init__(self):
          super().__init__()
          self.image = pygame.image.load("bullet.png").convert()
          self.rect = self.image.get_rect()
      def update(self):
         self.rect.y += -3
def main():
    pygame.init()
    size = [SCREEN_WIDTH, SCREEN_HEIGHT]
    screen = pygame.display.set_mode(size, pygame.RESIZABLE) 
    all_sprites_list = pygame.sprite.Group()
    bullet_list = pygame.sprite.Group() 
    enemies_list = pygame.sprite.Group()
    bullet = Bullet()
    enemy = Cowboy()
    enemies_list.add(enemy)
    all_sprites_list.add(enemy)
    enemy.rect.y = 50
    enemy.rect.x = 50
    done = False
    clock = pygame.time.Clock()
    while not done:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                done = True
            elif event.type == pygame.MOUSEBUTTONDOWN:
                bullet_list.add(bullet)
                all_sprites_list.add(bullet)
                bullet.rect.x = 340
                bullet.rect.y = 200
        screen.fill(GRAY)
        all_sprites_list.draw(screen)
        clock.tick(60)
        pygame.display.flip()
    pygame.quit()
if __name__ == "__main__":
    main()

【问题讨论】:

  • 我无法运行您的代码(灰屏),但从您描述的症状来看,我的猜测是问题在于您只有一个项目符号实例,因此它只有一组参数(喜欢的位置)。因此,您应该在每次拍摄时都实例化新的Bullet 实例,而不是重复使用。此外,您还需要清理它(例如,删除离开屏幕的子弹)。

标签: python class pygame updates bullet


【解决方案1】:

你必须创建一个Bullet的新实例,当鼠标按钮被按下并且你必须调用bullet_list上的update的子弹的update方法:

def main():
    # [...]

    # bullet = Bullet() <--- DELETE

    # [...]
    while not done:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                done = True
            elif event.type == pygame.MOUSEBUTTONDOWN:

                # create new bullet and add it to the groups
                bullet = Bullet()
                bullet.rect.center = enemy.rect.center
                bullet_list.add(bullet)
                all_sprites_list.add(bullet)

        # update the bullets
        bullet_list.update()

        # [...]

【讨论】:

  • 谢谢XD!在发布问题之前,我已经使用了所有这些缺失的代码,但也许我还没有弄清楚如何按照你的答案的正确顺序组合它们。所以,有了你的解释,我可以继续学习正确使用 pygame 模块。
【解决方案2】:
import pygame
BLUE = (0, 0, 255)
GREEN = (0, 255, 0)
GRAY = (128,128,128)
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
class Cowboy(pygame.sprite.Sprite):
      def __init__(self):
          super().__init__()

          self.image = pygame.Surface([14,20])
          self.image.fill(BLUE)
          self.rect = self.image.get_rect()
class Bullet(pygame.sprite.Sprite):
      def __init__(self, x, y):
          pygame.sprite.Sprite.__init__(self)
          self.image = pygame.image.load("bullet.png").convert()
          self.rect = self.image.get_rect()
          self.rect.x = x
          self.rect.y = y
      def update(self):
         self.rect.y += -3
def main():
    pygame.init()
    size = [SCREEN_WIDTH, SCREEN_HEIGHT]
    screen = pygame.display.set_mode(size, pygame.RESIZABLE) 
    all_sprites_list = pygame.sprite.Group()
    bullet_list = pygame.sprite.Group() 
    enemies_list = pygame.sprite.Group()
    bullet = Bullet(340, 240)
    enemy = Cowboy()
    enemies_list.add(enemy)
    all_sprites_list.add(enemy)
    enemy.rect.y = 50
    enemy.rect.x = 50
    done = False
    clock = pygame.time.Clock()
    while not done:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                done = True
            elif event.type == pygame.MOUSEBUTTONDOWN:
                bullet = Bullet(340, 200)
                bullet_list.add(bullet)
                all_sprites_list.add(bullet)
                bullet.rect.x = 340
                bullet.rect.y = 200
        screen.fill(GRAY)
        all_sprites_list.update()
        all_sprites_list.draw(screen)
        clock.tick(60)
        pygame.display.flip()
    pygame.quit()
if __name__ == "__main__":
    main()

【讨论】:

  • 我的 MWE 代码是我正在处理的更大代码的一部分。所以你的答案有效,但我通过阐明如何找到错误原因的步骤将另一个答案标记为已解决。尽管您还通过仅发布更正的代码来隐含地查明您的响应中的错误原因。所以我也感谢你的帮助。 @SartajAnsari 谢谢XD
猜你喜欢
  • 2017-07-03
  • 1970-01-01
  • 2013-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-06
  • 1970-01-01
  • 2023-03-14
相关资源
最近更新 更多