Olá! Continuando nosso pequeno joguinho, esta semana vamos fazer a tela de fundo um pouco mais interessante que apenas um fundo preto e opaco... Vamos adicionar estrelas, com movimento!
Abaixo está o código da classe "Background", que devemos salvar no arquivo "background.py".
# coding: utf8
# background.py
import pygame
import random
class Background(object):
def __init__(self, max_stars=100):
self.max_speed = 6
screen = pygame.display.get_surface()
size = screen.get_size()
back = pygame.Surface(size).convert()
back.fill( (0,0,0) )
self.image = back
self.stars = []
for _ in range(max_stars):
rand = random.randint
self.stars.append( [rand(0, size[0]), rand(0, size[1]), rand(1, self.max_speed)])
def update(self):
size = pygame.display.get_surface().get_size()
for star in self.stars:
star[1] += star[2]
if star[1] >= size[1]:
star[1] = 0
star[0] = random.randint(0, size[0])
star[2] = random.randint(1, self.max_speed)
def draw(self, screen):
image = self.image
image.fill( (0, 0, 0) )
for star in self.stars:
image.set_at(star[:2], (255, 255, 255))
screen.blit(self.image, (0, 0))
Como vocês podem ver, a classe é bem simples. Inicializamos a o objeto background com um número máximo padrão de 100 estrelas, cada estrela irá se mover de cima para baixo na tela, dando a impressão que estamos percorrendo o espaço. Atribuímos também a velocidade máxima com que cada estrela poderá se movimentar.
Preenchemos a tela com o tradicional fundo preto, criamos uma "Surface" que será onde iremos desenhar nossas estrelas e salvamos essa "Surface" na variável "self.image".
Agora a parte interessante. A criação das estrelas. Para nosso exemplo, faremos da forma mais simples possível: uma array com 3 números, representando a posição da estrela e sua velocidade (x, y, velocidade).
O método "update(self)" é onde ocorre a atualização do estado do nosso background. O que faremos aqui é simplesmente adicionar a velocidade (star[2]) à coordenada y da posição (star[1]). Caso após adicionarmos a velocidade a estrela suma, ou seja, sua cordenada y passe a ser maior que o tamanho da nossa tela na vertical, reposicionamos esta estrela, colocando-a no topo da tela, com novos valores para a coordenada x e para a velocidade. Note que para a velocidade sempre iremos desejar um valor >= 1, pois caso contrário teríamos uma estrela estática.
O método "draw(self)" é mais simples ainda. Preenchemos a nossa imagem com preto e então percorremos a lista de estrelas, adicionando um ponto branco para cada uma delas em sua posição atual. Após isso chamamos "blit" na variável "screen". O que está função faz é copiar o conteúdo de uma "Surface" para outra. Assim, ao copiarmos o fundo para a "Surface" screen, estaremos substituindo a imagem que será mostrada na tela na próxima atualização.
O que resta agora é apenas alterar a classe "Game" para utilizar o nosso background animado. Abaixo está o código da classe com as devidas alterações:
# coding: utf8
# game.py
import pygame
import random
from pygame.locals import *
import background
class Game(object):
def __init__(self, size):
pygame.init()
flags = DOUBLEBUF
self.screen = pygame.display.set_mode(size, flags)
self.screen_size = self.screen.get_size()
pygame.mouse.set_visible(False)
pygame.display.set_caption('Meu Primeiro Jogo em Python')
self.run = True
self.list = {
'player': pygame.sprite.RenderPlain(),
'enemy': pygame.sprite.RenderPlain(),
'fire': pygame.sprite.RenderPlain(),
'enemy_fire': pygame.sprite.RenderPlain(),
}
self.player = None
self.background = background.Background()
def update_actors(self):
if self.background is not None:
self.background.update()
for actor in self.list.values():
actor.update()
def draw_actors(self):
if self.background is not None:
self.background.draw(self.screen)
else:
self.screen.fill(0)
for actor in self.list.values():
actor.draw(self.screen)
def act_actors(self):
pass
def manage(self):
pass
def handle_events(self):
player = self.player
for event in pygame.event.get():
t = event.type
if t in (KEYDOWN, KEYUP):
k = event.key
if t == QUIT:
self.run = False
elif t == KEYDOWN and k == K_ESCAPE:
self.run = False
elif t == KEYUP:
pass
def loop(self):
clock = pygame.time.Clock()
while self.run:
clock.tick(1000)
self.handle_events()
self.manage()
self.act_actors()
self.update_actors()
self.draw_actors()
pygame.display.flip()
if __name__ == '__main__':
game = Game( (640, 480) )
game.loop()
Como você pode observar, com poucas linhas de código criamos um fundo de tela animado bem legal. No próximo post vou adicionar algumas naves. Até!