Pygame surfaces and their Rects

Posted by Jaka Novak on Game Development See other posts from Game Development or by Jaka Novak
Published on 2012-12-17T15:21:43Z Indexed on 2012/12/17 17:14 UTC
Read the original article Hit count: 410

Filed under:

I am trying to understand how pygame surfaces work. I am confused about Rect position of Surface object. If I try blit surface on screen at some position then Surface is drawn at right position, but Rect of the surface is still at position (0, 0)... I tried write my own surface class with new rect, but i am not sure if is that right solution. My goal is that i could move surface like image with rect.move() or something like that. If there is any solution to do that i would be happy to read it.

Thanks for answer and time for reading this awful English

If helps i write some code for better understanding my problem. (run it first, and then uncomment two lines of code and run again to see the diference):

import pygame
from pygame.locals import *

class SurfaceR(pygame.Surface):
    def __init__(self, size, position):
        pygame.Surface.__init__(self, size)
        self.rect = pygame.Rect(position, size)
        self.position = position
        self.size = size

    def get_rect(self):
        return self.rect


def main():
    pygame.init()
    screen = pygame.display.set_mode((640, 480))
    pygame.display.set_caption("Screen!?")
    clock = pygame.time.Clock()
    fps = 30

    white = (255, 255, 255)
    red = (255, 0, 0)
    green = (0, 255, 0)
    blue = (0, 0, 255)

    surface = pygame.Surface((70,200))
    surface.fill(red)

    surface_re = SurfaceR((300, 50), (100, 300))
    surface_re.fill(blue)

    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                return 0

        screen.blit(surface, (100,50))
        screen.blit(surface_re, surface_re.position)

        #pygame.draw.rect(screen, white, surface.get_rect())
        #pygame.draw.rect(screen, white, surface_re.get_rect())

        pygame.display.update()
        clock.tick(fps)

if __name__ == "__main__":
    main()

© Game Development or respective owner

Related posts about pygame