In this chapter, we will create a level/score page for our new
import pickle class LevelManager(object): def __init__(self, gm): self.game_manager = gm self.delete_line = False self.MAX_LEVEL = 2 self.level = 1 self.level_list = [] def set_level(self): try: f = open("level.pickle", "rb") self.level_list = pickle.load(f) self.level = self.level_list[len(self.level_list) - 1] if (len(self.level_list) > 5): self.level_list.pop(0) except EOFError: self.level = 1 self.level_list.append(self.level) def save_level(self): try: self.level_list.append(self.level) if(len(self.level_list) > 5): self.level_list.pop(0) f = open("level.pickle", "wb") pickle.dump(self.level_list, f) f.close() except IOError: print('cannot open a file') def increase_level(self): self.level += 1 if(self.level > self.MAX_LEVEL): self.game_manager.state = self.game_manager.WIN self.level = 1 self.game_manager.setup(self.level) else: #self.game_manager.state = self.game_manager.NEXT self.game_manager.setup(self.level) def get_level(self): return self.level def reset_level(self): self.game_manager.setup(self.level) def get_list(self): return self.level_list
The start scene class will responsible for the rendering of the game levels on the score page.
from BgSprite import BgSprite from GameSprite import GameSprite from pygame.locals import * from pygame import math as mt import pygame import pygame.font as txt from AmazeboyColor import AmazeboyColor class StartScene(object): def __init__(self, scene, lm): self.level_manager = lm self.scene = scene self.play_button = 'Asset/play.png' self.about_button = 'Asset/about.png' self.exit_button = 'Asset/exit.png' self.scene_button = 'Asset/scene.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.win_image = 'Asset/winn.png' self.general_image = 'Asset/general.png' self.soundon = 'Asset/sound.png' self.soundoff = 'Asset/soundoff.png' self.home_button_image = 'Asset/home.png' self.game_logo = 'Asset/menu.png' self.bg_rect = Rect(0, 0, 640, 640) 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, 30, 30) self.animated_count = 0 #self.game_logo_rect = Rect(self.animated_count*550, 0, 550, 550) self.sprite = BgSprite(self.general_image, self.bg_rect) self.sprite_win = BgSprite(self.win_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.game_logo_sprite = GameSprite(self.game_logo, self.game_logo_rect) self.sprite_button = GameSprite(self.button_image, self.button_rect) self.sprite_home_pause_button = GameSprite(self.home_button_image, self.home_button_rect) self.sprite_scene_button = GameSprite(self.scene_button, self.home_button_rect) self.sprite_manual_button = GameSprite(self.manual_button, self.home_button_rect) self.sprite_exit_button = GameSprite(self.exit_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.win_surface = self.sprite_win.getImage() # get the win 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.home_pause_button_surface = self.sprite_home_pause_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.scene_button_surface = self.sprite_scene_button.getImage() # get the button sprite surface self.home_button_surface = self.sprite_home_button.getImage() # get the button sprite surface self.exit_button_surface = self.sprite_exit_button.getImage() # get the button sprite surface #self.game_logo_surface = self.game_logo_sprite.getImage() # get game logo image self.draw_pos = mt.Vector2(0, 0) self.draw_button_pos = mt.Vector2(177, 274) self.draw_game_logo_pos = mt.Vector2(170, 103) self.draw_play_button_pos = mt.Vector2(229, 200) self.draw_about_button_pos = mt.Vector2(229, 263) self.draw_home_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_exit_button_pos = mt.Vector2(229, 456) self.draw_scene_button_pos = mt.Vector2(229, 519) self.draw_back_button_pos = mt.Vector2(10, 590) self.draw_sound_button_pos = mt.Vector2(10, 600) self.soundon = True self.count = 0 self.font = txt.Font('Asset/ft.ttf', 90) self.credit_font = txt.Font('Asset/ft.ttf', 50) self.score_text = "Top Achievements" self.credit_text_i = "Create by : IslandTropicalMan" self.over_text_i = "Game Over" self.next_text_i = "Next Level" self.text_width, self.text_height = self.font.size(self.score_text) self.credit_text_width, self.credit_text_height = self.credit_font.size(self.credit_text_i) self.over_text_width, self.over_text_height = self.credit_font.size(self.over_text_i) self.next_text_width, self.next_text_height = self.credit_font.size(self.next_text_i) self.x_title = 330 - self.text_width/2 self.x_credit = 330 - self.credit_text_width/2 self.x_over = 330 - self.over_text_width / 2 self.x_next = 330 - self.next_text_width/2 self.y_title = 30 self.title_rect = Rect(self.x_title, self.y_title, self.text_width, self.text_height) self.title_score_text = self.font.render(self.score_text, 1, (255, 255, 255)) self.credit_rect = Rect(self.x_credit, 330, self.credit_text_width, self.credit_text_height) self.over_rect = Rect(self.x_over, 190, self.over_text_width, self.over_text_height) self.next_rect = Rect(self.x_next, 190, self.next_text_width, self.next_text_height) self.credit_text = self.credit_font.render(self.credit_text_i, 1, (255, 255, 255)) self.over_text = self.credit_font.render(self.over_text_i, 1, (255, 255, 255)) self.next_text = self.credit_font.render(self.next_text_i, 1, (255, 255, 255)) self.score_value_text = '' self.f1 = None self.font1 = txt.Font('Asset/ft.ttf', 100) self.score_rect = Rect(100, self.y_title+self.text_height, 100, 100) self.home_background_color = AmazeboyColor(240,230,140,255) def draw(self, state): if(state == 0): self.game_logo_rect = Rect(self.animated_count * 550, 0, 550, 550) self.game_logo_sprite = GameSprite(self.game_logo, self.game_logo_rect) self.game_logo_surface = self.game_logo_sprite.getImage() # get game logo image self.scene.fill(self.home_background_color) self.scene.blit(self.game_logo_surface, self.draw_game_logo_pos) # draw a game logo 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 self.scene.blit(self.exit_button_surface, self.draw_exit_button_pos) # draw a button sprite self.scene.blit(self.scene_button_surface, self.draw_scene_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 self.animated_count += 1 if(self.animated_count > 6): self.animated_count = 0 elif(state == 2): self.scene.fill(self.home_background_color) self.scene.blit(self.over_text, self.over_rect) # the over text elif (state == 3): self.scene.fill(self.home_background_color) self.scene.blit(self.next_text, self.next_rect) # the next text elif(state == 4): self.scene.blit(self.win_surface, self.draw_pos) # draw a win sprite elif (state == 5): self.scene.fill(self.home_background_color) # draw a background self.scene.blit(self.credit_text, self.credit_rect) # the credit text #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.fill(self.home_background_color) # draw a background self.scene.blit(self.play_button_surface, self.draw_play_button_pos) # draw a button sprite self.scene.blit(self.home_pause_button_surface, self.draw_home_button_pos) # draw a button sprite elif (state == 8): self.scene.fill(self.home_background_color) # draw a background self.scene.blit(self.title_score_text, self.title_rect) # the score title first list_level = self.level_manager.get_list() for i in range(len(list_level)): self.score_rect = Rect(95, self.y_title + self.text_height + self.count * 90, 100, 100) self.score_value_text = str(self.count+1) + ".) Level " + str(list_level[i]) self.value_score_text = self.font1.render(self.score_value_text, 1, (255, 255, 255)) self.scene.blit(self.value_score_text, self.score_rect) # the top 5 levels of the game self.count += 1 self.count = 0 self.scene.blit(self.home_button_surface, self.draw_back_button_pos) # draw a button sprite if(state == 2 or state == 3 or state == 4): self.scene.blit(self.button_surface, self.draw_button_pos) # draw a button sprite pygame.display.flip()
Next we will need to edit the game manager file and the main file accordingly.
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 from Scene import Scene from BackGroundSprite import BackGroundSprite from BoySprite import BoySprite from ManaManager import ManaManager class GameManager(object): def __init__(self, scene): self.scene = scene self.load_music() self.play_music() self.overlap_manager = Overlap() self.level_manager = LevelManager(self) self.level_manager.set_level() self.setup(self.level_manager.get_level()) self.start_scene = StartScene(scene, self.level_manager) self.pause = False # flag to pause the game self.game_scene = Scene(self.scene) #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.SCORE = 8 self.SCENE = 9 self.state = self.LOAD def setup(self, game_level): self.game_level = game_level self.score_manager = Score(self.scene, self.level_manager) self.background = BackGroundSprite(game_level, self.scene) self.enemy_manager = EnemyManager(self.scene, game_level) self.mana_manager = ManaManager(self.scene, game_level) self.boy_sprite = BoySprite(self.scene, game_level, self.enemy_manager, self.mana_manager, self.level_manager) self.explosion_manager = ExplosionManager(self.scene) def loop(self): if(self.state == self.LOAD): self.start_scene.draw(self.state) elif(self.state == self.PAUSE 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.SCORE): self.start_scene.draw(self.state) elif(self.state == self.SCENE): self.game_scene.draw() elif(self.state == self.GAME): self.update() self.draw() def isAreaClick(self, x, y): 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.SCORE or self.state == self.SCENE 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_exit = Rect(229, 456, 200, 53) # the position of the exit button on the home scene self.rect_pause_home = Rect(229, 263, 200, 53) # the position of the home button on pause scene self.rect_score = Rect(229, 328, 200, 53) # the position of the score 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_scene = Rect(229, 519, 200, 53) # the position of the manual button on the home scene self.rect_back = Rect(10, 590, 40, 30) # the position of the back button on the home scene self.rect_sound = Rect(10, 600, 30, 30) # the position of the sound button on the home scene self.rect_scene_next = Rect(597, 330, 40, 30) # the position of the next scene button on scene self.rect_scene_previous = Rect(3, 344, 40, 30) # the position of the previous scene button on scene if(self.rect.collidepoint(x, y) and (self.state == self.OVER or self.state == self.NEXT or self.state == self.WIN)): self.state = self.GAME elif(self.rect_play.collidepoint(x,y) and self.state == self.LOAD): self.state = self.GAME elif (self.rect_play.collidepoint(x, y) and self.state == self.PAUSE): self.state = self.GAME elif (self.rect_about.collidepoint(x, y) and self.state == self.LOAD): self.state = self.ABOUT elif (self.rect_score.collidepoint(x, y) and self.state == self.LOAD): self.state = self.SCORE elif (self.rect_scene.collidepoint(x, y) and self.state == self.LOAD): self.state = self.SCENE elif (self.rect_back.collidepoint(x, y) and self.state == self.SCENE): self.state = self.LOAD elif (self.rect_scene_next.collidepoint(x, y) and self.state == self.SCENE): self.game_scene.set_next_image() elif (self.rect_scene_previous.collidepoint(x, y) and self.state == self.SCENE): self.game_scene.set_previous_image() elif (self.rect_pause_home.collidepoint(x, y) and self.state == self.PAUSE): self.state = self.LOAD self.setup(self.level_manager.get_level()) self.save_level() elif (self.rect_manual.collidepoint(x, y) and self.state == self.LOAD): webbrowser.open_new('http://gamingdirectional.com/blog/2018/12/25/air-strike//') elif (self.rect_back.collidepoint(x, y) and (self.state == self.ABOUT or self.state == self.MANUAL or self.state == self.SCORE)): 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 save_level(self): self.level_manager.save_level() 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.boy_sprite.setX(_x) def save_scene(self): self.game_scene.take_screen() def set_player_y(self, _y): if (self.state == self.GAME): self.boy_sprite.setY(_y) def update(self): self.enemy_manager.update() self.mana_manager.update() self.boy_sprite.update() def draw(self): if(self.state == self.GAME): self.background.draw() #self.score_manager.draw() self.boy_sprite.draw() self.enemy_manager.draw() self.mana_manager.draw() pygame.display.flip()
import pygame from pygame.locals import * from GameManager import GameManager pygame.init() size = width, height = 640, 640 pygame.display.set_caption("Amaze Boy") # set the title of the window screen = pygame.display.set_mode(size) game_manager = GameManager(screen) rect_exit = Rect(229, 456, 200, 53) # the position of the exit button on the home scene running = True pygame.key.set_repeat(100, 40) while running: for event in pygame.event.get(): # when the user clicks on the 'x' if event.type == pygame.QUIT: game_manager.save_level() # save the game level before quit running = False # detect key press event if event.type == KEYDOWN: if (game_manager.state == 1): if event.key == K_LEFT: game_manager.set_player_x(-2) elif event.key == K_RIGHT: game_manager.set_player_x(2) elif event.key == K_UP: game_manager.set_player_y(-2) elif event.key == K_DOWN: game_manager.set_player_y(2) 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) elif event.key == K_UP: game_manager.set_player_y(0) elif event.key == K_DOWN: game_manager.set_player_y(0) elif event.key == K_p: game_manager.set_pause(True) # set the pause state to true elif event.key == K_s: # take the game screenshot game_manager.save_scene() elif event.type == pygame.MOUSEBUTTONDOWN: x, y = event.pos if (rect_exit.collidepoint(x, y) and game_manager.state == game_manager.LOAD): game_manager.save_level() running = False # 1 is the left mouse button elif event.button == 1: game_manager.isAreaClick(x, y) game_manager.loop()
With that, we have finished the building of the score page for our
Creating the level/score page for the @pygame_org project. The project is almost done! pic.twitter.com/gwE6qAMQ7O
— TechLikin (@ChooWhei) March 11, 2019