屏幕上的Python游戏不接受inpu

2024-04-25 21:07:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图让它这样当游戏在屏幕上显示,用户可以按空格键回到游戏中。当前,当游戏结束时,它会在屏幕上显示游戏,但不接受任何输入,或者至少不处理输入。在某些情况下,游戏基本上是左右移动以避开障碍物。目前,我只有一个障碍,但我只是还没有达到这一点。谢谢

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()

Tags: selfeventfalse游戏ifdisplaywidthpygame
1条回答
网友
1楼 · 发布于 2024-04-25 21:07:23

主要的问题是,你的游戏场景是在主循环后面的循环,当你到达它的时候,没有办法回到第一个循环。当你触摸邪恶的对象时,你设置running = False,离开main并进入while gameOver:循环

在这个循环中,您还需要调用pygame.event.pump(),否则pygame.key.get_pressed()函数不能正常工作,窗口会在一段时间后冻结,因为没有处理事件。如果您想重新启动游戏,您应该只使用嵌套的while gameOver循环。实际上,我建议您更进一步地重构场景并使用有限状态机(这里有一个answer,我使用函数作为场景,但也可以查看下面注释中的链接)

这是你的代码的工作版本。我已经改变了一些事情,并添加了注释来解释这些变化

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()

相关问题 更多 >