Criando Jogo com Python - Game class e primeiro sprite
Para quem chegou agora neste tópico, não deixe de rever os tutoriais anteriores
Preparar ambiente para python - pygame
Primeira janela do jogo
Continuando com o tutorial,
Primeiro vamos criar algumas pastas dentro do nosso projecto
Vamos criar uma pasta com o nome de res.
Dentro dessa pasta vamos criar mais 2 pastas audio e graphics.
E agora dentro da pasta graphics vamos criar mais 4 pastas backgrounds , charaters, tilesets, images
Ficando assim
-res
-- audio
-- graphics
-- backgrounds
-- characters
-- tilesets
-- images
vamos adicionar a imagem que está em anexo na pasta images com o nome de condado_logo.png
agora que criamos a estrutura do nosso protejo, vamos passar ao código
vamos criar mais 2 arquivos no root do protejo, game.py e graphics.py
Començando com o game.py
Código:
__author__ = 'Fabio almeida'
__version__ = "0.1"
__description__ = "Class GAME, classe responsavel por tratar de todo o jogo"
import pygame
import graphics
import os
class Game:
# Construtor da class Game
# aqui defenimos todas as variaveis de instancia
# no python basta crialas dentro do __init__ usando a palavra self
def __init__(self, width=800, height=600, title="Condado Breaveheart", fullscreen=True):
pass
def update(self, gametime=None):
pass
def draw(self, surface=None):
pass
def tick(self, fps):
pass
def get_last_gametime(self):
return 0
def load_content(self):
pass
def unload_content(self):
pass
Nota: a palavra pass serve para fechar um bloco sem código
Agora vamos criar o escleto do graphics.py
Código:
__author__ = 'Fabio almeida'
__version__ = "0.1"
__description__ = "Modulo graphics, modulo responsavel por tratar dos graphicos do jogo"
import pygame
class Graphics:
def __init__(self, width, height, title):
pass
def update(self):
pass
def fullscreen(self,fullscreen):
pass
def bitmap(self):
return self.surface
feito isto vamos então começar a adicionar código a nossa classe game. No nosso def __init__(self):
vamos adicionar as seguintes linhas, ficando assim.
Código:
def __init__(self, width=800, height=600, title="Condado Breaveheart", fullscreen=True):
# criamos o nosso objeto Graphics
self.Graphics = graphics.Graphics(width, height, title)
# verificamos se apresentamos em fullscreen ou janela
if fullscreen:
pygame.display.toggle_fullscreen()
# criamos um objeto clock para tratarmos os fps do nosso jogo
self.clock = pygame.time.Clock()
# iniciamos esta flag para verdadeiro, assim para fecharmos o processo do jogo
# basta defenir esta variavel como False
self.running = True
Dentro do update vamos escrever algumas linhas, para este tutorial o update não será usado mas ja fica para o proximo tutorial
Código:
def update(self, gametime=None):
if gametime is None:
gametime = self.get_last_gametime()
Para já , não precisamos mais nada no nosso script game.py.
Vamos então codificar o nosso modulo graphics.py.
Inicialmente este modulo será bem basico mas mais para a frente será um dos modulos mais importantes
Começando com o def __init__(self):
Código:
def __init__(self, width, height, title):
self.surface = pygame.display.set_mode((width, height), pygame.HWSURFACE)
pygame.display.set_caption(title)
pygame.display.flip()
agora no update temos que trocar o buffer de escrita, para o apresentarmos ao ecrâ
Código:
def update(self):
pygame.display.update()
Vamos agora alterar de novo o nosso __main__.py para usarmos as classes que criamos
na parte onde importamos os modulos, vamos adicionar o nosso modulo game.py.
Ficando assim:
Código:
# importamos os modulos necessarios
import pygame
import sys
import game
Agora entre o try: e o while True, vamos apagar e escrever o seguinte
Código:
# como disse anteriormente ao importarmos um modulo(script python)
# esse modulo fica disponível ao nosso script pelo nome dele
# então para acessarmos a class Game devemos chamar game.Game(args, kwargs)
# args sao os parametros pela ordem inderida
# kwargs sao os parametros com nome
# no caso do game eu defeni os argumentos para semrem kwargs mas podemos
# invocar os args vou deixar aqui os 2 exemplos
# remover o # para usarem este construtor
# meu_game = game.Game(800,600,"Meu primeiro jogo", False)
# como podem ver abaixo ao usarmos kwargs nao importa a ordem
meu_game = game.Game(title="Meu primeiro jogo", fullscreen=False, width=800, height=600)
# carregamos os recursos necessarios ao jogo
meu_game.load_content()
# Iniciamos o loop do jogo
# Aqui vamos desenhar tudo e actualizar o nosso jogo
Agora alteramos o while True, para :
Código:
while meu_game.running:
e depois do
Código:
elif event.type == pygame.KEYDOWN:
# se essa tecla for o ESC
if event.key == pygame.K_ESCAPE:
# Saimos do processo
sys.exit()
Vamos adicionar estas linhas
Código:
# agora damos um update e um draw no nosso jogo
meu_game.update()
meu_game.draw()
ficando assim:
Código:
while meu_game.running:
# Obtemos os eventos SDL
event = pygame.event.wait()
# Se clicarmos no X para fechar a janela
if event.type == pygame.QUIT:
meu_game.running = False # Finalizaamos o loop
# Se carrgar-mos numa tecla
elif event.type == pygame.KEYDOWN:
# se essa tecla for o ESC
if event.key == pygame.K_ESCAPE:
# Saimos do processo
sys.exit()
# agora damos um update e um draw no nosso jogo
meu_game.update()
meu_game.draw()
e agora subestituimos o finaly..... por:
Código:
# aqui vamos tratar das excepcoes do nosso codigo
except Exception as ex:
print(ex.message)
finally:
# caso aconteca algum erro,
# limpamos os recursos
# e saimos do processo
meu_game.unload_content()
pygame.quit()
Passemos então a parte de desenhar algo no ecra. vamos voltar ao nosso game.py e logo por baixo da class Game vamos adicionar esta linha:
Código:
class Game:
# vamos criar uma variavel logo
# apenas para o tutorial
# ao defenirmos uma variavel dentro de uma class
# esta passa a ser uma variavel de class
# no ruby seria algo como
# @@logo
logo = None
e no metodo load_content()
Código:
def load_content(self):
# vamos carregar o nosso logo tipo
# como estamos a chamar uma variavel de class
# temos que chamar a class e nao o self
# pygame.image.load(caminho) -> carrega imagens do disco
Game.logo = pygame.image.load(os.path.dirname(os.path.realpath(__file__)) +
"/res/graphics/images/condado_logo.png")
e finalmente no nosso draw():
Código:
def draw(self, surface=None):
if surface is None:
surface = self.Graphics.bitmap()
# limpamos o ecra
surface.fill([30,30,30])
# agora desenhamos o nosso logo no centro do ecra
surface.blit(Game.logo, [280, 190])
self.Graphics.update()
Ao correrem novamente o __main__.py devem ter algo como isto aqui
Download do Tutorial
[descarga]https://dl.dropboxusercontent.com/u/42148742/Tuts/PythonPygame/Tutorial_2.zip[/descarga]