--- a05/jogo.py 2005-04-17 18:32:18.482731784 -0300 +++ a06/jogo.py 2005-04-17 18:33:03.080951824 -0300 @@ -4,15 +4,13 @@ ############################################################################### # # Mudanças em relação à versão anterior: -# - classe Fire() representa os tiros -# - acrescenta tiros. Objetos apresentam o método fire() -# - detecta acerto de tiros no jogador e inimigos -# - mudança de nível baseado nos acertos do personagem -# - inimigos atiram aleatoriamente +# - naves inimigas tem comportamento diferente (behaviour) +# - painel de estado do jogador (vidas e acertos) +# - otimizacoes: lê a imagem somente uma vez. (Game.load_images()) # ############################################################################### -import os, sys +import os, sys, copy import getopt # E importaremos o pygame tambem para esse exemplo @@ -132,7 +130,7 @@ class Ship( GameObject ): - def __init__( self, position, lives=0, speed=None, image=None ): + def __init__( self, position, lives=0, speed=[ 0, 0 ], image=None ): self.acceleration = [ 3, 3 ] if not image: image = "nave.png" @@ -216,9 +214,17 @@ class Enemy( Ship ): - def __init__( self, position, lives=0, speed=None, image=None ): + def __init__( self, position, lives=0, behaviour=0, image=None ): if not image: image = "inimigo.png" + + if behaviour == 0: # Inimigo normal, desce reto + speed = ( 0, 3 ) + elif behaviour == 1: # Inimigo que desce da esquerda pra direita + speed = ( 2, 3 ) + elif behaviour == 2: # Inimigo que desce da direita pra esquerda + speed = ( -2, 3 ) + Ship.__init__( self, position, lives, speed, image ) # __init__() # Enemy @@ -324,6 +330,87 @@ +class PlayerXPStatus: + """ + Esta classe representa a experiência do usuário + """ + font = None + last_xp = -1 + fgcolor = None + bgcolor = None + image = None + + def __init__( self, player, pos=None, font=None, ptsize=30, + fgcolor="0xffff00", bgcolor=None ): + self.player = player + self.fgcolor = pygame.color.Color( fgcolor ) + if bgcolor: + self.bgcolor = pygame.color.Color( bgcolor ) + self.pos = pos or [ 0, 0 ] + self.font = pygame.font.Font( font, ptsize ) + # __init__() + + def update( self, dt ): + pass + # 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, True, self.fgcolor, + self.bgcolor ) + else: + self.image = self.font.render( text, True, self.fgcolor ) + + screen.blit( self.image, self.pos ) + + # draw() +# PlayerXPStatus + + + + +class PlayerLifeStatus: + """ + Esta classe representa o contador de vidas do jogador + """ + player = None + pos = None + image = None + size_image = None + spacing = 5 + def __init__( self, player, pos=None, image=None ): + self.image = image or "nave_status.png" + if isinstance( self.image, str ): + self.image = os.path.join( images_dir, self.image ) + self.image = pygame.image.load( self.image ) + + self.player = player + self.pos = pos or [ 5, 5 ] + self.size_image = self.image.get_size() + # __init__() + + + + def update( self, dt ): + pass + # update() + + + + def draw( self, screen ): + pos = copy.copy( self.pos ) + for i in range( self.player.get_lives() ): + pos[ 0 ] += self.size_image[ 0 ] + self.spacing + screen.blit( self.image, pos ) + # draw() +# PlayerLifeStatus + + + class Background: """ @@ -411,6 +498,8 @@ level = 0 list = None player = None + player_life = None + player_xp = None background = None def __init__( self, size, fullscreen ): @@ -428,10 +517,25 @@ pygame.mouse.set_visible( 0 ) pygame.display.set_caption( 'Título da Janela' ) + + self.load_images() # init() + def load_images( self ): + """ + Lê as imagens necessarias pelo jogo. + """ + p = images_dir + os.path.sep + self.image_player = pygame.image.load( p + "nave.png" ) + self.image_enemy = pygame.image.load( p + "inimigo.png" ) + self.image_fire = pygame.image.load( p + "tiro.png" ) + self.image_enemy_fire = pygame.image.load( p + "tiro_inimigo.png" ) + # load_images() + + + def handle_events( self ): """ Trata o evento e toma a ação necessária. @@ -451,7 +555,7 @@ self.run = False elif k == K_LCTRL or k == K_RCTRL: self.interval = 0 - player.fire( self.list[ "fire" ] ) + player.fire( self.list[ "fire" ], self.image_fire ) elif k == K_UP: player.accel_top() elif k == K_DOWN: @@ -475,7 +579,7 @@ if self.interval > 10: self.interval = 0 if keys[ K_RCTRL ] or keys[ K_LCTRL ]: - player.fire( self.list[ "fire" ] ) + player.fire( self.list[ "fire" ], self.image_fire ) # handle_events() @@ -486,6 +590,9 @@ for actor in self.list.values(): actor.update( dt ) + + self.player_life.update( dt ) + self.player_xp.update( dt ) # actors_update() @@ -495,6 +602,9 @@ for actor in self.list.values(): actor.draw( self.screen ) + + self.player_life.draw( self.screen ) + self.player_xp.draw( self.screen ) # actors_draw() @@ -562,18 +672,22 @@ for enemy in self.list[ "enemies" ].sprites(): if Random.randint( 0, 10 ) > 5: enemy.fire( self.list[ "enemies_fire" ], - image="tiro_inimigo.png" ) + image=self.image_enemy_fire ) self.ticks = 0 # criamos mais inimigos randomicamente para o jogo não ficar chato r = Random.randint( 0, 100 ) x = Random.randint( 1, self.screen_size[ 0 ] / 20 ) if ( r > ( 40 * len( self.list[ "enemies" ] ) ) ): - enemy = Enemy( [ 0, 0 ] ) - size = enemy.get_size() + behaviour = Random.randint( 0, 2 ) + lives = self.level + enemy = Enemy( [ 0, 0 ], lives, behaviour, + image=self.image_enemy ) + size = enemy.get_size() enemy.set_pos( [ x * size[ 0 ], - size[ 1 ] ] ) self.list[ "enemies" ].add( enemy ) + # Verifica se ascendeu de nível self.change_level() # manage() @@ -595,11 +709,17 @@ self.interval = 1 pos = [ self.screen_size[ 0 ] / 2, self.screen_size[ 1 ] ] - self.player = Player( pos, lives=10 ) + self.player = Player( pos, lives=10, image=self.image_player ) + + self.player_life = PlayerLifeStatus( self.player, [ 5, 5 ] ) + self.player_xp = PlayerXPStatus( self.player, + [ self.screen_size[ 0 ] - 100, 5 ], + fgcolor="0xff0000" ) self.list = { "player" : pygame.sprite.RenderPlain( self.player ), - "enemies" : pygame.sprite.RenderPlain( Enemy( [ 120, 0 ] ) ), + "enemies" : pygame.sprite.RenderPlain( Enemy( [ 120, 0 ], + image=self.image_enemy ) ), "fire" : pygame.sprite.RenderPlain(), "enemies_fire" : pygame.sprite.RenderPlain() }