1

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()
M.javid
  • 6,387
  • 3
  • 41
  • 56
Unnarrow
  • 11
  • 1
  • FYI, I've found pygame's performance for full-screen scrolling to be nearly unusable. It just isn't able to push pixels fast enough. – user3757614 Dec 10 '14 at 19:34
  • No offence, but did you consider that it might either be the system or the code causing these problems? I wrote several such sidescrollers with resolutions of up to 1600x1200 in fullscreen and it worked; including stuff like moving(!) clouds (transparency and semi-transparency) and particles. – Patric Hartmann Dec 10 '14 at 20:59

0 Answers0