Изображение не будет правильно перемещаться в окне Pygame - PullRequest
0 голосов
/ 11 ноября 2019

Я работаю над проектом, который я начал с учебника по YouTube, чтобы переделать что-то похожее на игру космических захватчиков. У меня была игра, работающая правильно, но я хотел реализовать опцию перезапуска для пользователя, как только игра закончилась. Я попытался поместить весь свой код в функцию main (), чтобы после окончания игры я мог дать пользователю возможность снова играть, а если он решил играть снова, я мог просто вызвать функцию main (), чтобы перезапустить код. ,Все работает точно так же после ввода моего кода в функцию main (), за исключением запуска пуль. Это должно работать так, что всякий раз, когда пользователь нажимает клавишу пробела, пуля будет выпущена на всю высоту экрана, затем сбрасывается обратно на космический корабль или сбрасывается, как только он попадает на космический корабль пришельцев. Проблема, с которой я столкнулся, заключается в том, что пуля не улетит от космического корабля, когда я нажимаю клавишу пробела, она просто ненадолго появляется на экране в исходном положении и затем не движется. Весь код ниже находится внутри моей основной функции, и основная функция вызывается и работает должным образом. Единственная проблема заключается в том, что пуля не движется так, как должна.

pygame.init()

backgroundImg = pygame.image.load("Spacepic.jpg")

windowScreen = pygame.display.set_mode((800, 600))

pygame.display.set_caption("Space Invaders Remake")

topIcon = pygame.image.load("space-ship (2).png")

pygame.display.set_icon(topIcon)

score_num = 0
font = pygame.font.Font("freesansbold.ttf", 32)

textX = 10
textY = 10

playerImg = pygame.image.load("space-invaders.png")
playerX = 370
playerY = 480
playerX_change = 0

# Enemy
enemyImg = []
enemyX = []
enemyY = []
enemyX_change = []
enemyY_change = []
num_of_enemies = 30
initial_num_of_enemies = 6

# Bullet
bulletImg = pygame.image.load("bullet.png")
bulletX = 0
bulletY = 480
bulletY_change = 20
bullet_state = "ready"

lives = 3
end_lives = 0

for i in range(num_of_enemies):
    enemyImg.append(pygame.image.load("ufo.png"))
    enemyX.append(random.randint(0, 736))
    enemyY.append(random.randint(0, 0))
    enemyX_change.append(12)
    enemyY_change.append(40)
    num_of_enemies = initial_num_of_enemies

# Collision between bullet and spaceship
def isCollision():
    distance = math.sqrt((math.pow(enemyX[i] - bulletX, 2)) + (math.pow(enemyY[i] - bulletY, 2)))
    if distance < 25:
        return True
    else:
        return False

# Fire bullet function
def bullet(x, y):
    global bullet_state
    bullet_state = "fire"
    windowScreen.blit(bulletImg, (x + 15, y))

def show_score():
    score = font.render("Score: " + str(score_num), True, (255, 255, 255))
    windowScreen.blit(score, (textX, textY))

def show_score_to_win():
    win_score = font.render("Score to win: 100", True, (255, 255, 255))
    windowScreen.blit(win_score, (520, 10))

def you_win_msg():
    win_text = font.render("You win, CONGRATULATIONS!", True, (255, 255, 255))
    windowScreen.blit(win_text, (200, 250))

def game_over():
    lose_text = font.render("You lose, GAME OVER!", True, (255, 255, 255))
    windowScreen.blit(lose_text, (225, 250))

def player():
    windowScreen.blit(playerImg, (playerX, playerY))

def enemy(x, y, i):
    windowScreen.blit(enemyImg[i], (x, y))

def show_lives():
    lives_display = font.render("Lives: " + str(lives), True, (255, 255, 255))
    windowScreen.blit(lives_display, (10, 100))

rungame = True
while rungame:

    windowScreen.fill((0, 0, 0))
    windowScreen.blit(backgroundImg, (0, 0))
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            rungame = False

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                playerX_change = -5
            if event.key == pygame.K_RIGHT:
                playerX_change = 5

            # If bullet isn't already visible fire once spacebar pressed
            if event.key == pygame.K_SPACE:
                if bullet_state is "ready":
                    bulletX = playerX
                    bullet(bulletX, bulletY)

    if event.type == pygame.KEYUP:
        if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
            playerX_change = 0

    playerX += playerX_change

    if playerX <= 0:
        playerX = 0
    elif playerX >= 736:
        playerX = 736

    for i in range(num_of_enemies):
        enemy(enemyX[i], enemyY[i], i)
        enemyX[i] += enemyX_change[i]
        if 0 <= score_num < 20:
            if enemyX[i] <= 0:
                enemyX_change[i] = 5
                enemyY[i] += enemyY_change[i]
            elif enemyX[i] >= 736:
                enemyX_change[i] = -5
                enemyY[i] += enemyY_change[i]
        elif 20 <= score_num < 40:
            if enemyX[i] <= 0:
                enemyX_change[i] = 6
                enemyY[i] += enemyY_change[i]
            elif enemyX[i] >= 736:
                enemyX_change[i] = -6
                enemyY[i] += enemyY_change[i]
        elif 40 <= score_num < 60:
            if enemyX[i] <= 0:
                enemyX_change[i] = 7
                enemyY[i] += enemyY_change[i]
            elif enemyX[i] >= 736:
                enemyX_change[i] = -7
                enemyY[i] += enemyY_change[i]
        elif 60 <= score_num < 100:
            if enemyX[i] <= 0:
                enemyX_change[i] = 8.5
                enemyY[i] += enemyY_change[i]
            elif enemyX[i] >= 736:
                enemyX_change[i] = -8.5
                enemyY[i] += enemyY_change[i]

        # If collision occurs bullet resets to starting position
        collision = isCollision()
        if collision:
            bulletY = 480
            bullet_state = "ready"
            score_num += 1
            enemyX[i] = random.randint(0, 736)
            enemyY[i] = random.randint(0, 0)

        if 20 <= score_num < 40:
            num_of_enemies = 10
        elif 40 <= score_num < 60:
            num_of_enemies = 15
        elif 60 <= score_num < 100:
            num_of_enemies = 20
        elif score_num == 100:
            for j in range(num_of_enemies):
                enemyY[j] = 1000
            you_win_msg()
            break
        if lives >= end_lives:
            if 435 < enemyY[i] < 900:
                enemyY[i] = 1000
                lives -= 1
                if score_num > 0:
                    score_num -= 1
        if lives == end_lives:
            for j in range(num_of_enemies):
                enemyY[j] = 1000
            game_over()

    # Bullet movement
    if bulletY <= 0:
        bulletY = 480
        bullet_state = "ready"

    if bullet_state is "fire":
        bullet(bulletX, bulletY)
        bulletY -= 100

    player()
    show_score()
    show_score_to_win()
    show_lives()
    pygame.display.update()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...