Jump to content

Recommended Posts

Posted (edited)

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? 😛

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
Posted

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

Posted (edited)

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
Posted

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!

Posted

"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! 🙂

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • 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.