Tafs Posted January 8, 2013 at 01:56 PM Report #490129 Posted January 8, 2013 at 01:56 PM (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 January 8, 2013 at 01:59 PM by Tafs
Pedro C. Posted January 8, 2013 at 10:06 PM Report #490221 Posted January 8, 2013 at 10:06 PM 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
Tafs Posted January 8, 2013 at 10:24 PM Author Report #490223 Posted January 8, 2013 at 10:24 PM (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 January 8, 2013 at 10:50 PM by Tafs
thoga31 Posted January 8, 2013 at 11:25 PM Report #490246 Posted January 8, 2013 at 11:25 PM 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!
Tafs Posted January 9, 2013 at 12:10 AM Author Report #490271 Posted January 9, 2013 at 12:10 AM "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! 🙂
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now