In this article we will create a pause scene for our ongoing pygame project. When a user presses the p key on his keyboard during the game, the game will pause and the pause scene will appear. When he presses the play button on the pause scene the game will resume. We need to modify three files in order to include this scene into the game. The first file to edit is the main project file which we will include in an extra mechanism to detect the p key pressed event.
import sys, pygame from pygame.locals import * from GameManager import GameManager pygame.init() size = width, height = 660, 660 pygame.display.set_caption("Air Strike") # set the title of the window screen = pygame.display.set_mode(size) game_manager = GameManager(screen) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.mixer_music.stop() sys.exit() # detect key press event if event.type == KEYDOWN: if(game_manager.state == 1): if event.key == K_LEFT: game_manager.set_player_x(-0.1) elif event.key == K_RIGHT: game_manager.set_player_x(0.1) if event.key == K_UP: game_manager.set_player_y(-0.1) elif event.key == K_DOWN: game_manager.set_player_y(0.1) if event.key == K_SPACE: game_manager.set_missile_strike(True) if event.key == K_p : game_manager.set_pause(True) # set the pause state to true elif event.type == KEYUP: if (game_manager.state == 1): if event.key == K_LEFT: game_manager.set_player_x(0) elif event.key == K_RIGHT: game_manager.set_player_x(0) if event.key == K_UP: game_manager.set_player_y(0) elif event.key == K_DOWN: game_manager.set_player_y(0) if event.key == K_SPACE: game_manager.set_missile_strike(False) elif event.type == pygame.MOUSEBUTTONDOWN: # 1 is the left mouse button if event.button == 1: game_manager.isAreaClick(event.pos) game_manager.loop()
The next file needs to edit is the start scene file where we will include in the pause scene to the start scene class.
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.play_button = 'Asset/play.png' self.about_button = 'Asset/about.png' self.score_button = 'Asset/score.png' self.home_button = 'Asset/back.png' self.button_image = 'Asset/button_play.png' self.manual_button = 'Asset/manual.png' self.bg_image = 'Asset/start.png' self.over_image = 'Asset/ove.png' self.next_image = 'Asset/next.png' self.win_image = 'Asset/winn.png' self.general_image = 'Asset/general.png' self.about_page = 'Asset/about_page.png' self.manual_page = 'Asset/manual_page.png' self.soundon = 'Asset/sound.png' self.soundoff = 'Asset/soundoff.png' self.bg_rect = Rect(0, 0, 660, 660) self.button_rect = Rect(0, 0, 306, 112) self.home_button_rect = Rect(0, 0, 200, 53) self.back_button_rect = Rect(0, 0, 40, 30) self.sound_button_rect = Rect(0, 0, 29, 30) self.sprite = BgSprite(self.bg_image, self.bg_rect) self.sprite_about = BgSprite(self.about_page, self.bg_rect) self.sprite_manual = BgSprite(self.manual_page, self.bg_rect) self.sprite_win = BgSprite(self.win_image, self.bg_rect) self.sprite_over = BgSprite(self.over_image, self.bg_rect) self.sprite_next = BgSprite(self.next_image, self.bg_rect) self.sprite_pause = BgSprite(self.general_image, self.bg_rect) self.soundon_button = GameSprite(self.soundon, self.sound_button_rect) self.soundoff_button = GameSprite(self.soundoff, self.sound_button_rect) self.soundoff_button_surface = self.soundoff_button.getImage() # get the button sprite surface self.soundon_button_surface = self.soundon_button.getImage() # get the button sprite surface self.sprite_button = GameSprite(self.button_image, self.button_rect) self.sprite_manual_button = GameSprite(self.manual_button, self.home_button_rect) self.sprite_play_button = GameSprite(self.play_button, self.home_button_rect) self.sprite_about_button = GameSprite(self.about_button, self.home_button_rect) self.sprite_score_button = GameSprite(self.score_button, self.home_button_rect) self.sprite_home_button = GameSprite(self.home_button, self.back_button_rect) self.about_surface = self.sprite_about.getImage() # get the about sprite surface self.manual_surface = self.sprite_manual.getImage() # get the manual sprite surface self.win_surface = self.sprite_win.getImage() # get the win sprite surface self.next_surface = self.sprite_next.getImage() # get the next level sprite surface self.over_surface = self.sprite_over.getImage() # get the game over sprite surface self.pause_surface = self.sprite_pause.getImage() # get the pause 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.play_button_surface = self.sprite_play_button.getImage() # get the button sprite surface self.about_button_surface = self.sprite_about_button.getImage() # get the button sprite surface self.score_button_surface = self.sprite_score_button.getImage() # get the button sprite surface self.manual_button_surface = self.sprite_manual_button.getImage() # get the button sprite surface self.home_button_surface = self.sprite_home_button.getImage() # get the button sprite surface self.draw_pos = mt.Vector2(0, 0) self.draw_button_pos = mt.Vector2(177, 274) self.draw_play_button_pos = mt.Vector2(229, 200) self.draw_about_button_pos = mt.Vector2(229, 263) self.draw_score_button_pos = mt.Vector2(229, 328) self.draw_manual_button_pos = mt.Vector2(229, 393) self.draw_back_button_pos = mt.Vector2(10, 620) self.draw_sound_button_pos = mt.Vector2(10, 620) self.soundon = True def draw(self, state): if(state == 0): self.scene.blit(self.surface, self.draw_pos) # draw a start scene sprite self.scene.blit(self.play_button_surface, self.draw_play_button_pos) # draw a button sprite self.scene.blit(self.about_button_surface, self.draw_about_button_pos) # draw a button sprite self.scene.blit(self.score_button_surface, self.draw_score_button_pos) # draw a button sprite self.scene.blit(self.manual_button_surface, self.draw_manual_button_pos) # draw a button sprite if(self.soundon == True): self.scene.blit(self.soundon_button_surface, self.draw_sound_button_pos) # draw a button sprite else: self.scene.blit(self.soundoff_button_surface, self.draw_sound_button_pos) # draw a button sprite elif(state == 2): self.scene.blit(self.over_surface, self.draw_pos) # draw a game over sprite elif (state == 3): self.scene.blit(self.next_surface, self.draw_pos) # draw a next level sprite elif(state == 4): self.scene.blit(self.win_surface, self.draw_pos) # draw a win sprite elif (state == 5): self.scene.blit(self.about_surface, self.draw_pos) # draw a about sprite self.scene.blit(self.home_button_surface, self.draw_back_button_pos) # draw a button sprite elif (state == 6): self.scene.blit(self.manual_surface, self.draw_pos) # draw a manual sprite self.scene.blit(self.home_button_surface, self.draw_back_button_pos) # draw a button sprite elif (state == 7): self.scene.blit(self.pause_surface, self.draw_pos) # draw a game over sprite if(state == 2 or state == 3 or state == 4 or state == 7): self.scene.blit(self.button_surface, self.draw_button_pos) # draw a button sprite pygame.display.flip()
The final class which we need to edit is the game manager class where we need to include in the pause game state as well as to adjust the related methods to match this new state, for example shows the pause scene when the game is in the pause state.
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 * from LevelManager import LevelManager import pygame import webbrowser 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.level_manager = LevelManager(self) self.setup(self.level_manager.get_level()) self.pause = False # flag to pause the game #game state self.LOAD = 0 self.GAME = 1 self.OVER = 2 self.NEXT = 3 self.WIN = 4 self.ABOUT = 5 self.MANUAL = 6 self.PAUSE = 7 self.state = self.LOAD def setup(self, game_level): self.game_level = game_level self.score_manager = Score(self.scene) self.background = Background(self.scene) self.player = Player(self.scene) self.enemy_manager = EnemyManager(self.scene, self.player, game_level) self.explosion_manager = ExplosionManager(self.scene) def loop(self): if(self.state == self.LOAD or self.state == self.OVER or self.state == self.NEXT or self.state == self.WIN or self.state == self.ABOUT or self.state == self.MANUAL): self.start_scene.draw(self.state) elif(self.state == self.GAME): self.update() self.draw() elif(self.state == self.PAUSE): self.draw() def isAreaClick(self, pos): if (self.state == self.LOAD or self.state == self.OVER or self.state == self.NEXT or self.state == self.WIN or self.state == self.ABOUT or self.state == self.MANUAL or self.state == self.PAUSE): self.rect = Rect(177, 274, 306, 112) # the position of the play button on the scene self.rect_play = Rect(229, 200, 200, 53) # the position of the play button on the home scene self.rect_about = Rect(229, 263, 200, 53) # the position of the about button on the home scene self.rect_manual = Rect(229, 393, 200, 53) # the position of the manual button on the home scene self.rect_back = Rect(10, 620, 40, 30) # the position of the back button on the home scene self.rect_sound = Rect(10, 620, 29, 30) # the position of the sound button on the home scene x, y = pos if(self.rect.collidepoint(x, y) and (self.state == self.OVER or self.state == self.NEXT or self.state == self.WIN or self.state == self.PAUSE)): self.state = self.GAME elif(self.rect_play.collidepoint(x,y) and self.state == self.LOAD): self.state = self.GAME elif (self.rect_about.collidepoint(x, y) and self.state == self.LOAD): self.state = self.ABOUT elif (self.rect_manual.collidepoint(x, y) and self.state == self.LOAD): #self.state = self.MANUAL webbrowser.open_new('http://gamingdirectional.com/') elif (self.rect_back.collidepoint(x, y) and (self.state == self.ABOUT or self.state == self.MANUAL)): self.state = self.LOAD elif (self.rect_sound.collidepoint(x, y) and self.state == self.LOAD): if(self.start_scene.soundon == True): self.start_scene.soundon = False pygame.mixer_music.pause() else: self.start_scene.soundon = True pygame.mixer_music.unpause() def set_pause(self, pause): self.pause = pause if(self.pause == True): self.state = self.PAUSE 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): if(self.state == self.GAME): self.background.draw() self.player.draw() self.enemy_manager.draw() self.explosion_manager.draw() self.score_manager.draw() elif(self.state == self.PAUSE): self.start_scene.draw(self.state) pygame.display.flip()
That is it, now we are ready for the next lesson which will further deal with the game scenes.