Python-игра поверх экрана не принимает ввод - PullRequest
0 голосов
/ 28 октября 2018

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

import pygame
import random
import math

pygame.init()

screenWidth = 700
screenHeight = 800

x = screenWidth / 2
y = (screenHeight / 4) * 3
width = 50
height = 50

win = pygame.display.set_mode((screenWidth, screenHeight))
pygame.display.set_caption("Test Game")

bg = pygame.image.load("background.png").convert()
gameover = pygame.image.load("gameover.png").convert()
bgx = (screenWidth / 6) * 2
bgy = 0

clock = pygame.time.Clock()

class enemy():
    def __init__(self,c,y,width,height):
        self.c = c
        self.y = y
        self.width = width
        self.height = height
        self.vel = 5

    def draw(self, win):
        if self.c == 1:
            self.x = 250
            #250
        elif self.c == 2:
            self.x = 350
            #350
        else:
            self.x = 450
            #450
        self.y += self.vel
        pygame.draw.rect(win, (0,0,255), (self.x,self.y,self.width,self.height))

evil = enemy(random.randint(1,3),0,50,50)

#def redrawGameWindow():
   # evil.draw(win)

   # pygame.display.update()

running = True
gameOver = False

while running:
    clock.tick(60)
    while gameOver:
        win.blit(gameover, (0,0))
        pygame.display.update()

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
                pygame.quit()
            if pygame.event.type == pygame.KEYUP:
                if event.key == pygame.K_SPACE:
                    gameOver = True




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

        if event.type == pygame.KEYUP:
            if event.key == pygame.K_RIGHT:
                x+=100
            if event.key == pygame.K_LEFT:
                x-=100

    win.fill((0,0,0))
    win.blit(bg, (bgx, bgy))
    evil.draw(win)
    dist = math.hypot(evil.x - x, evil.y - y)
    if dist <= 50:
            print("Game Over!")
            running = False
            gameOver = True
    pygame.draw.rect(win, (255,0,0), (x,y,width,height))
    pygame.display.update()
    #redrawGameWindow()

while gameOver:
    win.blit(gameover, (0,0))
    pygame.display.update()

    keys = pygame.key.get_pressed()

    if keys[pygame.K_SPACE]:
        gameOver = False

pygame.quit()

1 Ответ

0 голосов
/ 28 октября 2018

Основная проблема заключается в том, что ваша игра за сценой представляет собой цикл за основным циклом while running:, и нет никакого способа вернуться к первому циклу, когда вы его достигнете.Когда вы дотрагиваетесь до злого объекта, вы устанавливаете running = False, выходите из основного и входите в цикл while gameOver:.

В этом цикле вам также необходимо вызвать pygame.event.pump(), в противном случае функция pygame.key.get_pressed() не будет работать правильно, и через некоторое время окно зависнет, поскольку события не обрабатываются.Если вы хотите перезапустить игру, вам лучше использовать только вложенный цикл while gameOver.На самом деле, я бы порекомендовал вам реструктурировать сцены еще больше и вместо этого использовать конечный автомат (вот ответ , в котором я использую функции в качестве сцен, но также проверьте ссылку в комментарии ниже).

Вот рабочая версия вашего кода.Я изменил несколько вещей и добавил комментарии, чтобы объяснить изменения.

while running:
    # -----The game over scene.-----
    while gameOver:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                # pygame.quit only uninitializes the pygame modules and
                # doesn't quit the program.
                pygame.quit()
                # This will quit the whole program. You need to import sys.
                sys.exit()
            elif event.type == pygame.KEYUP:  # event.type not pygame.event.type
                if event.key == pygame.K_SPACE:
                    # Change it to False to break out of the loop.
                    gameOver = False
                    # Reset the game. You could reset the position of the
                    # `evil` object or instantiate a new one.
                    evil.x = 350
                    evil.y = 0

        win.blit(gameover, (0,0))
        pygame.display.update()
        clock.tick(60)  # You need to call tick in this loop as well.
    # ------------------------------
    # -----The main scene.-----
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYUP:
            if event.key == pygame.K_RIGHT:
                x += 100
            elif event.key == pygame.K_LEFT:
                x -= 100

    win.fill((0,0,0))
    win.blit(bg, (bgx, bgy))
    evil.draw(win)
    dist = math.hypot(evil.x - x, evil.y - y)
    if dist <= 50:
        print("Game Over!")
        # running = False  # This would stop the main loop.
        gameOver = True
    pygame.draw.rect(win, (255,0,0), (x,y,width,height))
    pygame.display.update()
    clock.tick(60)


# The other while loop was removed.
pygame.quit()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...