Created the main game loop and started writing the game's states.
This commit is contained in:
12
.gitignore
vendored
Normal file
12
.gitignore
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
# Emacs backup files #
|
||||
######################
|
||||
*~
|
||||
|
||||
# Compiled files #
|
||||
##################
|
||||
*.pyo
|
||||
*.pyc
|
||||
|
||||
# OS Files #
|
||||
############
|
||||
Thumbs.db
|
22
LICENSE
Normal file
22
LICENSE
Normal file
@@ -0,0 +1,22 @@
|
||||
Copyright (c) 2012, Miguel Angel Astor Romero
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
*) Redistributions of source code must retain the above
|
||||
copyright notice, this list of conditions and the following disclaimer.
|
||||
*) Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
84
game.py
Normal file
84
game.py
Normal file
@@ -0,0 +1,84 @@
|
||||
# Miguel Angel Astor Romero. Created on 7-1-2012. #
|
||||
###################################################
|
||||
import pygame
|
||||
|
||||
try:
|
||||
import android
|
||||
except ImportError:
|
||||
android = None
|
||||
|
||||
from state import VALID_STATES
|
||||
from intro import IntroState
|
||||
from menu import MenuState
|
||||
from ingame import InGameState
|
||||
from score import ScoreState
|
||||
from notvalidstate import NotValidState
|
||||
|
||||
# Debug constant. Comment to turn off debugging messages.
|
||||
DEBUG = True
|
||||
|
||||
# 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()
|
||||
not_valid = NotValidState()
|
||||
|
||||
# Create a states list.
|
||||
self.state_vector = [intro, menu, in_game, score, not_valid]
|
||||
|
||||
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)
|
||||
|
41
ingame.py
Normal file
41
ingame.py
Normal file
@@ -0,0 +1,41 @@
|
||||
# Miguel Angel Astor Romero. Created on 7-1-2012. #
|
||||
###################################################
|
||||
import pygame
|
||||
|
||||
try:
|
||||
import android
|
||||
except ImportError:
|
||||
android = None
|
||||
|
||||
from state import BaseState, VALID_STATES
|
||||
|
||||
class InGameState(BaseState):
|
||||
def __init__(self):
|
||||
self.count = 0
|
||||
self.rectangle = pygame.Rect(250, 350, 100, 100)
|
||||
self.next_transition = VALID_STATES['STAY']
|
||||
|
||||
def input(self):
|
||||
for event in pygame.event.get():
|
||||
if android:
|
||||
if android.check_pause():
|
||||
android.wait_for_resume()
|
||||
|
||||
if event.type == pygame.KEYDOWN:
|
||||
if event.key == pygame.K_ESCAPE:
|
||||
self.next_transition = VALID_STATES['QUIT']
|
||||
if event.type == pygame.QUIT:
|
||||
self.next_transition = VALID_STATES['QUIT']
|
||||
|
||||
def update(self):
|
||||
if self.next_transition != VALID_STATES['QUIT']:
|
||||
if self.count < 120:
|
||||
self.count += 1
|
||||
self.next_transition = VALID_STATES['STAY']
|
||||
else:
|
||||
self.count = 0
|
||||
self.next_transition = VALID_STATES['SCORE']
|
||||
return self.next_transition
|
||||
|
||||
def render(self, canvas):
|
||||
pygame.draw.rect(canvas, (255, 0, 255), self.rectangle)
|
41
intro.py
Normal file
41
intro.py
Normal file
@@ -0,0 +1,41 @@
|
||||
# Miguel Angel Astor Romero. Created on 7-1-2012. #
|
||||
###################################################
|
||||
import pygame
|
||||
|
||||
try:
|
||||
import android
|
||||
except ImportError:
|
||||
android = None
|
||||
|
||||
from state import BaseState, VALID_STATES
|
||||
|
||||
class IntroState(BaseState):
|
||||
def __init__(self):
|
||||
self.count = 0
|
||||
self.rectangle = pygame.Rect(250, 350, 100, 100)
|
||||
self.next_transition = VALID_STATES['STAY']
|
||||
|
||||
def input(self):
|
||||
for event in pygame.event.get():
|
||||
if android:
|
||||
if android.check_pause():
|
||||
android.wait_for_resume()
|
||||
|
||||
if event.type == pygame.KEYDOWN:
|
||||
if event.key == pygame.K_ESCAPE:
|
||||
self.next_transition = VALID_STATES['QUIT']
|
||||
if event.type == pygame.QUIT:
|
||||
self.next_transition = VALID_STATES['QUIT']
|
||||
|
||||
def update(self):
|
||||
if self.next_transition != VALID_STATES['QUIT']:
|
||||
if self.count < 120:
|
||||
self.count += 1
|
||||
self.next_transition = VALID_STATES['STAY']
|
||||
else:
|
||||
self.count = 0
|
||||
self.next_transition = VALID_STATES['MENU']
|
||||
return self.next_transition
|
||||
|
||||
def render(self, canvas):
|
||||
pygame.draw.rect(canvas, (255, 255, 255), self.rectangle)
|
45
main.py
Normal file
45
main.py
Normal file
@@ -0,0 +1,45 @@
|
||||
# Miguel Angel Astor Romero. Created on 7-1-2012. #
|
||||
###################################################
|
||||
import pygame
|
||||
|
||||
try:
|
||||
import android
|
||||
except ImportError:
|
||||
android = None
|
||||
|
||||
from game import Game
|
||||
|
||||
def main():
|
||||
""" Initializes PyGame and pgs4a and starts the game loop. """
|
||||
# Variables.
|
||||
screen = None
|
||||
|
||||
# Init PyGame.
|
||||
pygame.init()
|
||||
|
||||
if android:
|
||||
# Init pgs4a and map Android's back button to PyGame's escape key.
|
||||
android.init()
|
||||
android.map_key(android.KEYCODE_BACK, pygame.K_ESCAPE)
|
||||
# Get the device's screen size and request a surface of that size.
|
||||
screen_size = (pygame.display.Info().current_w,
|
||||
pygame.display.Info().current_h)
|
||||
screen = pygame.display.set_mode(screen_size)
|
||||
else:
|
||||
# If not on Android, default to a 800x600 pixels screen.
|
||||
screen = pygame.display.set_mode((800, 600))
|
||||
pygame.display.set_caption("Super HUGS Revolution 98")
|
||||
|
||||
# Create the main game object.
|
||||
game = Game(screen)
|
||||
|
||||
# Start the game.
|
||||
print game.get_state()
|
||||
game.game_loop()
|
||||
|
||||
# Cleanly terminate PyGame.
|
||||
pygame.quit()
|
||||
|
||||
# Required by pgs4a.
|
||||
if __name__ =="__main__":
|
||||
main()
|
41
menu.py
Normal file
41
menu.py
Normal file
@@ -0,0 +1,41 @@
|
||||
# Miguel Angel Astor Romero. Created on 7-1-2012. #
|
||||
###################################################
|
||||
import pygame
|
||||
|
||||
try:
|
||||
import android
|
||||
except ImportError:
|
||||
android = None
|
||||
|
||||
from state import BaseState, VALID_STATES
|
||||
|
||||
class MenuState(BaseState):
|
||||
def __init__(self):
|
||||
self.count = 0
|
||||
self.rectangle = pygame.Rect(250, 350, 100, 100)
|
||||
self.next_transition = VALID_STATES['STAY']
|
||||
|
||||
def input(self):
|
||||
for event in pygame.event.get():
|
||||
if android:
|
||||
if android.check_pause():
|
||||
android.wait_for_resume()
|
||||
|
||||
if event.type == pygame.KEYDOWN:
|
||||
if event.key == pygame.K_ESCAPE:
|
||||
self.next_transition = VALID_STATES['QUIT']
|
||||
if event.type == pygame.QUIT:
|
||||
self.next_transition = VALID_STATES['QUIT']
|
||||
|
||||
def update(self):
|
||||
if self.next_transition != VALID_STATES['QUIT']:
|
||||
if self.count < 120:
|
||||
self.count += 1
|
||||
self.next_transition = VALID_STATES['STAY']
|
||||
else:
|
||||
self.count = 0
|
||||
self.next_transition = VALID_STATES['IN_GAME']
|
||||
return self.next_transition
|
||||
|
||||
def render(self, canvas):
|
||||
pygame.draw.rect(canvas, (0, 255, 255), self.rectangle)
|
34
notvalidstate.py
Normal file
34
notvalidstate.py
Normal file
@@ -0,0 +1,34 @@
|
||||
# Miguel Angel Astor Romero. Created on 7-1-2012. #
|
||||
###################################################
|
||||
import pygame
|
||||
|
||||
try:
|
||||
import android
|
||||
except ImportError:
|
||||
android = None
|
||||
|
||||
from state import BaseState, VALID_STATES
|
||||
|
||||
class NotValidState(BaseState):
|
||||
def __init__(self):
|
||||
self.count = 0
|
||||
self.rectangle = pygame.Rect(250, 350, 100, 100)
|
||||
self.next_transition = VALID_STATES['STAY']
|
||||
|
||||
def input(self):
|
||||
for event in pygame.event.get():
|
||||
if android:
|
||||
if android.check_pause():
|
||||
android.wait_for_resume()
|
||||
|
||||
if event.type == pygame.KEYDOWN:
|
||||
if event.key == pygame.K_ESCAPE:
|
||||
self.next_transition = VALID_STATES['QUIT']
|
||||
if event.type == pygame.QUIT:
|
||||
self.next_transition = VALID_STATES['QUIT']
|
||||
|
||||
def update(self):
|
||||
return self.next_transition
|
||||
|
||||
def render(self, canvas):
|
||||
pygame.draw.rect(canvas, (0, 0, 0), self.rectangle)
|
41
score.py
Normal file
41
score.py
Normal file
@@ -0,0 +1,41 @@
|
||||
# Miguel Angel Astor Romero. Created on 7-1-2012. #
|
||||
###################################################
|
||||
import pygame
|
||||
|
||||
try:
|
||||
import android
|
||||
except ImportError:
|
||||
android = None
|
||||
|
||||
from state import BaseState, VALID_STATES
|
||||
|
||||
class ScoreState(BaseState):
|
||||
def __init__(self):
|
||||
self.count = 0
|
||||
self.rectangle = pygame.Rect(250, 350, 100, 100)
|
||||
self.next_transition = VALID_STATES['STAY']
|
||||
|
||||
def input(self):
|
||||
for event in pygame.event.get():
|
||||
if android:
|
||||
if android.check_pause():
|
||||
android.wait_for_resume()
|
||||
|
||||
if event.type == pygame.KEYDOWN:
|
||||
if event.key == pygame.K_ESCAPE:
|
||||
self.next_transition = VALID_STATES['QUIT']
|
||||
if event.type == pygame.QUIT:
|
||||
self.next_transition = VALID_STATES['QUIT']
|
||||
|
||||
def update(self):
|
||||
if self.next_transition != VALID_STATES['QUIT']:
|
||||
if self.count < 120:
|
||||
self.count += 1
|
||||
self.next_transition = VALID_STATES['STAY']
|
||||
else:
|
||||
self.count = 0
|
||||
self.next_transition = VALID_STATES['MENU']
|
||||
return self.next_transition
|
||||
|
||||
def render(self, canvas):
|
||||
pygame.draw.rect(canvas, (255, 255, 0), self.rectangle)
|
19
state.py
Normal file
19
state.py
Normal file
@@ -0,0 +1,19 @@
|
||||
# Miguel Angel Astor Romero. Created on 7-1-2012. #
|
||||
###################################################
|
||||
|
||||
# Valid game states.
|
||||
VALID_STATES = { 'INTRO':0, 'MENU':1, 'IN_GAME':2, 'SCORE':3, 'STAY':4, 'QUIT':89}
|
||||
|
||||
# Parent class for game states.
|
||||
class BaseState:
|
||||
def input(self):
|
||||
""" Empty. Should handle PyGame input. """
|
||||
pass
|
||||
|
||||
def update(self):
|
||||
""" Empty. Should update the state. Returns a state to transition to. """
|
||||
return VALID_STATES['STAY']
|
||||
|
||||
def render(self, canvas):
|
||||
""" Empty. Should render this state on the canvas. """
|
||||
pass
|
Reference in New Issue
Block a user