From a25a98fd5f4a96345e068a39bbb6a5d3d84efc67 Mon Sep 17 00:00:00 2001 From: TJ Date: Thu, 14 Nov 2013 21:35:08 +0000 Subject: [PATCH] Add Splash screen, begin music earlier, and control scroll speed with F1-F12 --- base2-runner.py | 16 ++++++++++++---- engine/Channel.py | 7 +++++-- engine/Game.py | 37 +++++++++++++++++++++++++++++++++++-- 3 files changed, 52 insertions(+), 8 deletions(-) diff --git a/base2-runner.py b/base2-runner.py index 7937a84..e00642e 100755 --- a/base2-runner.py +++ b/base2-runner.py @@ -4,7 +4,7 @@ # # 2D platform scrolling game that teaches binary logic -import sys, os, time, random, pygame +import sys, os, time, random, math, pygame import engine # Use conditionals in the code to print useful information to the console using the form: @@ -22,9 +22,13 @@ class Base2Runner: screen = None # the pygame Screen for the game window def __init__(self, width, height, title, resources={}, debug=False): + os.environ['SDL_VIDEO_CENTERED'] = '1' pygame.init() self.debug = debug self.myGame = engine.Game(width, height, title, resources, debug=self.debug) + if self.myGame.config['sound'] == 1: + self.myGame.soundtrack.playlist(self.myGame.resources['soundtrack']) + self.background_colour = (20, 20, 64) if 'icon' in self.myGame.resources: if self.debug: engine.debug_pr("pygame.image.get_extended()=%r" % pygame.image.get_extended()) @@ -50,9 +54,6 @@ class Base2Runner: # starting position y = resolution[1] / 2 - if self.myGame.config['sound'] == 1: - self.myGame.soundtrack.playlist(self.myGame.resources['soundtrack']) - self.myGame.config['auto_scroll'] = False movement = 0 # represents number of pixels, and direction, of next scroll x_pos = 0 # coordinate of left side of viewport @@ -105,6 +106,11 @@ class Base2Runner: self.myGame.soundtrack.pause() elif k == pygame.K_l: self.myGame.config['auto_scroll'] = True if self.myGame.config['auto_scroll'] == False else False + elif k >= pygame.K_F1 and k <= pygame.K_F12: + self.stepping = k - (pygame.K_F1 - 1) + if self.myGame.config['auto_scroll']: + movement = int(math.copysign(self.stepping, movement)) + if self.debug: engine.debug_pr("Keypress=%d, movement=%d" % (k, movement)) if event.type == pygame.USEREVENT: if self.debug: engine.debug_pr("pygame.USEREVENT received; calling playlist_next()") @@ -138,6 +144,7 @@ class Base2Runner: def main(width, height, title, resources={}, debug=False): game = Base2Runner(width, height, title, resources, debug) + time.sleep(10) # keep splash screen up for a little longer game.play() exit(0) @@ -148,4 +155,5 @@ if __name__ == '__main__': resources['background'] = 'binary-1024x1024.jpg' resources['splash'] = 'base2runner.jpg' resources['soundtrack'] = 'Music' + resources['copyright'] = '© Copyright 2013 TJ ' main(900, 600, "Base² Runner", resources, debug=True) diff --git a/engine/Channel.py b/engine/Channel.py index 71c6651..12f6215 100755 --- a/engine/Channel.py +++ b/engine/Channel.py @@ -18,8 +18,10 @@ class Channel: # use integers to control volume which avoids float rounding error issues MAX = 100 MIN = 0 + volume = 50 volume_step = 5 - def __init__(self, volume=1.0, channel_id=0, debug=False): + + def __init__(self, volume=50, channel_id=0, debug=False): """ Constructor. volume: an SDL/PyGame floating-point with range 0.00 to 1.00. It is stored internally as an integer with range 0 to 100 to avoid rounding errors when stepping the volume. @@ -28,7 +30,6 @@ class Channel: self.channel == None indicates this is the Music channel. """ - self.volume = int(volume*100) self.channel_id = 0 self.debug = debug self.paused = False @@ -39,6 +40,8 @@ class Channel: self.channel_id = channel_id self.channel = pygame.mixer.Channel(self.channel_id) + self.set_volume(int(volume)) + def set_volume(self, new_level): """ Ensure the new level is within legal range and alter the mixer level """ if new_level >= Channel.MIN and new_level <= Channel.MAX: diff --git a/engine/Game.py b/engine/Game.py index 38174de..203be80 100755 --- a/engine/Game.py +++ b/engine/Game.py @@ -9,6 +9,8 @@ import os.path, pygame, engine class Game: """ Container for all game state and configuration items """ config = dict() + fonts = dict() + colours = dict() resources = None def res_path(self, key): @@ -18,8 +20,8 @@ class Game: if key in self.resources: self.resources[key] = os.path.join(self.resources['path'], self.resources[key]) return True - - return False + else: + return False def __init__(self, width=0, height=0, title="", resources={}, debug=False): """ Constructor. @@ -29,11 +31,17 @@ class Game: resources: Dictionary containing resources debug: enable debug messages written to console """ + # define the colour styles we need + self.colours['h1'] = (255, 255, 255) + self.colours['body'] = (0, 255, 255) + + # store the received values self.config.update({'width':width, 'height':height}) self.config.update({'title':title}) self.resolution = width, height self.debug = debug + # prefix the resource path to all resource filenames self.resources = resources if not self.resources['path']: self.resources['path'] = '' @@ -41,14 +49,39 @@ class Game: self.res_path('soundtrack') self.res_path('icon') self.res_path('background') + self.res_path('splash') # default values + self.resources['title'] = title self.config.update({'sound':1}) # default to playing sound self.play = False # Flag that controls exit from main loop self.paused = False # Flag controlling pause of game play self.soundtrack = engine.Channel(channel_id=-1, debug=self.debug) self.sound_effects = engine.Channel(channel_id=0, debug=self.debug) + # splash screen + self.splash() + + def splash(self): + # draw the splash screen + if self.resources['splash']: + # find out the image dimensions + self.splash_screen = pygame.display.set_mode((0,0), pygame.NOFRAME) + self.splash_image = pygame.image.load(self.resources['splash']).convert() + resolution = self.splash_image.get_size() + # draw a splash screen until the game is ready + if self.debug: engine.debug_pr("Splash screen=%s" % self.resources['splash'], resolution) + self.splash_screen = pygame.display.set_mode(resolution, pygame.NOFRAME) + self.splash_image = pygame.image.load(self.resources['splash']).convert() + self.splash_screen.blit(self.splash_image, (0,0)) + self.fonts['h1'] = pygame.font.Font(None, 80) + self.fonts['body'] = pygame.font.Font(None, 30) + x, y = 40, 10 + self.splash_screen.blit(self.fonts['h1'].render(self.resources['title'], True, self.colours['h1']), (x, y)) + y += 80 + self.splash_screen.blit(self.fonts['body'].render(self.resources['copyright'], True, self.colours['body']), (x, y)) + pygame.display.update() + def pause(self): """ Toggle the game's paused state """ self.paused = True if self.paused == False else False -- 2.17.1