Search code examples
pythonpygamesprite

using the pygame: [spritesheet].subsurface function, is there a way to draw the sprite from the bottom rather than the top left corner


I have a set of sprites, also on a spritesheet, which bounces slightly up and down, so the sprite height changes slightly. By coding: spritesheet.subsurface(x, y, width, height), it will draw the sprite starting from (x, y) and then the width and height to the right and down respectively, however, when drawing the frames from the same screen-relative position, the sprite looks like the feet are moving down and up. So that, if I had positioned frame 1 of the sprite to have the feet touching the floor, frame 2 would have the feet through the floor.

Is there a way to draw the sprite, say, from the bottom left, or bottom centre? Many thanks


Solution

  • pygame.Surface.subsurface uses a rectangular area to create a new surface that references its parent. The origin (0, 0) of the pygame coordinate system is the top left. This cannot be changed.

    However, if you know the bottom left coordinate (left_x, bottom_y) of a sprit on a spritsheet the rectangle of the sprite can be computed (spritesheet is a pygame.Surface object):

    sheet_height = spritsheet.get_height()
    sprite = spritsheet.subsurface((left_x, sheet_height - bottom_y - height, width, height))
    

    The code can be made more comprehensible with a pygame.Rect object:

    sheet_height = spritsheet.get_height()
    
    sprite_rect = pygame.Rect(left_x, 0, height, height)
    sprite_rect.bottom = sheet_height - bottom_y 
    
    sprite = spritsheet.subsurface(sprite_rect )