--- a07/jogo.py 2005-10-08 12:24:11.000000000 -0300 +++ a08/jogo.py 2005-10-08 13:38:36.000000000 -0300 @@ -4,7 +4,7 @@ ############################################################################### # # Mudanças em relação à versão anterior: -# - otimizações: usar colorkey ao invés de transparência por pixel (alpha) +# - otimizações: usar técnica de "dirty-rectangles" # ############################################################################### @@ -346,6 +346,8 @@ self.bgcolor = pygame.color.Color( bgcolor ) self.pos = pos or [ 0, 0 ] self.font = pygame.font.Font( font, ptsize ) + + self.last_rect = None # __init__() def update( self, dt ): @@ -353,21 +355,26 @@ # update() def draw( self, screen ): - xp = self.player.get_XP() - if self.last_xp != xp: - self.last_xp = xp - text = "XP: % 4d" % xp - if self.bgcolor: - self.image = self.font.render( text, False, self.fgcolor, - self.bgcolor ) - else: - self.image = self.font.render( text, False, self.fgcolor, - ( 255, 0, 255 ) ) - self.image.set_colorkey( ( 255, 0, 255 ), RLEACCEL ) - + text = "XP: % 4d" % self.player.get_XP() + if self.bgcolor: + self.image = self.font.render( text, False, self.fgcolor, + self.bgcolor ) + else: + self.image = self.font.render( text, False, self.fgcolor, + ( 255, 0, 255 ) ) + self.image.set_colorkey( ( 255, 0, 255 ), RLEACCEL ) + + self.last_rect = Rect( self.pos, self.image.get_size() ) + screen.blit( self.image, self.pos ) # draw() + + + def clear( self, screen, background ): + if self.last_rect: + screen.blit( background, self.last_rect ) + # clear() # PlayerXPStatus @@ -391,6 +398,7 @@ self.player = player self.pos = pos or [ 5, 5 ] self.size_image = self.image.get_size() + self.last_rect = None # __init__() @@ -406,7 +414,16 @@ for i in range( self.player.get_lives() ): pos[ 0 ] += self.size_image[ 0 ] + self.spacing screen.blit( self.image, pos ) + + pos[ 1 ] = self.size_image[ 1 ] + self.last_rect = Rect( self.pos, pos ) # draw() + + + def clear( self, screen, background ): + if self.last_rect: + screen.blit( background, self.last_rect ) + # clear() # PlayerLifeStatus @@ -421,7 +438,9 @@ """ image = None pos = None - + update_threshold = 30 + update_step = 1 + def __init__( self, image="tile.png" ): """ Com essa função criamos uma superfície, formada de uma repetição da @@ -455,7 +474,7 @@ image = image.convert() self.isize = image.get_size() - self.pos = [ 0, -1 * self.isize[ 1 ] ] + self.pos = [ 0, 0 ] screen = pygame.display.get_surface() screen_size = screen.get_size() @@ -473,20 +492,35 @@ back.set_alpha( None, RLEACCEL ) self.image = back.convert() + + self.last = 0 + self.current = self.update_threshold # atualize na primeira vez # __init__() def update( self, dt ): - self.pos[ 1 ] += 1 - if ( self.pos[ 1 ] > 0 ): - self.pos[ 1 ] -= self.isize[ 1 ] + self.current += 1 # update() def draw( self, screen ): - screen.blit( self.image, self.pos ) + size = screen.get_size() + + if self.current >= self.last + self.update_threshold: + self.last = self.current + self.pos[ 1 ] += self.update_step + + current_rect = Rect( self.pos, size ) + image_rect = self.image.get_rect() + + if not image_rect.contains( current_rect ): + self.pos[ 1 ] -= self.isize[ 1 ] + + screen.blit( self.image, self.pos ) + + return self.image.subsurface( Rect( self.pos, size ) ) # draw() # Background @@ -607,10 +641,18 @@ # actors_update() + def actors_clear( self ): + bg = self.background.draw( self.screen ) + + for actor in self.list.values(): + actor.clear( self.screen, bg ) + + self.player_life.clear( self.screen, bg ) + self.player_xp.clear( self.screen, bg ) + # actors_clear() + def actors_draw( self ): - self.background.draw( self.screen ) - for actor in self.list.values(): actor.draw( self.screen ) @@ -621,7 +663,7 @@ def actor_check_hit( self, actor, list, action ): - if isinstance( actor, pygame.sprite.RenderPlain ): + if isinstance( actor, pygame.sprite.RenderUpdates ): hitted = pygame.sprite.groupcollide( actor, list, 1, 0 ) for v in hitted.values(): for o in v: @@ -729,11 +771,11 @@ fgcolor="0xff0000" ) self.list = { - "player" : pygame.sprite.RenderPlain( self.player ), - "enemies" : pygame.sprite.RenderPlain( Enemy( [ 120, 0 ], + "player" : pygame.sprite.RenderUpdates( self.player ), + "enemies" : pygame.sprite.RenderUpdates( Enemy( [ 120, 0 ], image=self.image_enemy ) ), - "fire" : pygame.sprite.RenderPlain(), - "enemies_fire" : pygame.sprite.RenderPlain() + "fire" : pygame.sprite.RenderUpdates(), + "enemies_fire" : pygame.sprite.RenderUpdates() } # assim iniciamos o loop principal do programa @@ -752,7 +794,10 @@ # Faça a manutenção do jogo, como criar inimigos, etc. self.manage() - + + # Limpe o que os atroes sujaram durante a iteração anterior + self.actors_clear() + # Desenhe para o back buffer self.actors_draw()