Problema al crear varios sprites a partir de una clase

Solicite, consulte o publique recursos de referencia para desarrolladores.

Problema al crear varios sprites a partir de una clase

Notapor djkemical » Jue Sep 17, 2009 10:16 am

Muy buenas a todos, como vereis soy nuevo en el foro jejeje y desde hace una semana o algo menos me he puesto a aprender python con el libro de Python para todos que dicho sea de paso esta todo muy bien explicado.
Bueno, pues el otro dia me descargue un ejemplo de un juego que habia aqui colgado llamado Invaders, que es tipo "1945", pues tras estudiar el codigo y verlo decidid intentar hacer una copia fijandome en el ejemplo para estudiarlo y ver mas o menos como funciona pygame, pero es que por mas que me fijo y me fijo no soy capaz de hacer que a`partir de una clase crear varias naves enemigas, os dejo el codigo, perdonar si esta un poco desorganizado
Código: Seleccionar todo
#Importacion de librerias
import pygame
import random
from pygame.locals import *
from pygame.sprite import Sprite

#Variables de tamagno
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600

#Funcion para subir fotos
def load_image(fullname, colorkey=False):
    try:
        image = pygame.image.load(fullname)
    except pygame.error, message:
        print 'No se puede 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())

#Clase de la nave
class nave(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        (self.image, self.rect) = load_image('datos/nave.png', True)
        self.rect = self.image.get_rect()
        self.rect.x = 368
        self.rect.y = 536
    def update(self):
        teclas = pygame.key.get_pressed()
        #Movimiento
        if teclas[K_LEFT]:
            self.rect.x -= 1
        if teclas[K_RIGHT]:
            self.rect.x += 1
        if teclas[K_UP]:
            self.rect.y -= 1
        if teclas[K_DOWN]:
            self.rect.y += 1
        #Limites
        if self.rect.x <26> 826:
            self.rect.x = -26
        if self.rect.y <0>= 536:
            self.rect.y = 536
           
#Naves enemigas
class enemigo(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        (self.image, self.rect) = load_image('datos/enemigo.png', True)
        self.set_initial_position()
        self.load_image()
    def set_initial_position(self):
        self.rect.centerx = random.randint(100, 700)
        self.rect.y = 0
        self.x_velocity = 1
        self.y_velocity = 2
    def load_image(self):
        (self.image, self.rect) = load_image('datos/enemigo.png', True)   
    def update(self):
       #Mover el sprite en 20
        self.rect.move_ip((self.x_velocity, self.y_velocity))
        if self.rect.left <64>= SCREEN_WIDTH +64:
            self.rect.left = -64
        if self.rect.y >= SCREEN_HEIGHT:
            self.rect.y = 0
           
#Programa principal
if __name__ == '__main__':
    pygame.init()
    salir = False
    screen = pygame.display.set_mode( (SCREEN_WIDTH,SCREEN_HEIGHT) )
    pygame.display.set_caption( "Pruebas" )
    (background_image, _) = load_image('back.jpg')
    screen.blit(background_image, (0, 0))
    sprites = pygame.sprite.RenderClear()
    nave = nave()
    enemigo = enemigo()
    sprites.add(nave)
    enemies = pygame.sprite.RenderClear()
    enemy_counter = 0
    while not salir:
            screen.blit(background_image, (0,0) )           
            keyinput = pygame.key.get_pressed()
            keyinput = pygame.key.get_pressed()
            sprites.update()
            enemies.add(enemigo)
            sprites.add(enemigo)
            sprites.draw(screen)
            pygame.display.flip()
            if keyinput[K_ESCAPE] or pygame.event.peek(QUIT):
                raise SystemExit
djkemical
 
Mensajes: 5
Registrado: Lun Sep 14, 2009 2:31 pm

Notapor djkemical » Vie Sep 25, 2009 3:14 pm

Nadie sabe resolver el problema? :(
Imagen
Imagen
Imagen
Imagen
djkemical
 
Mensajes: 5
Registrado: Lun Sep 14, 2009 2:31 pm

Notapor Juanxo » Vie Sep 25, 2009 4:11 pm

jajaj buenas, el juego que dices es uno que hice yo basado en otro ejemplo.

Creo que puedo ayudarte. Tu problema principal es que no estás añadiendo un nuevo enemigo cada vez, sino que siempre añades el mismo.

En vez de hacer esto:

Código: Seleccionar todo

(background_image, _) = load_image('back.jpg')
    screen.blit(background_image, (0, 0))
    sprites = pygame.sprite.RenderClear()
    nave = nave()
    enemigo = enemigo()
    sprites.add(nave)
    enemies = pygame.sprite.RenderClear()
    enemy_counter = 0
    while not salir:
            screen.blit(background_image, (0,0) )           
            keyinput = pygame.key.get_pressed()
            keyinput = pygame.key.get_pressed()
            sprites.update()
            enemies.add(enemigo)
            sprites.add(enemigo)
            sprites.draw(screen)
            pygame.display.flip()
            if keyinput[K_ESCAPE] or pygame.event.peek(QUIT):
                raise SystemExit


prueba con esto:

Código: Seleccionar todo

background_image = load_image("back.jpg")[0] #solo cojes la imagen

sprites= pygame.sprite.RenderClear()
enemies = pygame.sprite.RenderClear()

sprites.add(nave())

screen.blit(background_image, (0,0))

while true:

key_input = pygame.key.get_pressed()

if key_input[K_ESCAPE] or pygame.event.peek(QUIT):
   raise SystemExit
elif key_input[K_RETURN]: #aniadimos un enemigo
   enemies.add(enemigo())

#tapamos la posicion anterior
sprites.clear(screen, background_image)
enemies.clear(screen, background_image)

#actualizamos los objetos
sprites.update()
enemies.update()

#dibujamos los objetos
sprites.draw(screen)
enemies.draw(screen)



Fijate como yo no añado la misma variable cada vez(de hecho la he quitado) sino que llamo al constructor del objeto que quiero hacer.

Nota: si no quieres manejar los objetos manualmente, es decir, tratar de manera especial a cada enemigo por ejemplo, si no que siempre vas a tratarlos como un grupo, no tiene sentido que crees variables para cada uno, si no que los creas dentro del grupo directamente, con la llamada al constructor.

Una última cosa, si tienes los grupos RenderClear, no hace falta que dibujes el fondo cada vez, si no que si llamas al método "clear" de cada objeto con los parámetros que he puesto, pygame se encargará de dibujar el fondo solo en los sitios donde hubiera naves, en vez de dibujar todo el fondo. Así es más rapido.

Creo que eso es todo. Si algo falla, lo siento, pero es que hace algún tiempo que no uso pygame.

Edito: si tenéis dudas cuando empezáis sobre algunos aspectos concretos, como es normal, miraros la documentación de lo que usais ( en este caso pygame). Esta hecha por gente que sabe mucho de lo que vais a usar, y además viene todo muy bien explicado. Para los no anglo-parlantes(que no hablen/lean inglés) hay en la web de losersjuegos una traducción al español de la documentación de pygame(muy buena)
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)

Notapor djkemical » Sab Sep 26, 2009 11:41 am

Muchisimas gracias, luego pruebo a ver si me funciona, y si, creo que fue tu ejemplo el que coji jeje.
Imagen
Imagen
Imagen
Imagen
djkemical
 
Mensajes: 5
Registrado: Lun Sep 14, 2009 2:31 pm


Volver a Artículos, traducciones y documentación

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado