
Estoy haciendo un minijuego con una navecita. No se muy bien como enfocaré el juego, pero lo que si es seguro es que constará de dos elementos, navecita y misiles. Así que, mientras que me pienso que habrá que hacer para ganar y eso he programado ya las dos clases correspondientes. El caso es que al hacer el misil me encuentro un problema. Tengo activada la repetición de teclas para que sea más sencillo mover la nave, pero al pulsar la tecla espacio (asignada para lanzar misil) me lanza una ráfaga de ellos que no veas. Adjuntos dos capturas y el código.
Así está ahora:

Y así quiero que esté:

- Código: Seleccionar todo
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# ------------------------------
# Autor: Rafael Álvarez García
# e-mail: algarafa@gmail.com
# ------------------------------
# ------------------------------
# Importación de módulos
# ------------------------------
import pygame
from pygame.locals import *
import sys
import os
# ------------------------------
# Constantes
# ------------------------------
SCREEN_WIDTH = 400
SCREEN_HEIGHT = 600
IMG_DIR = 'images'
# ------------------------------
# Funciones y clases
# ------------------------------
# Creamos la función para cargar imágenes.
def load_image(name, dir, alpha = False):
# Unimos la ruta de la imágen.
ruta = os.path.join(dir, name)
# Probamos a cargarla y si no devolvemos error.
try:
image = pygame.image.load(ruta)
print 'Cargando imagen', ruta, '...¡éxito!'
except:
print 'No se pudo cargar la imagen', ruta
sys.exit(1)
# Comprobamos si hay alpha.
if alpha:
image = image.convert_alpha()
else:
image = image.convert()
return image
# Clase para la nave.
class Nave(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = load_image('nave.png', IMG_DIR, alpha = True)
self.rect = self.image.get_rect()
self.rect.centerx = SCREEN_WIDTH / 2
self.rect.centery = SCREEN_HEIGHT - 60
self.speed = [0, 0]
def update(self):
# Hacemos que no salga de la pantalla.
if self.rect.top < 0:
self.rect.top = 0
self.speed[1] = 0
elif self.rect.bottom > SCREEN_HEIGHT + 1:
self.rect.bottom = SCREEN_HEIGHT
self.speed[1] = 0
elif self.rect.left < -1:
self.rect.left = 0
self.speed[0] = 0
elif self.rect.right > SCREEN_WIDTH + 1:
self.rect.right = SCREEN_WIDTH
self.speed[0] = 0
self.rect.move_ip(self.speed)
# Clase para el misil.
class Misil(pygame.sprite.Sprite):
def __init__(self, initial_pos):
pygame.sprite.Sprite.__init__(self)
self.image = load_image('misil.png', IMG_DIR, alpha = True)
self.rect = self.image.get_rect()
self.rect.midbottom = initial_pos
self.speed = [0, -4]
# Si se sale de pantalla lo matamos, si no lo movemos.
def update(self):
if self.rect.bottom < 0:
self.kill
else:
self.rect.move_ip(self.speed)
# ------------------------------
# Función principal
# ------------------------------
def main():
pygame.init()
print 'Iniciando juego...'
# Creamos la ventana e indicamos nombre e icono.
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption('Provisional')
icon = pygame.image.load('images/nave.png').convert_alpha()
pygame.display.set_icon(icon)
print 'Creando ventana... ¡éxito!'
# Cargamos e imprimimos el fondo.
fondo = load_image('background.jpg', IMG_DIR)
screen.blit(fondo, (0, 0))
# Cremoas el frupo de sprites.
sprites = pygame.sprite.Group()
# Creamos la nave y la añadimos al grupo sprites.
nave = Nave()
sprites.add(nave)
# Creamos el reloj.
clock = pygame.time.Clock()
# Activamos la repetición de teclas.
pygame.key.set_repeat(1, 25)
# Hacemos el ratón invisible.
pygame.mouse.set_visible(False)
# Bucle principal.
while True:
clock.tick(60)
# Comprobamos los eventos.
for event in pygame.event.get():
if event.type == pygame.QUIT:
print 'Cerrando juego...'
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == K_UP:
nave.speed[1] -= 0.3
elif event.key == K_DOWN:
nave.speed[1] += 0.3
elif event.key == K_LEFT:
nave.speed[0] -= 0.3
elif event.key == K_RIGHT:
nave.speed[0] += 0.3
elif event.key == K_SPACE:
misil = Misil(nave.rect.midtop)
sprites.add(misil)
elif event.key == K_ESCAPE:
print 'Cerrando juego...'
sys.exit()
# Actualizamos los sprites.
sprites.update()
# Actualizamos la pantalla.
sprites.clear(screen, fondo)
sprites.draw(screen)
pygame.display.flip()
if __name__ == "__main__":
main()
¡Muchas gracias!
