Jump to content
Tafs

Jogo em PyGame

Recommended Posts

Tafs

Boas,

estou de férias da faculdade, e decidi retomar meu estudo da linguagem Python tentando produzir um pequeno game usando a biblioteca PyGame.

Neste game, o jogador controla um personagem que voa, e que tem que desviar de nuvens. O meu problema é no momento de criar as mesmas. Elas deveriam aparecer no canto direito da tela, e se mover para a esquerda, onde o jogador desviaria delas usando as setas direcionais para cima e para baixo.

Que fique registrado aqui que sou muito "noob" ainda em programação. O máximo que aprendi até hoje (na facul) foi o básico de C, e sem trabalhar com apontadores. Não tenho muita experiência com POO também. :S

Como as imagens do jogo são animadas, fiz uso também da biblioteca GIFImage, para o PyGame.

# coding: utf-8
import pygame, sys
from pygame.locals import *
from GIFImage import *
from random import randint
pygame.init()
fpsClock = pygame.time.Clock()
screen = pygame.display.set_mode((400,300), 0, 32)
pygame.display.set_caption("Clouddodge")
instanciaNuvens = 26
pygame.time.set_timer(instanciaNuvens, 1000)
WHITE = (255,255,255)
NOITE = (25,25,112)
DIA = (135,206,250)
ponyx = 10
ponyy = 150
dir = "idle"
## para uso na instanciação de nuvens
canto= 400
nuvens = []
pony = GIFImage("F:/Programming/pony/fly_rainbow_right.gif")
thunder_cloud = GIFImage("F:/Programming/pony/thunder_cloud.gif")
normal_cloud = GIFImage("F:/Programming/pony/normal_cloud.gif")
distance = 4
class Nuvem:
def __init__(self, x, y):
 self.x = x
 self.y = y
 self.tipo = randint(0,1)
 if (self.tipo == 0):
  self.img = GIFImage(thunder_cloud)
 else:
  self.img = GIFImage(normal_cloud)
def instanciaNuvem():
x = 400
y = randint(0,330)
nuvem = Nuvem(x,y)
nuvens.append(nuvem)
while 1:
screen.fill(NOITE)

for event in pygame.event.get():
 ## controles
 keyp = pygame.key.get_pressed()
 if (event.type == KEYDOWN):
  if keyp[K_UP]:
dir = "up"
  if keyp[K_DOWN]:
dir = "down"
 if (event.type == KEYUP):
  if (event.key == K_UP):
dir = "idle"
  if (event.key == K_DOWN):
dir = "idle"

 ## eventos
 if (event.type == instanciaNuvens):
  instanciaNuvem()

 ## sair
 if event.type == QUIT:
  pygame.quit()
  sys.exit()

## move nuvens
for n in nuvens:
 n[i].x += distance
 n[i].img.render(screen,(n[i].x,n[i].y))

if dir == "idle":
 pony.render(screen,(ponyx,ponyy))
if dir == "up":
 pony.render(screen,(ponyx,ponyy))
 ponyy -= distance
if dir == "down":
 pony.render(screen,(ponyx,ponyy))
 ponyy += distance

pygame.display.flip()
fpsClock.tick(30)

Rodando esse script acima, a consola do Notepad++ me retorna esse erro:

Process started >>>
Traceback (most recent call last):
File "F:\Programming\pony\clouddodge.py", line 70, in <module>
instanciaNuvem()
File "F:\Programming\pony\clouddodge.py", line 48, in instanciaNuvem
nuvem = Nuvem(x,y)
File "F:\Programming\pony\clouddodge.py", line 43, in __init__
self.img = GIFImage(normal_cloud)
File "F:\Programming\pony\GIFImage.py", line 11, in __init__
self.image = Image.open(filename)
File "C:\Python27\lib\site-packages\PIL\Image.py", line 1956, in open
prefix = fp.read(16)
AttributeError: 'GIFImage' object has no attribute 'read'
<<< Process finished.
================ READY ================

Alguém pode dar uma ajuda? :P

Edit: o código que apresentei pode aparecer aqui com algumas indentações faltando, mas no meu editor elas estão corretas!

Edited by Tafs

Share this post


Link to post
Share on other sites
Pedro C.

Não conhecendo essa biblioteca e olhando para a mensagem de erro o problema estará aqui:

self.img = GIFImage(normal_cloud)

Agora quando fazes isto no inicio do teu código já tens um objecto GIFImage:

normal_cloud = GIFImage("F:/Programming/pony/normal_cloud.gif")

Portanto na classe estás a usar a GIFImage para abrir outra GIFImage. Penso que se trocares por isto o problema (esse pelo menos) deverá desaparecer:

self.img = normal_cloud

O mesmo para a instrução anterior que compõe o mesmo erro:

self.img = thunder_cloud

Share this post


Link to post
Share on other sites
Tafs

Não conhecendo essa biblioteca e olhando para a mensagem de erro o problema estará aqui:

self.img = GIFImage(normal_cloud)

Agora quando fazes isto no inicio do teu código já tens um objecto GIFImage:

normal_cloud = GIFImage("F:/Programming/pony/normal_cloud.gif")

Portanto na classe estás a usar a GIFImage para abrir outra GIFImage. Penso que se trocares por isto o problema (esse pelo menos) deverá desaparecer:

self.img = normal_cloud

O mesmo para a instrução anterior que compõe o mesmo erro:

self.img = thunder_cloud

Poxa, que bobeira que dei! Devia ter visto isso! :S

Obrigado pela resposta Pedro C.!

O desafio agora vai ser fazer aquele "for" funcionar, para renderizar as imagens das nuvens na tela e movê-las.

Nessa linha, me retorna um erro:

for n in nuvens:
 nuvens[n].x -= distance
 nuvens[n].img.render(screen,(nuvens[n].x,nuvens[n].y))

Process started >>>

Traceback (most recent call last):

File "F:\Programming\pony\clouddodge.py", line 79, in <module>

nuvens[n].x -= distance

TypeError: object cannot be interpreted as an index

<<< Process finished.

================ READY ================

Edited by Tafs

Share this post


Link to post
Share on other sites
thoga31

Nessa linha, me retorna um erro:

for n in nuvens:
 nuvens[n].x -= distance
 nuvens[n].img.render(screen,(nuvens[n].x,nuvens[n].y))

"n" não pode ser utilizado como índice. Quando fazes for n in nuvens estás a pegar já em cada um dos valores de nuvens.

Há uma diferença entre for n in nuvens e for n in range(len(nuvens)).


Knowledge is free!

Share this post


Link to post
Share on other sites
Tafs

"n" não pode ser utilizado como índice. Quando fazes for n in nuvens estás a pegar já em cada um dos valores de nuvens.

Há uma diferença entre for n in nuvens e for n in range(len(nuvens)).

Humm, entendo. Fiz isso e o "jogo" rodou aqui. A parte de testar colisão creio que não terei problemas, ou assim espero, hehe.

Muitíssimo obrigado pela ajuda! :)

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.