在 pygame 中制作一个有效的游戏结束功能 [英] making a working Game Over function in pygame

查看:125
本文介绍了在 pygame 中制作一个有效的游戏结束功能的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我制作了一个平台游戏,当我死了时,我希望有一个游戏结束场景.在我的玩家精灵显示其死动画后,我已经成功地使游戏结束场景出现在屏幕上,说游戏结束.然而,当游戏结束屏幕将我带回主菜单,我点击播放时,它显然让我回到我的精灵死了.基本上在我的精灵被杀死后,我希望动画恢复正常(行走)而不是继续死亡.死亡动画发生在与敌人或陷阱碰撞时.这似乎是一项非常复杂的任务,我只是希望有人对此发表意见.有什么帮助吗?顺便说一句,我的代码的前三分之一是播放器类,其中后三分之二是游戏结束屏幕等...

I have made a platformer game and when i die i want there to be a game over scene. I have successfully been able to make a gameover scene appear on the screen saying gameover after my player sprite has showed its dead animation. However when the gameover screen takes me back to the main menu, and i click on play, it obviously takes me back to my sprite being dead. Basically after my sprite has been killed i want the animation to go back to normal(walking) rather than continue to be dead. The dead animation occurs upon collision with an enemy or trap. This seems like a very complex task and i just wanted someones opinion on it. Any help? Btw the top third of my code is the player class where the bottom two thirds are the game over screen etc...

class Player(pygame.sprite.Sprite):
def __init__(self,x,y,width = 65, height = 35):
    pygame.sprite.Sprite.__init__(self)
    self.x = x
    self.y = y
    self.hspeed,self.vspeed = 0,0
    self.speed = 2

    self.images=[]
    r0 = pygame.image.load("Images\Player\i1.png")
    r1 = pygame.image.load("Images\Player\i2.png")
    r2 = pygame.image.load("Images\Player\i3.png")
    r3 = pygame.image.load("Images\Player\i4.png")
    self.hurt = pygame.image.load("Images\Player\Hurt.png")
    self.images.append(r0)
    self.images.append(r1)
    self.images.append(r2)
    self.images.append(r3)

    self.rotatedimages = []
    rr0 = pygame.transform.flip(r0 ,True, False)
    rr1 = pygame.transform.flip(r1 ,True, False)
    rr2 = pygame.transform.flip(r2 ,True, False)
    rr3 = pygame.transform.flip(r3 ,True, False)
    self.rotatedimages.append(rr0)
    self.rotatedimages.append(rr1)
    self.rotatedimages.append(rr2)
    self.rotatedimages.append(rr3)

    self.gravity = 0.35
    self.index = 0
    self.image = self.images[self.index]
    self.rect = pygame.Rect(self.x,self.y,width,height)

    self.TimeNum=0
    self.TimeTarget=10
    self.Timer = 0
    self.collision = False

def update(self, event = None):
    self.calcgravity()

    self.rect.x += self.hspeed
    self.rect.y += self.vspeed

    key = pygame.key.get_pressed()
    if key[pygame.K_RIGHT]:
        self.TimeNum+=1
        if self.TimeNum == self.TimeTarget:
            self.index +=1
            if self.index >= len(self.images):
                self.index = 0
            self.image = self.images[self.index]

            self.TimeNum = 0
    print(self.Timer)
    if key[pygame.K_LEFT]:
        self.TimeNum+=1
        if self.TimeNum == self.TimeTarget:
            self.index +=1
            if self.index >= len(self.rotatedimages):
                self.index = 0
            self.image = self.rotatedimages[self.index]
            self.TimeNum = 0

def calcgravity(self):
    if self.vspeed == 0:
        self.vspeed = 1
    else:
        self.vspeed += self.gravity

#This is what i dont understand
def dead(self):
    PlayerDead.play(loops = 0, maxtime = 100)
    self.Timer += 1
    if self.Timer >= 10:
        self.images.append(self.hurt)
        self.image = self.hurt
        self.hspeed = 0
        if self.Timer == 20:
            GameOver() 

def move(self, hspeed, vspeed):
    self.hspeed += hspeed
    self.vspeed += vspeed

def Level1PlatColl(self, BlockListGrass, TrapList, enemygroup, PowerUps):

    PlatformCollision = pygame.sprite.spritecollide(self, BlockListGrass, False )
    for each_object in PlatformCollision:
        if self.vspeed > 0:
            self.rect.bottom = each_object.rect.top
            self.vspeed = 0
        if self.vspeed < 0:
            self.rect.top = each_object.rect.bottom
            self.vspeed = 0

    TrapCollision = pygame.sprite.spritecollide(self,TrapList,False )
    for each_trap in TrapCollision:
        self.dead()
        #there might be something i could do here but i dont know what

    EnemyCollision = pygame.sprite.spritecollide(self,enemygroup,False )
    for each_object in EnemyCollision:
        self.dead()

    PowerUpsCollision = pygame.sprite.spritecollide(self,PowerUps,False )
    for speedboost in PowerUpsCollision:
        PowerUps.remove(speedboost)
def text_objects(text, font):
textSurface = font.render(text, True, (0,0,0))
return textSurface, textSurface.get_rect()


def GameOver():
##    PlayerDead.stop()
##    SpearAttack.stop()
##    SadTrombone.play()

screen.blit(pygame.image.load("background0.jpg").convert(), (0,0))
largeText = pygame.font.SysFont("elephant",60)
TextSurf, TextRect = text_objects("GameOver", largeText)
TextRect.center = ((screen_width/2),(screen_height/2))
screen.blit(TextSurf, TextRect)

intro = True

while intro:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            quit()

    Buttons("BACK TO MAIN MENU",100,500,400,50,TURQUOISE,DARK_TURQUOISE,"back")

    pygame.display.update()
    clock.tick(15)

def Buttons(msg,x,y,w,h,inactive,active,action=None):

mouse = pygame.mouse.get_pos()
click = pygame.mouse.get_pressed()

if x+w > mouse[0] > x and y+h > mouse[1] > y:
    pygame.draw.rect(screen, active, (x,y,w,h))
    if click[0]==1 and action != None:
        if action == "play":
            #music.stop()
            main()
        if action == "instructions":
            Instructions()
        if action == "next_level":
            #music.stop()
            main2()
        if action == "nextlevel":
            main3()
        if action == "back":
            #music.stop()
            #this is the button where i can get back to main menu
            GameIntro()          

else:
    pygame.draw.rect(screen, inactive , (x,y,w,h))

ButtonFont = pygame.font.SysFont("elephant",30)
TextSurf, TextRect = text_objects(msg, ButtonFont)
TextRect.center = ((x+w/2),(y+h/2))
screen.blit(TextSurf,TextRect)  

推荐答案

定义一个从一开始就初始化游戏的函数.所以在第一次,你以呼叫开始游戏,

Define a function that initializes the game from the very beginning. So at the first time, you start the game with calling,

new_game()

之后,当游戏结束时,您可以使用条件开始新游戏,或者创建一个新的game_over()函数来处理new_game无法处理的事情强>功能.

After that, when game ends you can use conditions to start a new game, or create a new game_over() function to handle things that can not be handled by the new_game function.

if game_ending_condition:
    new_game()

这样,您就可以避免在 game_over 函数中将所有变量重新分配给起始值的麻烦.

This way, you save yourself from the trouble of reassigning all the variables to starting values in a game_over function.

这篇关于在 pygame 中制作一个有效的游戏结束功能的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆