Files

83 lines
2.9 KiB
Python

###########################################
# Created on 1-7-2013. Miguel Angel Astor #
###########################################
import pygame
try:
import android
except ImportError:
android = None
import player
from state import VALID_STATES
from intro import IntroState
from menu import MenuState
from ingame import InGameState
from score import ScoreState
from constants import DEBUG
# The Game class implements the state machine of the game and
# runs the main game loop.
class Game:
def __init__(self, screen):
""" Sets the rendering canvas and the intial state. """
self.canvas = screen
self.current_state = VALID_STATES['INTRO']
self.done = False
self.clock = pygame.time.Clock()
# Initialize the different game states.
intro = IntroState()
menu = MenuState()
in_game = InGameState()
score = ScoreState()
# Create a states list.
self.state_vector = [intro, menu, in_game, score]
def get_state(self):
""" Returns the current state of the game. """
if self.current_state == VALID_STATES['INTRO']:
return "INTRO"
elif self.current_state == VALID_STATES['MENU']:
return "MENU"
elif self.current_state == VALID_STATES['IN_GAME']:
return "IN_GAME"
elif self.current_state == VALID_STATES['SCORE']:
return "SCORE"
elif self.current_state == VALID_STATES['QUIT']:
return "QUIT"
else:
return "NOT_VALID"
def game_loop(self):
""" The main game loop. """
while not self.done:
# Get user input first.
self.state_vector[self.current_state].input()
# Then update the game state.
transition = self.state_vector[self.current_state].update()
# Check if a state transition is required.
if transition != VALID_STATES['STAY']:
if transition == VALID_STATES['INTRO']:
self.current_state = VALID_STATES['INTRO']
elif transition == VALID_STATES['MENU']:
self.current_state = VALID_STATES['MENU']
elif transition == VALID_STATES['IN_GAME']:
self.current_state = VALID_STATES['IN_GAME']
elif transition == VALID_STATES['SCORE']:
self.current_state = VALID_STATES['SCORE']
elif transition == VALID_STATES['QUIT']:
self.done = True
self.current_state = VALID_STATES['QUIT']
else:
self.current_state = VALID_STATES['NOT_VALID']
if DEBUG:
print self.get_state()
# If the game is not over, render the current state.
if not self.done:
self.state_vector[self.current_state].render(self.canvas)
pygame.display.update()
self.clock.tick(60)