Olá, Visitante. Por favor Entre ou Registe-se se ainda não for membro.
Perdeu o seu e-mail de activação?
20 de Novembro de 2008, 21:58
231017 Mensagens em 23422 Tópicos por 7935 Membros
Membro Mais Recente: Ricardo25
Portugal-a-Programar  |  Programação Geral  |  Tutoriais  |  [Python] [Pyteam] Tutorial de Pygame « anterior seguinte »
Páginas: [1] 2
Autor Tópico: [Python] [Pyteam] Tutorial de Pygame  (Lida 2689 vezes)
rolando2424
PyTeam
CRLF
*
Offline Offline

Mensagens: 629


RAMON - PORN ACTOR OF THE 60´s AND PYTHON PROGRAMM


WWW
« em: 12 de Agosto de 2007, 03:48 »

Neste tutorial, vamos ver como colocar um circulo no ecrã, e movê-lo usando as setas do teclado.

No final deverão ter algo assim parecido (Não se preocupem se não entenderem alguma coisa, pois o
código vai ser analisado linha a linha):

Código
GeSHi (python):
#!/usr/bin/env python
 
import pygame
from pygame.locals import *
 
if not pygame.font:
   print 'Atenção, não existem fontes.'
 
if not pygame.mixer:
   print 'Atenção, não existe som.'
 
pygame.init()
 
 
vermelho = (255, 0, 0)
preto = (0, 0, 0)
 
 
comprimento_ecra = 640
altura_ecra = 480
 
ecra = pygame.display.set_mode((comprimento_ecra, altura_ecra))
 
 
raio_circulo = 10
 
xpos = 50
ypos = 50
 
circulo = pygame.draw.circle(ecra, vermelho, (xpos, ypos), raio_circulo)
 
movimento_em_x = 5
movimento_em_y = 5
 
pygame.display.flip()
 
pygame.key.set_repeat(100, 100)
 
while True:
   for event in pygame.event.get():
       pass
 
   tecla_pressionada = pygame.key.get_pressed()
 
   if tecla_pressionada[K_LEFT]:
       xpos -= movimento_em_x
 
   if tecla_pressionada[K_RIGHT]:
       xpos += movimento_em_x
 
 
   if tecla_pressionada[K_UP]:
       ypos -= movimento_em_y
 
   if tecla_pressionada[K_DOWN]:
       ypos += movimento_em_y
 
   ecra.fill(preto)
   circulo = pygame.draw.circle(ecra, vermelho, (xpos, ypos), raio_circulo)
   pygame.display.flip()
 
 
Created by GeSHI 1.0.7.20


Código
GeSHi (python):
#!/usr/bin/env python
 
Created by GeSHI 1.0.7.20

Esta linha é só para o pessoal que usa Linux, e serve para mostrar onde se encontra o executável do
Python. Existem duas versões para esta linha. o "#!/usr/bin/env python" e o "#!/usr/bin/python". Esta
linha tem de ser a primeira do ficheiro (neste caso, whitespace conta). Existem algumas diferenças entre
as duas, mas são irrelevantes numa base diária, e não são apropriadas para este tutorial.

Bem, após este aparte (e foi um aparte grande), vamos ao que interessa:

Código
GeSHi (python):
import pygame
from pygame.locals import *
 
Created by GeSHI 1.0.7.20

O Pygame é um módulo para o Python (parto do principio que já o têm instalado, caso contrário devem de o
encontrar nos repositórios da vossa distro de Linux, ou então dirigem-se para o site oficial em
http://www.pygame.org/download.shtml onde podem encontrar ports para o Windows e Mac, ou então as
sources, caso queiram compilar vocês mesmos).

Sendo o Pygame um módulo, é necessário importa-lo, usando o comando "import pygame".

O pygame.locals contêm coisas como as teclas do teclado, e para ser mais rápido aceder-mos a elas,
importamos o módulo directamente.

Código
GeSHi (python):
if not pygame.font:  
   print 'Atenção, não existem fontes.'
 
if not pygame.mixer:
   print 'Atenção, não existe som.'
 
Created by GeSHI 1.0.7.20

Estes dois blocos são opcionais, mas dá sempre jeito usar. Caso o programa não consiga carregar as
fontes do pygame, ou não consiga aceder ao som, ele imprime uma mensagem de erro na consola.


Código
GeSHi (python):
pygame.init()
 
Created by GeSHI 1.0.7.20

Este comando inicia todos os módulos que são importados quando se usa o "import pygame". Se quiserem, é
possível iniciar os módulos um a um, mas normalmente, tal não é necessário. Se tiverem a usar um
interpreter como o IDLE, deverão de receber uma tuple, que vos indica os módulos que foram iniciados com
sucesso, e os que não foram iniciados. (Em condições normais, este comando deve de fazer um return de
(6, 0), ou seja, 6 módulos iniciados correctamente, e 0 não iniciados).


Código
GeSHi (python):
vermelho = (255, 0, 0)
preto = (0, 0, 0)
 
Created by GeSHI 1.0.7.20

Acho que quando se está num tutorial, não deve de aparecer conjuntos de números assim do nada, por isso
crio variáveis para as cores que vão ser usadas. O vermelho, vai ser a cor da bola, e o preto vai ser a
cor que vamos usar para limpar o ecrã no fim de cada frame (ja explico isso). As cores são dadas no
formato RGB, ou seja, Vermelho, Verde e Azul, sendo que também têm que ser dadas numa tuple. Logo,
(255, 0, 0), é o vermelho mais forte, e o (0, 0, 0) é o preto (ausência de cor vermelha, verde e azul).


Código
GeSHi (python):
comprimento_ecra = 640
altura_ecra = 480
 
Created by GeSHI 1.0.7.20

Tal como em cima, não gosto de por números mágicos, que parecem aparecer (digam isto muito depressa Cheesy)
do nada, por isso, estão aqui definidas o tamanho do ecrã do pygame. Neste caso, a janela resultante
terá uma resolução de 640x480. Caso queiram mudar o tamanho da janela, é só mudar os valores. Simples Cheesy


Código
GeSHi (python):
ecra = pygame.display.set_mode((comprimento_ecra, altura_ecra))
 
Created by GeSHI 1.0.7.20

Esta linha cria uma janela, de tamanho 640x480 (por causa das variaveis que criamos acima). Reparem que
têm que dar uma tuple de dois membros para criar a janela ( ou seja, ecra =
pygame.display.set_mode(comprimento_ecra, altura_ecra) não dava (reparem nos dois parênteses acima)).


Código
GeSHi (python):
raio_circulo = 10
 
xpos = 50
ypos = 50
 
Created by GeSHI 1.0.7.20

A variável raio_circulo vai definir o raio do círculo em pixeis (podiam não ter reparado nisso Cheesy ).

As variáveis xpos e ypos vão definir a posição onde o círculo vai aparecer na primeira
frame.


Código
GeSHi (python):
circulo = pygame.draw.circle(ecra, vermelho, (xpos, ypos), raio_circulo)
 
Created by GeSHI 1.0.7.20

Agora vamos criar o circulo, usando o módulo draw do pygame. Assim podemos criar as
imagens, sem termos
que usar sprites criadas noutros programas (é claro que o draw só faz figuras básicas como as figuras
geométricas). O draw pode criar também, por exemplo, rectângulos. Para verem tudo o que ele pode criar,
vão à documentação oficial sobre o módulo, que pode ser encontrada aqui.

Em relação ao pygame.draw.circle, ele requer os seguintes argumentos: o nome da variável da janela onde
ele irá desenhar o círculo, a cor que o círculo deverá ter, uma tuple com a posição do centro do
círculo (x, y), e o raio que o círculo deverá ter.

Ou seja, este círculo será criado na nossa janela, com a cor vermelha, na posição (50, 50) (por causa
das variáveis que definimos atrás), com um raio de 10.


Código
GeSHi (python):
movimento_em_x = 5
movimento_em_y = 5  
 
Created by GeSHI 1.0.7.20

Isto vai servir para definir o número de pixels que o círculo se vai mover, no eixo dos "x" e no eixo
dos "y" (Isto vai ser visto mais à frente).


Código
GeSHi (python):
pygame.display.flip()
 
Created by GeSHI 1.0.7.20

Este comando faz com que o Pygame actualize todo a janela, ou seja, caso haja algum tipo de movimento,
este comando "cola" tudo no ecrã para nos vermos. (Ou seja, mesmo que movimentem o círculo, nunca verão
o resultado, se não usarem o flip() (por acaso também existe outra maneira, mas é mais complicado Smiley )).


Código
GeSHi (python):
pygame.key.set_repeat(1000, 100)
 
Created by GeSHI 1.0.7.20

Em condições normais, o Pygame não "aceita" um tecla pressionada, como uma repetição. Ou seja, se
pressionarem a seta para a esquerda, e deixarem lá estar o dedo, ele só irá mover o círculo para a
esquerda uma vez. Para fazer com que ele voltasse a mover o círculo para a esquerda, tínhamos que
levantar o dedo da tecla, e depois voltar a pressionar. Para combater isso, usámos o "set_repeat".

O primeiro valor, é o tempo que temos de deixar o dedo na tecla, até o Pygame aceitar a primeira
repetição, e o segundo valor, é o tempo de intervalo que existe entre cada repetição. Todos os valores
são dados em milissegundos (ou seja, 1000 neste caso é um segundo). Neste exemplo, quando carregarem
para a esquerda, e deixarem lá estar o dedo, o círculo irá mover-se para a esquerda 5 pixels, depois irá
parar durante um segundo, e depois começará a mover-se a 5 pixels por 100 milésimos de segundo (ou 50
pixels por segundo). Isto é um pouco complicado de explicar por escrito, o melhor é mesmo modificarem os
valores, e verem como afecta o programa.


Código
GeSHi (python):
while True:
 
Created by GeSHI 1.0.7.20

Tudo o que é jogo, tem de ter um main loop, para poder processar o input durante as frames.



Código
GeSHi (python):
   for evento in pygame.event.get():
       pass
 
Created by GeSHI 1.0.7.20

O modulo "event" do pygame é o que trata de todos os eventos que ocorrem. A função get() faz return de
uma lista, com tudo o que se passa num determinado momento (para experimentarem, tentem trocar o "pass"
por "print evento"). Como uma lista dessas ocupa muito espaço na memória se deixada a correr durante
muito tempo, o melhor é ir limpando-a com o "pass" (para ela não ficar na memória).


Código
GeSHi (python):
   tecla_pressionada = pygame.key.get_pressed()
 
Created by GeSHI 1.0.7.20

Esta variável, vai armazenar as teclas que são carregadas, para depois comparar com os "if"s que temos À
frente, e caso encontre a tecla que pressionamos num "if", ele executa o bloco.


Código
GeSHi (python):
   if tecla_pressionada[K_LEFT]:
       xpos -= movimento_em_x
 
Created by GeSHI 1.0.7.20

Caso a tecla que carregamos seja a seta esquerda (lembrem-se que ela deriva do pygame.locals, que
importamos separadamente), modificamos a posição do círculo (lembrem-se que a posição do círculo é dada
pelo conjunto (xpox, ypos).

Como a "grelha" é do tipo:

     y^
       |
       |
       |
  --------->
       |0   x
       |
       |

Para fazer-mos o círculo andar para a esquerda, temos que subtrair ao valor de x, para o fazer andar
para a direita, somar ao valor de x, para fazer andar para cima, adicionar ao valor de y, e para fazer
andar para baixo, subtrair ao valor de y.

E é isso que os próximo blocos fazem o mesmo que este, excepto que mudam os eixos e as teclas a
carregar.


Código
GeSHi (python):
   if tecla_pressionada[K_RIGHT]:
       xpos += movimento_em_x
 
 
   if tecla_pressionada[K_UP]:
       ypos -= movimento_em_y
 
   if tecla_pressionada[K_DOWN]:
       ypos += movimento_em_y
 
Created by GeSHI 1.0.7.20

Agora que o programa já sabe a posição que o círculo vai tomar, está na hora de o colocar no ecrã.


Código
GeSHi (python):
   screen.fill(black)
 
Created by GeSHI 1.0.7.20

No entanto, antes de colocar o círculo no ecrã, temos que voltar a preencher o background da janela,
para apagar o círculo anterior (senão vão ficar com "rastos" do caminho por onde o círculo percorre. Se
quiserem, apaguem esta linha e corram o programa outra vez, para verem o efeito).

Nós não tivemos que fazer isto ao início, porque a cor da janela já é o preto por default.


Código
GeSHi (python):
   circulo = pygame.draw.circle(ecra, vermelho, (xpos, ypos), raio_circulo)
 
Created by GeSHI 1.0.7.20

Agora que a janela já foi limpa do círculo que estava antes, está na hora de desenhar o círculo na sua
nova posição (a única coisa que mudou foi o par (xpos, ypos) ).


Código
GeSHi (python):
   pygame.display.flip()
 
Created by GeSHI 1.0.7.20

No entanto, para fazer o círculo aparecer na janela, temos que a actualizar e como vimos antes, isso é
feito usando o pygame.display.flip()




E já está, agora devem de ter um programa que vos permite mexer uma bola numa janela preta (Ok, não é o
Unreal 2007 ou o Starcraft 2, mas todos temos de começar em algum lado certo?).

Agora podem modificar o código, para obterem vários efeitos (mudem a cor de fundo, o tamanho da janela,
a cor, o tamanho do círculo, etc.)
« Última modificação: 26 de Agosto de 2007, 00:52 por rolando2424 » Registado

Não me responsabilizo por qualquer dano ocorrido no seguimento dos meus conselhos.
Prontos, a minha pessoa está oficialmente protegida legalmente Cheesy

Heckel is not a meme. (<---- Bem, este não durou muito, venha o próximo.)

You have been completely annihilated. Congratulations.
MX+
Try-Catch User
***
Offline Offline

Mensagens: 344


WWW
« Responder #1 em: 21 de Agosto de 2007, 17:52 »

Eu que não conheço (ainda) Python, achei um tutorial altamente. Mesmo o código parece-me simples.

Parabéns! Cumprimentos
Registado

rolando2424
PyTeam
CRLF
*
Offline Offline

Mensagens: 629


RAMON - PORN ACTOR OF THE 60´s AND PYTHON PROGRAMM


WWW
« Responder #2 em: 21 de Agosto de 2007, 21:37 »

Fico feliz por teres gostado, Python é uma linguagem relativamente simples em termo de sintaxe, e lê-se o código facilmente Cheesy
Registado

Não me responsabilizo por qualquer dano ocorrido no seguimento dos meus conselhos.
Prontos, a minha pessoa está oficialmente protegida legalmente Cheesy

Heckel is not a meme. (<---- Bem, este não durou muito, venha o próximo.)

You have been completely annihilated. Congratulations.
MX+
Try-Catch User
***
Offline Offline

Mensagens: 344


WWW
« Responder #3 em: 22 de Agosto de 2007, 01:48 »

Como faço pra correr um ficheiro Py em Windows?

EDIT: Pergunta estúpida.. lol. Já descobri
Registado

MX+
Try-Catch User
***
Offline Offline

Mensagens: 344


WWW
« Responder #4 em: 22 de Agosto de 2007, 01:59 »

Código
GeSHi (dos):
Traceback (most recent call last):
 File "apps\pygame.txt", line 39, in <module>
   while executar:
NameError: name 'executar' is not defined
Created by GeSHI 1.0.7.20
Registado

djthyrax
SPAM::erase();
Moderador
Stack Overflow
*
Offline Offline

Mensagens: 11353



« Responder #5 em: 22 de Agosto de 2007, 02:03 »

Antes do while executar:, mete executar = True ou troca o executar por True. Smiley
Registado


Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!
rolando2424
PyTeam
CRLF
*
Offline Offline

Mensagens: 629


RAMON - PORN ACTOR OF THE 60´s AND PYTHON PROGRAMM


WWW
« Responder #6 em: 22 de Agosto de 2007, 03:53 »

Código
GeSHi (dos):
Traceback (most recent call last):
 File "apps\pygame.txt", line 39, in <module>
   while executar:
NameError: name 'executar' is not defined
Created by GeSHI 1.0.7.20

É que eu fui fazendo alterações ao código enquanto ia escrevendo o tuturial (se repares, mais abaixo, na explicação tem "while True:" em vez de "while executar:").

Faz aquilo que o djthyrax disse ou troca o "while executar" por "while True:"

Vou corrigir o código.
Registado

Não me responsabilizo por qualquer dano ocorrido no seguimento dos meus conselhos.
Prontos, a minha pessoa está oficialmente protegida legalmente Cheesy

Heckel is not a meme. (<---- Bem, este não durou muito, venha o próximo.)

You have been completely annihilated. Congratulations.
MX+
Try-Catch User
***
Offline Offline

Mensagens: 344


WWW
« Responder #7 em: 25 de Agosto de 2007, 19:10 »

Código
GeSHi (dos):
Traceback (most recent call last):
 File "apps\pygame.txt", line 58, in <module>
   screen.fill(black)
NameError: name 'screen' is not defined
Created by GeSHI 1.0.7.20
Registado

Triton
Moderador
Stack Overflow
*
Online Online

Mensagens: 5460



« Responder #8 em: 25 de Agosto de 2007, 19:15 »

Código
GeSHi (dos):
Traceback (most recent call last):
 File "apps\pygame.txt", line 58, in <module>
   screen.fill(black)
NameError: name 'screen' is not defined
Created by GeSHI 1.0.7.20

Altera a linha screen.fill(black) para ecra.fill(black).
Registado

Linux Certified Wannabee Hater (TM)
rolando2424
PyTeam
CRLF
*
Offline Offline

Mensagens: 629


RAMON - PORN ACTOR OF THE 60´s AND PYTHON PROGRAMM


WWW
« Responder #9 em: 26 de Agosto de 2007, 00:47 »

Código
GeSHi (dos):
Traceback (most recent call last):
 File "apps\pygame.txt", line 58, in <module>
   screen.fill(black)
NameError: name 'screen' is not defined
Created by GeSHI 1.0.7.20

Altera a linha screen.fill(black) para ecra.fill(black).

Pois, mais uma vez, é no que dá fazer alteração a um ficheiro depois de fazer a verificação do código Cheesy

Vou alterar no primeiro post.

EDIT: Prontos, agora tenho a certeza que irá dar (esqueci-me também que tinha mudado de black para preto Cheesy)
« Última modificação: 26 de Agosto de 2007, 00:52 por rolando2424 » Registado

Não me responsabilizo por qualquer dano ocorrido no seguimento dos meus conselhos.
Prontos, a minha pessoa está oficialmente protegida legalmente Cheesy

Heckel is not a meme. (<---- Bem, este não durou muito, venha o próximo.)

You have been completely annihilated. Congratulations.
MX+
Try-Catch User
***
Offline Offline

Mensagens: 344


WWW
« Responder #10 em: 26 de Agosto de 2007, 20:48 »

Já funciona xD

Agora faz o Pong : D

Registado

rolando2424
PyTeam
CRLF
*
Offline Offline

Mensagens: 629


RAMON - PORN ACTOR OF THE 60´s AND PYTHON PROGRAMM


WWW
« Responder #11 em: 26 de Agosto de 2007, 22:00 »

Já funciona xD

Agora faz o Pong : D



Talvez um dia Cheesy
Registado

Não me responsabilizo por qualquer dano ocorrido no seguimento dos meus conselhos.
Prontos, a minha pessoa está oficialmente protegida legalmente Cheesy

Heckel is not a meme. (<---- Bem, este não durou muito, venha o próximo.)

You have been completely annihilated. Congratulations.
Slammer
void
*
Offline Offline

Mensagens: 37


« Responder #12 em: 04 de Setembro de 2007, 14:59 »

pessoal, tava a fazer este tutorial, mt bom...só ke dá-m este erro ao fazer o loop:

>>>while True:
. . .  for event in pygame.event.get( ):
   File "<stdin>", line 2
        for event in pygame.event.get( ):

IndentationError: expected an indented block

Eu tou a utilizar Linux e a versao do python e a 2.5.1

Será k me podiam ajudar?
Registado
rolando2424
PyTeam
CRLF
*
Offline Offline

Mensagens: 629


RAMON - PORN ACTOR OF THE 60´s AND PYTHON PROGRAMM


WWW
« Responder #13 em: 04 de Setembro de 2007, 15:54 »

pessoal, tava a fazer este tutorial, mt bom...só ke dá-m este erro ao fazer o loop:

>>>while True:
. . .  for event in pygame.event.get( ):
   File "<stdin>", line 2
        for event in pygame.event.get( ):

IndentationError: expected an indented block

Eu tou a utilizar Linux e a versao do python e a 2.5.1

Será k me podiam ajudar?

Tens que carregar no butão TAB para fazeres um indent (colocar o texto "mais para dentro")

E aconselho-te a usares o IDLE, que é estilo a shell em texto do python, mas melhor (dá-te algumas ajudas, como fazer-te o indent automaticamente, etc.)

Se estás a usar o Ubuntu, faz um "sudo apt-get install idle2.5" (se a memória não me engana).

Caso não dê, faz um "apt-cache search idle python" e vê qual é o nome certo Cheesy
Registado

Não me responsabilizo por qualquer dano ocorrido no seguimento dos meus conselhos.
Prontos, a minha pessoa está oficialmente protegida legalmente Cheesy

Heckel is not a meme. (<---- Bem, este não durou muito, venha o próximo.)

You have been completely annihilated. Congratulations.
Slammer
void
*
Offline Offline

Mensagens: 37


« Responder #14 em: 04 de Setembro de 2007, 18:04 »

Brigadão por este Tutorial, mt bom msm! Agora vou ver se brinko com isto para dps avançar mais na matéria Cheesy
Registado
Páginas: [1] 2
Portugal-a-Programar  |  Programação Geral  |  Tutoriais  |  [Python] [Pyteam] Tutorial de Pygame « anterior seguinte »
    Ir para: