I am creating a very simple game called Escape! where a lion escapes from a cage and runs through a city. Jumping over cars and such. I've almost got all the ground work laid (controls, graphics), except that my game does not scroll yet. I am trying to go about this like the world revolves around the player, making the window keep the player somewhat centered. As of right now I have code to do this but it does seem to do anything. No error msg's are coming up, the game is running fine but does not scroll.
The main parts of the code that are suppose to do this are in the class "level".
Here's the code.
import pygame
from colors import *
class Player( pygame.sprite.Sprite ):
def __init__(self, color = blue, width = 32, height = 48 ):
super( Player, self ).__init__()
self.image = pygame.Surface( ( width, height ) )
## self.image.fill( color )
self.set_properites()
self.hspeed = 0
self.vspeed = 0
self.level = None
def set_properites( self ):
self.rect = self.image.get_rect()
self.origin_x = self.rect.centerx
self.origin_y = self.rect.centery
self.speed = 8
def set_position( self, x, y ):
self.rect.x = x - self.origin_x
self.rect.y = y - self.origin_y
def set_image( self, filename = None ):
if ( filename != None ):
self.image = pygame.image.load("Lion.gif")
## self.image.blit( player (self.rect.x, self.rect.y))
self.set_properites()
def set_level( self, level ):
self.level = level
self.set_position( level.player_start_x, level.player_start_y )
def update( self, collidable = pygame.sprite.Group(), event = None):
self.experience_gravity()
self.rect.x += self.hspeed
collision_list = pygame.sprite.spritecollide( self, collidable, False )
for collided_object in collision_list:
if ( self.hspeed > 0 ):
self.rect.right = collided_object.rect.left
elif ( self.hspeed < 0 ):
self.rect.left = collided_object.rect.right
self.rect.y += self.vspeed
collision_list = pygame.sprite.spritecollide( self, collidable, False )
for collided_object in collision_list:
if ( self.vspeed > 0 ):
self.rect.bottom = collided_object.rect.top
self.vspeed = 0
elif ( self.vspeed < 0 ):
self.rect.top = collided_object.rect.bottom
self.vspeed = 0
if not ( event == None ):
if ( event.type == pygame.KEYDOWN ):
if ( event.key == pygame.K_LEFT ):
self.hspeed = -self.speed
if ( event.key == pygame.K_RIGHT ):
self.hspeed = self.speed
if ( event.key == pygame.K_UP ):
if ( len( collision_list ) >= 1 ):
self.vspeed = -( self.speed )*2
if ( event.type == pygame.KEYUP ):
if ( event.key == pygame.K_LEFT ):
if ( self.hspeed < 0 ): self.hspeed = 0
if ( event.key == pygame.K_RIGHT ):
if ( self.hspeed > 0 ): self.hspeed = 0
def experience_gravity( self, gravity = .50 ):
if ( self.vspeed == 0 ): self.vspeed = 1
else: self.vspeed += gravity
class Block( pygame.sprite.Sprite ):
def __init__( self, x, y, width, height, color = blue ):
super( Block, self ).__init__()
self.image = pygame.Surface( ( width, height ))
self.image.fill( color )
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y
def __inti__( self, filename = None ):
if ( filename != None ):
self.image = pygame.image.load("Lion.gif")
self.rect = self.image.get_rect()
class Level( object ):
def __init__( self, player_object ):
self.object_list = pygame.sprite.Group()
self.player_object = player_object
self.player_start = self.player_start_x, self.player_start_y = 40, 600
self.world_shift_x = 0
self.world_shift_y = 0
self.left_viewbox = window_width/2 - window_width/8
self.right_viewbox = window_width/2 + window_width/10
self.up_viewbox = window_height/4
self.down_viewbox = window_height/2 + window_height/12
def update( self ):
self.object_list.update()
def draw( self, window ):
background = pygame.image.load("Background_2.gif")
backgroundrect = window.get_rect()
window.blit(background,backgroundrect)
## window.fill( white )
self.object_list.draw( window )
def shift_world( self, shift_x, shift_y ):
self.world_shift_x += shift_x
self.worlf_shift_y += shift_y
for each_object in self.object_list:
each_object.rect.x += shift_x
each_object.rect.x += shift_y
def run_viewbox( self ):
if ( self.player_object.rect.x <= self.left_viewbox ):
view_difference = self.left_viewbox - self.player_object.rect.x
self.player_object.rect.x = self.left_viewbox
self.shift_world( view_difference, 0 )
if ( self.player_object.rect.x >= self.right_viewbox ):
view_difference = self.right_viewbox - self.player_object.rect.x
self.player_object.rect.x = self.right_viewbox
self.shift_world( view_difference, 0 )
if ( self.player_object.rect.y <= self.up_viewbox ):
view_difference = self.up_viewbox - self.player_object.rect.y
self.player_object.rect.y = self.up_viewbox
self.shift_world( 0, view_difference )
if ( self.player_object.rect.y >= self.down_viewbox ):
view_difference = self.down_viewbox - self.player_object.rect.y
self.player_object.rect.y = self.down_viewbox
self.shift_world( 0, view_difference )
class Level_01( Level ):
def __init__( self, player_object ):
super( Level_01, self ).__init__( player_object )
self.player_start = self.player_start_x, self.player_start_y = 110, 575
level = [[ 2, 124, 356, 47, black ], [ 0, 650, 900, 47, black ],[ 0, 0, 1, 650, black], ]
for block in level:
block = Block( block[0], block[1], block[2], block[3], block[4] )
self.object_list.add( block )
if ( __name__ == "__main__" ):
pygame.init()
window_size = window_width, window_height = 800, 650
window = pygame.display.set_mode( window_size, pygame.RESIZABLE )
pygame.display.set_caption( "Exacpe!" )
clock = pygame.time.Clock()
frames_per_second = 60
active_object_list = pygame.sprite.Group()
player = Player()
player.set_image( "Lion.gif" )
player.set_position( 40, 600 )
active_object_list.add( player )
level_list = []
level_list.append( Level_01( player ) )
current_level_number = 0
current_level = level_list[ current_level_number ]
player.set_level( current_level )
running = True
while ( running ):
for event in pygame.event.get():
if ( event.type == pygame.QUIT ) or \
( event.type == pygame.KEYDOWN and \
( event.key == pygame.K_ESCAPE or event.key == pygame.K_q ) ):
running = False
# Update Functions
player.update( current_level.object_list, event )
event = None
current_level.update()
# Logic testing
current_level.run_viewbox
# Draw everything
current_level.draw( window )
active_object_list.draw( window )
# Delay Framerate
clock.tick( frames_per_second )
# Updated the Screen
pygame.display.update()
pygame.quit()