Невозможно выстрелить более чем одним снарядом - PullRequest
0 голосов
/ 02 августа 2020

Стрельба одной пулей работает, но я могу выстрелить только одной, и после этого она перестает работать. Я попытался изменить свой "bullet_fire" на False после KEYUP, но это тоже не работает, с тех пор пуля видна только пока я удерживаю клавишу со стрелкой вверх, пока проблема остается. Как мне решить эту проблему? Вот код:

import pygame

pygame.init()

# Skärm
Screen = pygame.display.set_mode((1600, 900))

# Title och Logo
pygame.display.set_caption("Fjärt Spel")
icon = pygame.image.load('planet.png')
pygame.display.set_icon(icon)

# backround
backround = pygame.image.load("0000.png")

# player
playerIMG = pygame.image.load("soldier.png")
playerX = 350
playerY = 836

playerX_Change = 0
playerY_Change = 30

# enemy
enemyIMG = pygame.image.load("terrorist2.png")
enemyX = 500
enemyY = 810

enemyX_Change = 0
enemyY_Change = 0

# bullet

bulletIMG = pygame.image.load("pung(32x32).png")
bulletX = playerX
bulletY = playerY

bulletX_Change = 50
bulletY_Change = 0
bullet_fire = False


offScreen = 1600, 900


def player(x, y):
    Screen.blit(playerIMG, (x, y))


def enemy(x, y):
    Screen.blit(enemyIMG, (x, y))



Running = True
while Running:

    Screen.fill((0, 0, 0))
    # backround
    Screen.blit(backround, (0, 0))

    if bullet_fire == True:
        Screen.blit(bulletIMG, (bulletX + 100, playerY))
        bulletX += bulletX_Change
    if bulletX > 1600:
        bullet_fire == False


    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            Running = False

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                playerX_Change = -10
            if event.key == pygame.K_RIGHT:
                playerX_Change = 10
            if event.key == pygame.K_SPACE:
                playerY_Change = -70
            if event.key == pygame.K_UP:
                bullet_fire = True



        if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT or event.key == pygame.K_SPACE:
                playerX_Change = 0
                playerY_Change = 30




    # Ha player innan fill!!
    playerX += playerX_Change
    playerY += playerY_Change

    if playerX <= 0:
        playerX = 0
    elif playerX >= 1436:
        playerX = 1436
    if playerY <= 0:
        playerY = 0
    elif playerY >= 836:
        playerY = 836




    player(playerX, playerY)
    enemy(enemyX, enemyY)

    pygame.display.update()

1 Ответ

2 голосов
/ 02 августа 2020
if bulletX > 1600:
    bullet_fire == False
#               ^^

Этот появляется , чтобы захотеть установить bullet_fire на False, когда он достигает определенной ординаты, но на самом деле сравнивает два и отбрасывает результат. Это означает, что первая выпущенная вами пуля все еще летит, покинула экран и, вероятно, уже находится на полпути к Юпитеру: -)

В качестве примера это похоже на следующую расшифровку:

>>> a = 7
>>> if a == 7:
...     a == 14
...     print(a)
...
False
7

Необходимо использовать == для сравнения и = для присвоения.

Имейте в виду, что вероятная причина вашей проблемы. Поскольку ваш вопрос не содержит кода, который решает, следует ли создавать новую пулю, сложно сказать наверняка. Поэтому я основываю это на предположении, что все, что разрешено, - это одна пуля за раз (как и во многих аркадных играх). Следовательно, если вы никогда не «уничтожите» текущую пулю, вы никогда не сможете запустить другую.

Если это окажется, что не , то вам, вероятно, нужно опубликовать больше кода, чтобы мы могли провести исчерпывающий анализ.

В стороне, меня немного беспокоит физика, связанная с:

Screen.blit(bulletIMG, (bulletX + 100, playerY))

Кажется, что пуля отображается в текущей позиции игрока Y, что означает, что после выстрела пули , он будет отслеживать игрока каким-то странным эйнштейновским «жутким действием на расстоянии». Хотя это значительно упрощает игру, поскольку вы можете направлять пули после выстрела, я не уверен, что он получит высокий балл в категории реализма: -)

...