Ir para o conteúdo
Tafs

Jogo em PyGame

Mensagens Recomendadas

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!

Editado por Tafs

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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 ================

Editado por Tafs

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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! :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.