【问题标题】:Why can't I shoot with pygame?为什么我不能用 pygame 射击?
【发布时间】:2020-06-01 18:09:33
【问题描述】:

我一直在尝试用 Python 和 Pygame 做一些很酷的东西来取乐。我对 Python 大致了解一两件事,但我是 Pygame 的初学者。 所以问题是:我创建了一个可移动的玩家和一个移动的敌人。当我按下空格键时,我想让玩家射击。我加载了一个 .png 图像,定义了一个射击函数,并让子弹在射击后保持移动。出于某种原因,当我调用该函数时,它什么也不做。它甚至没有给出错误。我知道我只能用当前代码和诸如此类的东西射出一颗子弹,但我只想让当前代码开始工作。

"""
player and enemy functions are defined above and work well, I didn't include
them in this post for the sake of saving everyone's time
"""

# bullet
bullet_pic = pygame.image.load("bullet.png")
bullet_pic_reverse = pygame.image.load("bullet reverse.png")
bullet_state = "nope"
def shoot(pic, x, y):
    global bullet_state
    bullet_state = "jes"
    screen.blit(pic, (x, y + 30))

player_dir = player_pic # direction of the player (left or right)
enemy_dir = enemy_pic # direction of the enemy
enemyX_change = 2.5
running = True
while running:
    screen.blit(back, (0, 0)) # background picture
    player(player_dir, playerX, playerY)
    enemy(enemy_dir, enemyX, enemyY)
    pygame.display.update()

    for event in pygame.event.get():
        if event.type == pygame.QUIT or event.type == pygame.KEYDOWN and event.key == K_ESCAPE:
            running = False
        elif event.type == pygame.KEYDOWN:
            # shooting
            if event.key == K_SPACE:
                if player_dir == player_pic:
                    bulletX = playerX + 100
                    bulletX_change = 20
                    bullet_dir = bullet_pic
                else:
                    bulletX = playerX
                    bulletX_change = -20
                    bullet_dir = bullet_pic_reverse
                shoot(bullet_dir, bulletX, playerY)

    # player movement
    hold = pygame.key.get_pressed()
    if hold[K_LEFT] and playerX > 0:
        playerX -= 7
        player_dir = player_pic_reverse
    if hold[K_RIGHT] and playerX < 1100:
        playerX += 7
        player_dir = player_pic

    # enemy movement
    enemyX += enemyX_change
    if enemyX >= 1125:
        enemyX_change = -2.5
        enemy_dir = enemy_pic_reverse
    elif enemyX <= 900:
        enemyX_change = 2.5
        enemy_dir = enemy_pic

    # bullet constant movement
    if bullet_state == "jes":
        shoot(bullet_dir, bulletX, playerY)
        bulletX += bulletX_change

【问题讨论】:

  • 我在 else 语句之外调用它。每次按空格时,我都会调用它,而不管 player_dir 等于什么。当然,如果我错了,请纠正我。

标签: python pygame


【解决方案1】:

我认为问题在于pygame.display.update(),您应该始终将其放在while running: 循环的末尾。如果您在调用shoot() 之前更新显示,背景图片将覆盖子弹图片,您将看不到它。

另一件事,你写K_ESCAPE 而不是pygame.K_ESCAPE 与空格键相同。它是否适合您?我有一段时间没有用 pygame 做任何事情,也许没问题,但检查一下 :)

【讨论】:

  • 谢谢。您的解决方案实际上从未在我脑海中浮现,哈哈,但是现在可以了。另外,我知道很多人把它写成pygame.K_ESCAPE,但没有pygame. 前缀也能正常工作。
猜你喜欢
  • 2023-01-27
  • 1970-01-01
  • 1970-01-01
  • 2020-03-15
  • 2012-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多