In this article we are going to create a game over scene for the pygame project, we will use back the start scene class which we have created previously to render our game over scene by slightly modify it for the multi-scenes uses. Here is the modify version of the start scene class, as you can see we have passed in a state variable to the start scene class’s draw method which will be used to determine which scene to be rendered on the screen.
from BgSprite import BgSprite from GameSprite import GameSprite from pygame.locals import * from pygame import math as mt import pygame class StartScene(object): def __init__(self, scene): self.scene = scene self.button_image = 'Asset/button_play.png' self.bg_image = 'Asset/start.png' self.over_image = 'Asset/ove.png' self.bg_rect = Rect(0, 0, 660, 660) self.button_rect = Rect(0, 0, 306, 112) self.sprite = BgSprite(self.bg_image, self.bg_rect) self.sprite_over = BgSprite(self.over_image, self.bg_rect) self.sprite_button = GameSprite(self.button_image, self.button_rect) self.over_surface = self.sprite_over.getImage() # get the game over sprite surface self.surface = self.sprite.getImage() # get the start scene sprite surface self.button_surface = self.sprite_button.getImage() # get the button sprite surface self.draw_pos = mt.Vector2(0, 0) self.draw_button_pos = mt.Vector2(177, 274) def draw(self, state): if(state == 0): self.scene.blit(self.surface, self.draw_pos) # draw a start scene sprite else: self.scene.blit(self.over_surface, self.draw_pos) # draw a game over sprite self.scene.blit(self.button_surface, self.draw_button_pos) # draw a button sprite pygame.display.flip()
Next we will need to modify the Game Manager class again by including an extra game over state variable and a new setup method into it.
from Player import Player from Background import Background from EnemyManager import EnemyManager from Overlap import Overlap from ExplosionManager import ExplosionManager from Score import Score from StartScene import StartScene from pygame.locals import * import pygame class GameManager(object): def __init__(self, scene): self.scene = scene self.start_scene = StartScene(scene) self.load_music() self.play_music() self.overlap_manager = Overlap() self.setup() #game state self.LOAD = 0 self.GAME = 1 self.OVER = 2 self.state = self.LOAD def setup(self): self.player = Player(self.scene) self.background = Background(self.scene) self.enemy_manager = EnemyManager(self.scene, self.player) self.explosion_manager = ExplosionManager(self.scene) self.score_manager = Score(self.scene) def loop(self): if(self.state == self.LOAD or self.state == self.OVER): self.start_scene.draw(self.state) elif(self.state == self.GAME): self.update() self.draw() def isAreaClick(self, pos): if (self.state == self.LOAD or self.state == self.OVER): self.rect = Rect(177, 274, 306, 112) # the position of the play button on the scene x, y = pos if(self.rect.collidepoint(x, y)): self.state = self.GAME def load_music(self): pygame.mixer_music.load('Music/winternight.ogg') def play_music(self): pygame.mixer_music.play(-1) #play the music infinite time def set_player_x(self, _x): if (self.state == self.GAME): self.player.setX(_x) def set_player_y(self, _y): if (self.state == self.GAME): self.player.setY(_y) def set_missile_strike(self, strike): if (self.state == self.GAME): self.player.setStrike(strike) def update(self): self.player.update() self.enemy_manager.update() self.isOverlap() self.explosion_manager.explosion_update() # check for player, enemy, missiles overlap def isOverlap(self): self.overlap_manager.isOverlap(self.player, self.enemy_manager, self.explosion_manager, self.score_manager, self) def draw(self): self.background.draw() self.player.draw() self.enemy_manager.draw() self.explosion_manager.draw() self.score_manager.draw() pygame.display.flip()
We will pass in this class as the reference into the isOverlap method of the overlap manager which then will be used to access the state variable as well as reset the game objects to their original state by calling the newly created setup method of this class.
The last thing we need to do is to modify the overlap class.
from pygame.locals import * class Overlap(object): def __init__(self): pass # nothing here # is player and enemy, player missile, enemy missile overlap def isOverlap(self, player, em, ex, score, gm): self.player_rect = Rect(player.pos.x, player.pos.y, player.width, player.height) for i in range(len(em.enemy_list)): # is player collides with enemy self.em_rect = Rect(em.enemy_list[i].x, em.enemy_list[i].y, em.width, em.height) if (self.player_rect.colliderect(self.em_rect)): em.enemy_list[i].on = False if(em.enemy_list[i].hit == False): ex.create_explosion(player.pos.x + 2, player.pos.y + 2) em.enemy_list[i].hit = True gm.state = gm.OVER gm.setup() for i in range(len(em.enemy_missile_manager.missile_list)): # is enemy missile hits player self.em_rect = Rect(em.enemy_missile_manager.missile_list[i].x, em.enemy_missile_manager.missile_list[i].y, em.enemy_missile_manager.width, em.enemy_missile_manager.height) if (self.player_rect.colliderect(self.em_rect)): em.enemy_missile_manager.missile_list[i].on = False ex.create_explosion(player.pos.x + 2, player.pos.y + 2) score.set_score(-1) if(score.score < 0): gm.state = gm.OVER gm.setup() for i in range(len(em.enemy_list)): # is player missile hits enemy self.em_rect = Rect(em.enemy_list[i].x, em.enemy_list[i].y, em.width, em.height) for j in range(len(player.getMissileManager().missile_list)): self.mm_rect = Rect(player.getMissileManager().missile_list[j].x, player.getMissileManager().missile_list[j].y, player.getMissileManager().width, player.getMissileManager().height) if (self.em_rect.colliderect(self.mm_rect)): em.enemy_list[i].on = False player.getMissileManager().missile_list[j].on = False if (em.enemy_list[i].hit == False): ex.create_explosion(em.enemy_list[i].x, em.enemy_list[i].y + 2) em.enemy_list[i].hit = True score.set_score(1)
The game over scene will be loaded and the game objects will be recreated whenever the player collides with the enemy ship or the player strength falls below zero.
With that done we are now ready to move on to the next stage of the project, which is to create a level manager class to manage all the game levels in this game. If you have not yet subscribed to this website then do make sure to click on the red bell button below this post so you will get a first hand notification whenever a new article has been posted. This pygame project is not yet complete and there are still more articles related to this topic will be posted soon so make sure you subscribe to this website by clicking on that red bell button below if you want to read more articles about the pygame subject!
If you are following this tutorial from the beginning then your pycharm file explorer area should now has all these files below.
It is time to move on to the next chapter, see you there!