Les paso el código a ver si ven el error (tiene que estar en la funcion main(), lo digo para ahorraros trabajo).
- Código: Seleccionar todo
#!/usr/bin/python
# -*- coding: iso-8859-1 -*-
# ----------------------------------------------------------------------
# Nombre: Aterriza la nave
# Autor: Rafael Álvarez García (rafahack95@gmail.com)
# Descripción: Juego en el que hay que aterrizar una nave en una
# plataforma esquivando los meteoritos y con un combustible determinado.
# ----------------------------------------------------------------------
import pygame
from pygame.locals import *
import os
import random
SCREEN_WIDTH = 640
SCREEN_HEIGHT = 480
DATOS_IMA = 'ima'
def load_image(name, colorkey = False):
""" Carga una imagen, devuelve una superficie y su rectángulo"""
fullname = os.path.join(DATOS_IMA, name)
try: image = pygame.image.load(fullname)
except pygame.error, message:
print 'No se ha podido cargar la imagen', fullname
raise SystemExit, message
image = image.convert()
if colorkey:
colorkey = image.get_at((0,0))
image.set_colorkey(colorkey, RLEACCEL)
return image, image.get_rect()
class Nave(pygame.sprite.Sprite):
""" Este objeto representa la nave que controla el jugador"""
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image, self.rect = load_image('nave.gif')
self.rect.centerx = SCREEN_WIDTH / 2
self.rect.centery = SCREEN_HEIGHT - 400
self.speed = [0,0]
def gravedad(self, gravedad):
self.speed[1] = self.speed[1] + gravedad
def mueve_nave(self):
tecla = pygame.key.get_pressed()
if tecla[K_UP]:
self.speed[1] = self.speed[1] - 0.3
if tecla[K_LEFT]:
self.speed[0] = self.speed[0] - 0.3
if tecla[K_RIGHT]:
self.speed[0] = self.speed[0] + 0.3
def update(self):
# En este método, se llaman a todos los demás, para que en el
# cuerpo del programa solo sea necesario llamar a update
self.mueve_nave()
self.gravedad(0.1)
if self.rect.top <1>= SCREEN_HEIGHT:
self.rect.bottom = SCREEN_HEIGHT
self.speed[1] = 0
if self.rect.left <1>= SCREEN_WIDTH + self.rect.width + 1:
self.rect.left = -self.rect.width
self.rect.move_ip((self.speed[0], self.speed[1]))
class Meteorito(pygame.sprite.Sprite):
""" Este objeto, representa los meteoritos que el objeto Nave tendrá
que esquivar"""
def __init__(self, rock):
pygame.sprite.Sprite.__init__(self)
self.image_base, self.rect_base = load_image(rock)
self.rect_base.centerx = random.randrange(0, SCREEN_WIDTH)
self.rect_base.centery = random.randrange(0, SCREEN_HEIGHT)
self.speed = [random.randrange(-3, 3), random.randrange(-3, 3)]
self.image, self.rect = self.image_base, self.rect_base
self.angle = 0
self.angle_constante = random.randrange(-4, 4)
def rotar_meteorito(self):
self.angle = self.angle - self.angle_constante
self.image = pygame.transform.rotate(self.image_base, self.angle)
self.rect = self.image.get_rect()
self.rect.centerx = self.rect_base.centerx
self.rect.centery = self.rect_base.centery
def update(self):
# En este método, se llaman a todos los demás, para que en el
# cuerpo del programa solo sea necesario llamar a update
self.rotar_meteorito()
if self.rect_base.top <1>= SCREEN_HEIGHT + self.rect_base.height + 1:
self.rect_base.top = -self.rect_base.height
if self.rect_base.left <1>= SCREEN_WIDTH + self.rect_base.width + 1:
self.rect_base.left = -self.rect_base.width
self.rect_base.move_ip((self.speed[0], self.speed[1]))
class Boom(pygame.sprite.Sprite):
"""Representa una explosion de alguna nave."""
def __init__(self, x, y):
pygame.sprite.Sprite.__init__(self)
self.load_images()
self.step = 0
self.delay = 2
(self.image, self.rect) = load_image('boom/1.png', True)
self.rect.center = (x, y)
def load_images(self):
"""Carga la lista 'self.frames' con todos los cuadros de animacion"""
self.frames = []
for n in range(1, 8):
path = 'boom/%d.png'
new_image = load_image(path % n, True)[0]
self.frames.append(new_image)
def update(self):
self.image = self.frames[self.step]
if self.delay <0> 6:
self.kill()
else:
self.delay -= 1
# ----------------------------------------------------------------------
def main():
pygame.init()
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption('Aterriza la nave')
icon = load_image('icon.gif') [0]
pygame.display.set_icon(icon)
background, background_rect = load_image('background.jpg')
screen.blit(background, (0,0))
nave = Nave()
meteorito1 = Meteorito('big_rock1.gif')
meteorito2 = Meteorito('medium_rock1.gif')
todos_sprites = pygame.sprite.RenderClear((nave, meteorito1, meteorito2))
meteoritos = pygame.sprite.Group(meteorito1, meteorito2)
clock = pygame.time.Clock()
while True:
clock.tick(60)
for event in pygame.event.get():
if event.type == pygame.QUIT:
raise SystemExit
elif event.type == pygame.KEYDOWN:
if event.key == K_ESCAPE:
raise SystemExit
# Gestionamos la explosión de la nave
if pygame.sprite.spritecollide(nave, meteoritos, 1):
(x, y) = nave.rect.center
todos_sprites.add(Boom(x, y))
nave.kill()
todos_sprites.update()
todos_sprites.clear(screen, background)
todos_sprites.draw(screen)
pygame.display.flip()
if __name__ == '__main__': main()
Saludos y gracias!!!
