【问题标题】:How to shoot while moving in pygame如何在pygame中移动时射击
【发布时间】:2020-05-16 15:13:59
【问题描述】:

我在所有游戏中都注意到一个奇怪的事情,即如果我移动,我的玩家会停止射击,无论是当我移动时玩家已经在射击,还是当我尝试射击时玩家已经在移动,如果我移动,拍摄停止。这是我在最近制作的一款游戏中用来移动玩家的代码:

def move(self):
    keys = pygame.key.get_pressed()

    if keys[pygame.K_d]:
        self.x += self.speed
    if keys[pygame.K_a]:
        self.x -= self.speed

为了拍摄,我这样做:

     def handle_events():
          if event.type ==  pygame.MOUSEBUTTONDOWN:
          game.bullets.append(Bullet())

任何帮助将不胜感激。 还有一个旁注:如果有人知道一般代码中可能导致这种情况的某些东西(因为它发生在我所有的游戏中),请发表评论,以便我可以用相关代码更新问题,因为现在我不知道可能是什么导致这。

编辑:我最近注意到的一点是玩家在被重力拉下时仍然可以射击(从技术上讲,它仍然在移动)。所以我猜测在我按下键(任何键,而不仅仅是我在代码中包含的键)时会发生一些事情,这会导致玩家无法射击。

我的handle_evnets() 函数实际上只是处理关闭游戏和按下鼠标按钮。无论如何,这是代码:

   def handle_events():
        for event in events:
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()

            if event.type ==  pygame.MOUSEBUTTONDOWN:
                game.bullets.append(Bullet())

这是添加到game.bullets if MOUSEBUTTONDOWN 的子弹类

class Bullet:
        def __init__(self):
            self.pos = [(player.x - 10 - scroll[0]), (player.y + 15 - scroll[1])]
            self.height = 3
            self.width = 20
            self.bullet = pygame.Surface((self.width, self.height)).convert_alpha()
            self.bullet.fill((255, 255, 255))
            self.dir = [(mouse.x - (player.x - 10 - scroll[0])),  (mouse.y - (player.y + 15 - scroll[1]))]
            self.distance = math.hypot(self.dir[0], self.dir[1])
            self.dir = [(self.dir[0]/ self.distance), (self.dir[1]/ self.distance)]
            angle = math.degrees(math.atan2((-self.dir[1]), self.dir[0]))
            self.bullet = pygame.transform.rotate(self.bullet, (angle))
            self.speed = 10

这是 Game 类,子弹添加到 shoot_bullet() 函数后会发生什么。

 class Game:
    def __init__(self):
    self.bullets = []


    def shoot_bullet(self):
        for bullet in self.bullets:
            bullet.pos[0] += bullet.dir[0] * bullet.speed
            bullet.pos[1] += bullet.dir[1] * bullet.speed
            D.blit(bullet.bullet, (bullet.pos[0], bullet.pos[1]))

【问题讨论】:

  • 如果没有看到 move()handle_events() 如何链接在一起,就无法回答
  • Move 不是由 handle_events() 函数处理的(它由“pygame.key.get_pressed()”完成)所以我猜它们之间没有联系,但对于由 handle_event 函数处理的子弹,我已经更新了问题
  • 在主循环中是否同时调用了move()handle_events() 总是?创建子弹时,我还会打印Bullet.pos。也许子弹正在发射,但不知何故他们不在屏幕上。 scroll[] 什么时候更新?
  • 我尝试在移动时打印 bullet.pos,但它没有显示任何内容,因为“game.bullets”列表为空。我认为它真正归结为“pygame.MOUSEBUTTONDOWN”如果按下任何键都不起作用。

标签: python pygame


【解决方案1】:

我认为它真正归结为“pygame.MOUSEBUTTONDOWN”如果按下任何键都不起作用。

没有。问题与变量events有关:

def handle_events():
   for event in events:
       #[...]

       if event.type ==  pygame.MOUSEBUTTONDOWN:
           game.bullets.append(Bullet())

上述函数访问全局命名空间中的变量events,但该列表似乎根本不包含事件。
在你的代码中的某个地方你做events = pygame.event.get()。但这可能在函数或方法的范围内。这导致在本地名称空间中生成了一个新变量events,而全局变量events没有更新。

您有两种解决问题的方法。添加参数handle_events 并将events 传递给handle_events

def handle_events(events):
    for event in events:
        #[...]

        if event.type ==  pygame.MOUSEBUTTONDOWN:
            game.bullets.append(Bullet())

或确保在获取事件时使用global statement 设置全局命名空间中的变量events
你在哪里做events = pygame.event.get(),在前面加上global events

global events
events = pygame.event.get() 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-13
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    相关资源
    最近更新 更多