我需要能够暂停整个游戏,但是当我按下键盘上的 p 键时,只有我的汽车精灵暂停

Posted

技术标签:

【中文标题】我需要能够暂停整个游戏,但是当我按下键盘上的 p 键时,只有我的汽车精灵暂停【英文标题】:I need to be able to pause the whole game, but only my car sprite pauses when I press the p key on my keyboard 【发布时间】:2021-12-19 22:34:44 【问题描述】:

我在代码末尾的 while 循环中在我的游戏中实现了暂停功能,但问题是只有我的汽车精灵暂停。我尝试了很多不同的方式来设置我的暂停代码,但我安排的方式似乎都没有暂停整个游戏。

当我按下键盘上的p 键时,我希望能够暂停整个游戏,而不仅仅是我的汽车精灵。有人可以告诉我如何修复此代码吗?暂停整个游戏的代码会很好。拜托,将暂停整个游戏的重新排列的代码会有所帮助。此外,我不只是想要答案,我想要快速解释为什么只有我的汽车精灵会暂停而不是整个游戏。

我的代码:

import random
import pygame
import pygame.freetype

pygame.init()

#screen settings
WIDTH = 1000
HEIGHT = 400

screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("AutoPilot")
screen.fill((255, 255, 255))

#fps
FPS = 120
clock = pygame.time.Clock()

#load images
bg = pygame.image.load('background/street.png').convert_alpha() # background
bullets = pygame.image.load('car/bullet.png').convert_alpha()
debris_img = pygame.image.load('debris/cement.png')

#define game variables
shoot = False

#player class
class Player(pygame.sprite.Sprite):
    def __init__(self, scale, speed):
        pygame.sprite.Sprite.__init__(self)

        self.bullet = pygame.image.load('car/bullet.png').convert_alpha()
        self.bullet_list = []
        self.speed = speed
        #self.x = x
        #self.y = y
        self.moving = True
        self.frame = 0
        self.flip = False
        self.direction = 0
        self.score = 0

        #load car
        self.images = []
        img = pygame.image.load('car/car.png').convert_alpha()
        img = pygame.transform.scale(img, (int(img.get_width()) * scale, (int(img.get_height()) * scale)))
        self.images.append(img)
        self.image = self.images[0]
        self.rect = self.image.get_rect()
        self.update_time = pygame.time.get_ticks()
        self.movingLeft = False
        self.movingRight = False
        self.rect.x = 465
        self.rect.y = 325

    #draw car to screen
    def draw(self):
        screen.blit(self.image, (self.rect.centerx, self.rect.centery))

    #move car
    def move(self):
        #reset the movement variables
        dx = 0
        dy = 0

        #moving variables
        if self.movingLeft and self.rect.x > 33:
            dx -= self.speed
            self.flip = True
            self.direction = -1
        if self.movingRight and self.rect.x < 900:
            dx += self.speed
            self.flip = False
            self.direction = 1

        #update rectangle position
        self.rect.x += dx
        self.rect.y += dy

    #shoot
    def shoot(self):
        bullet = Bullet(self.rect.centerx + 18, self.rect.y + 30, self.direction)
        bullet_group.add(bullet)

    #check collision
    def collision(self, debris_group):
        for debris in debris_group:
            if debris.health > 0 and pygame.sprite.spritecollide(debris, bullet_group, True):
                debris.health -= 1
                if debris.health <= 0:
                    self.score += 1

    #player stats/score
    def stats(self):
        myfont = pygame.font.SysFont('comicsans', 30)
        scoretext = myfont.render("Score: " + str(self.score), 1, (0,0,0))
        screen.blit(scoretext, (100,10))

#bullet class
class Bullet(pygame.sprite.Sprite):
    def __init__(self, x, y, direction):
        pygame.sprite.Sprite.__init__(self)

        self.speed = 5
        self.image = bullets
        self.rect = self.image.get_rect()
        self.rect.center = (x,y)
        self.direction = direction

    def update(self):
        self.rect.centery -= self.speed
        #check if bullet has gone off screen
        if self.rect.centery < 1:
            self.kill()

#debris class
class Debris(pygame.sprite.Sprite):
    def __init__(self,scale,speed):
        pygame.sprite.Sprite.__init__(self)

        self.scale = scale
        self.x = random.randrange(100,800)
        self.speed_y = 10
        self.y = 15
        self.speed = speed
        self.vy = 0
        self.on_ground = True
        self.move = True
        self.health = 4
        self.max_health = self.health
        self.alive = True
        self.velocity = random.randrange(1,2)
        self.speed_x = random.randrange(-3,3)
        self.moving_down = True
        self.is_destroyed = False

        #load debris
        self.image = debris_img
        self.rect = self.image.get_rect()
        self.rect.x = random.randrange(100, 800)
        self.rect.y = random.randrange(-150, -100)
        self.rect.center = (self.x,self.y)

        #load explosion
        self.img_explosion_00 = pygame.image.load('explosion/0.png').convert_alpha()
        self.img_explosion_00 = pygame.transform.scale(self.img_explosion_00, (self.img_explosion_00.get_width() * 2,
                                                                               self.img_explosion_00.get_height() * 2))
        self.img_explosion_01 = pygame.image.load('explosion/1.png').convert_alpha()
        self.img_explosion_01 = pygame.transform.scale(self.img_explosion_01, (self.img_explosion_01.get_width() * 2,
                                                                               self.img_explosion_01.get_height() * 2))
        self.img_explosion_02 = pygame.image.load('explosion/2.png').convert_alpha()
        self.img_explosion_02 = pygame.transform.scale(self.img_explosion_02, (self.img_explosion_02.get_width() * 2,
                                                                               self.img_explosion_02.get_height() * 2))
        self.img_explosion_03 = pygame.image.load('explosion/3.png').convert_alpha()
        self.img_explosion_03 = pygame.transform.scale(self.img_explosion_03, (self.img_explosion_03.get_width() * 2,
                                                                               self.img_explosion_03.get_height() * 2))
        #explosion list
        self.anim_explosion = [self.img_explosion_00,
                               self.img_explosion_01,
                               self.img_explosion_02,
                               self.img_explosion_03]
        self.anim_index = 0
        self.frame_len = 20 #frames before explosion animation disappears


    #spawn new debris
    def spawn_new_debris(self):
        self.rect.x = random.randrange(100, 800)
        self.rect.y = random.randrange(-150, -100)
        self.velocity = random.randrange(1, 2)
        self.speed_x = random.randrange(-3, 3)

    #respawn debris when they go of the screen
    def boundaries(self):
        if self.rect.left > WIDTH + 10 or self.rect.right < -10 or self.rect.top > HEIGHT + 10:
            self.spawn_new_debris()

    #update image
    def update(self):
        self.rect.y += self.velocity
        self.rect.x += self.speed_x
        self.boundaries()
        if self.health <= 0:
            max_index = len(self.anim_explosion) - 1
            if self.anim_index > max_index:
                self.kill()
            else:
                if self.frame_len == 0:
                    self.image = self.anim_explosion[self.anim_index]
                    self.anim_index += 1
                    self.frame_len = 20
                else:
                    self.frame_len -= 1

    #make debris fall down
    def falldown(self):
        self.rect.centery += self.velocity
        if self.moving_down and self.rect.y > 350:
            self.kill()

######################CAR/DEBRIS##########################

player = Player(1,5)

##########################################################

#groups
bullet_group = pygame.sprite.Group()
debris_group = pygame.sprite.Group()
all_sprites = pygame.sprite.Group()

for x in range(100):
    d = Debris(1, 5)
    debris_group.add(d)
    all_sprites.add(d)

#game runs here
run = True
paused = False
while run:

    #draw street
    screen.blit(bg, [0, 0])

    #update groups
    bullet_group.update()
    bullet_group.draw(screen)

    debris_group.update()
    debris_group.draw(screen)

    #draw car
    player.draw()
    player.move()
    player.collision(debris_group)
    player.stats()

    #update all sprites
    all_sprites.update()
    all_sprites.draw(screen)

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

        #pause game
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_p:
                paused = not paused

        if paused == True:
            continue

        #check if key is down
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                run = False
            if event.key == pygame.K_a:
                player.movingLeft = True
            if event.key == pygame.K_d:
                player.movingRight = True
            if event.key == pygame.K_SPACE:
                player.shoot()
                shoot = True

        #check if key is up
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_a:
                player.movingLeft = False
            if event.key == pygame.K_d:
                player.movingRight = False

    #update the display
    pygame.display.update()
    pygame.display.flip()
    clock.tick(FPS)

pygame.quit()

【问题讨论】:

【参考方案1】:

移动你的

for event in pygame.event.get():

while 循环的正下方,然后移动您的

    if paused:
        continue

for 循环下方,如下所示:

run = True
paused = False
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

        #pause game
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_p:
                paused = not paused

        #check if key is down
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                run = False
            if event.key == pygame.K_a:
                player.movingLeft = True
            if event.key == pygame.K_d:
                player.movingRight = True
            if event.key == pygame.K_SPACE:
                player.shoot()
                shoot = True

        #check if key is up
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_a:
                player.movingLeft = False
            if event.key == pygame.K_d:
                player.movingRight = False

    if paused:
        continue
                
    #draw street
    screen.blit(bg, [0, 0])

    #update groups
    bullet_group.update()
    bullet_group.draw(screen)

    debris_group.update()
    debris_group.draw(screen)

    #draw car
    player.draw()
    player.move()
    player.collision(debris_group)
    player.stats()

    #update all sprites
    all_sprites.update()
    all_sprites.draw(screen)

    #update the display
    pygame.display.update()
    pygame.display.flip()
    clock.tick(FPS)

pygame.quit()

当您按下q 键时,只有您的汽车精灵暂停的原因是,正如您在此处的原始代码中看到的那样:

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

        #pause game
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_p:
                paused = not paused

        if paused == True:
            continue

你把

        if paused == True:
            continue

for 循环内部,而不是while 循环,因此移动汽车的行将被阻塞,但 while 循环内的其余代码仍将被执行。

【讨论】:

以上是关于我需要能够暂停整个游戏,但是当我按下键盘上的 p 键时,只有我的汽车精灵暂停的主要内容,如果未能解决你的问题,请参考以下文章

在 ios8 中使用 appdelegate 暂停 spritekit 游戏

当我按下快速播放按钮时,声音播放失败

当我在 Swift 上按下搜索栏时如何使键盘消失?

当我按下 ENTER 时如何重新开始我的游戏?

当我按下一个按钮时我的游戏崩溃了(以 NSException 类型的未捕获异常终止)

当我按下一个键时没有调用 keyPressed() 方法?