from gamedata.objects.base import BaseObject from gamedata.objects.button import Button import random class GameOver(BaseObject): def __init__(self,game): super().__init__(0,0,game) # Back button function def fnBack(self,game): game.scene = game.scenes.main self.game.sound_lib["bgm/gameover.ogg"].stop() self.game.sound_lib["bgm/menu.ogg"].play(-1) # Creating the back button btn = Button(int(game.DISPLAY_WIDTH/4),int(game.DISPLAY_HEIGHT*0.8),game,game.DISPLAY_WIDTH//2,int(game.DISPLAY_HEIGHT*0.1)) btn.text = "Back" btn.click = fnBack game.gameloop.summon(btn) self.sfxscroll = game.sound_lib["sfx/scorescroll.wav"] self.sfxscore = game.sound_lib["sfx/score.wav"] self.sfxtimer = game.lib.Timer(1) self.depth = -1 # Updating highscore self.highscore = False self.newunlocks = [] if game.globals["highscore"]0: text+=" You unlocked :" self.highscorewhite = game.fontfilebig.render(text,False,[255]*3) self.highscoreflash = game.fontfilebig.render(text,False,[255,230,55]) self.flashtimer = game.lib.Timer(0.4) def step(self): update_value = (self.game.globals["score"]-self.displayscore)*self.game.dt*0.4+self.game.dt*2 self.displayscore+= update_value self.displayscore = min(self.game.globals["score"],self.displayscore) colorvalue = self.displayscore*0.9 self.scale = min(2,colorvalue**0.9/250+1) if colorvalue>255: # Green to red colorvalue-=255 colorvalue = min(255,colorvalue**0.95) self.color = [colorvalue,255-colorvalue,0] else: # White to green self.color = [255-colorvalue,255,255-colorvalue] # Scroll sfx if int(self.displayscore)!=int(self.game.globals["score"]): if self.sfxtimer.tick(min(update_value,0.5)): self.sfxscroll.play() if not self.launched and int(self.displayscore)==int(self.game.globals["score"]): if self.launchtimer.tick(self.game.dt): # Launch particles self.launched = True if self.highscore: # Balloons offy = self.game.DISPLAY_HEIGHT+40 for i in range(2): for direction in [-1,1]: for color in ["yellow","red","blue"]: sprite = [self.game.sprite_lib["particles/balloons/"+color+".png"]] offx = self.game.DISPLAY_WIDTH/2-direction*self.game.DISPLAY_WIDTH/2*1.2 velx = (random.random()*3+1+2*i)*direction/2 vely = (random.random()+2)*-1 self.game.addParticle(sprite,offx,offy,velx=velx,vely=vely,flipx=direction==-1,fps=0.3) # Confettis for j in range(30): for i in range(8): color = random.choice(["red","blue","yellow"]) sprites = self.game.getSpriteDir("particles/confetti/"+color+"/") offx = random.randint(0,self.game.DISPLAY_WIDTH) offy = -40*i velx = random.random()*2-1 vely = random.random()*5+2 self.game.addParticle(sprites,offx,offy,velx=velx,vely=vely,flipx=random.randint(0,1),fps=2) self.sfxscore.play() self.game.sound_lib["bgm/gameover.ogg"].play(-1) if self.launched: self.flashtimer.tick(self.game.dt) if self.game.inputs["mouse"]["click"]==1: # skip animation self.displayscore = int(self.game.globals["score"]) def draw(self): # Display night sky self.game.window.blit(self.game.pygame.transform.scale(self.game.sprite_lib["skies/night.png"],[self.game.DISPLAY_WIDTH,self.game.DISPLAY_HEIGHT]),[0,0]) self.game.window.blit(self.game.sprite_lib["vignette.png"],[0,0]) # Display score txt = self.game.fontfilebig.render("Score : "+str(int(self.displayscore)),False,self.color) txt = self.game.pygame.transform.scale(txt,(round(txt.get_width()*self.scale),round(txt.get_height()*self.scale))) self.game.lib.drawcenter(self.game,txt,self.game.DISPLAY_WIDTH/2,self.game.DISPLAY_HEIGHT*0.4) # Display new highscore if self.highscore: if not self.launched: alpha = (1-self.launchtimer.getratio())**2*255 else: alpha = 255 txt = [self.highscorewhite,self.highscoreflash][self.flashtimer.getloops()%2] txt.set_alpha(alpha) self.game.lib.drawcenter(self.game,txt,self.game.DISPLAY_WIDTH/2,self.game.DISPLAY_HEIGHT*0.6) # Draw unlocks for i in range(len(self.newunlocks)): posx = self.game.DISPLAY_WIDTH/(len(self.newunlocks)+1)*(i+1) posy = self.game.DISPLAY_HEIGHT*0.7 sprite = self.unlocksprites[self.newunlocks[i]] sprite.set_alpha(alpha) self.game.lib.drawcenter(self.game,sprite,posx,posy)