[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

Re: [pygame] how to bind surface rects without subsurface (need help with bug)



Makes so much more sense now...and that worked great.

Thanks :)

/me does a little happy python dance

On Tue, Mar 10, 2009 at 12:34 PM, Patrick Mullen <saluk64007@xxxxxxxxx> wrote:
Yep, changing the layer order is just a quick fix, not a real
solution.  You can keep the layer order you had before, and add a
move_layers function to the map.  Give the player a reference to the
map instead of the two layers, and call move_layers in the spots you
are setting the background.move and foreground.move.  Map.move_layers
would look something like this:

def move_layers(self, amount):
   for layer in [self.background, self.foreground]:
       layer.dirty = 1
       layer.rect.move_ip(amount)

Actually, it might be even better to just make move a function instead
of an attribute on TileLayer.  You will have to change less code (but
will still have the ugly bg/fg references in player).

class TileLayer(pygame.sprite.DirtySprite):
       def __init__(self, screen, layer, w, numx, h, numy):
               self.screen = screen
               pygame.sprite.DirtySprite.__init__(self)
               if layer == 'fg':
                       self.image = pygame.Surface((w*numx,h*numy), SRCALPHA, 32).convert_alpha()
               else:
                       self.image = pygame.Surface((w*numx,h*numy)).convert()
               self.rect = self.image.get_rect()

       def move(self):
               self.dirty = 1
               self.rect.move_ip(self.move)

Then in player you would say:
self.background.move([self.movement, 0])
self.foreground.move([self.movement, 0])

etc.  Instead of assigning to those values.

The real problem is that you are delaying an action until the update
functions when it is really (in this case) an in-place action.