"Star Wars" Spaces Invaders

Losersjuegos cuenta con una secciones de ejemplos en su web. Utilice esta sección para consultar o proponer ideas acerca de ellos.

"Star Wars" Spaces Invaders

Notapor Juanxo » Sab Ene 31, 2009 3:30 am

Buenas a todos! Mi nombre es Juan. soy nuevo en el foro y en python-pygame(una semanilla). Quisiera presentar un ejemplo que he realizado a partir de un tutorial de dvl en la pagina linuxjuegos.com http://www.linuxjuegos.com/2005/09/18/programacion-de-juegos-en-python-tutorial-3/. Se trata de una version "Star Wars" del clasiquisimo space invaders.

Las modificaciones, con respecto al original del tutorial han sido:
Cambio de control con teclado a control con raton
Añadido sistema de puntuacion, asi como sistema de vidas(grafico)
Funcion reboot que "reinicia" el juego cada vez que te matan
Creacion de un Game Over
Implementacion de choques entre:la nave y los laseres enemigos(faltaba en el tutorial),entre los propios laseres y entre la nave buena y la mala

Ahi va el codigo:

Código: Seleccionar todo
"""Space Invaders de StarWars
    Autor Original:dvl de la pagina linuxjuegos.com
    Modificaciones:Juan Guerrero(Yo)
"""


import random,os,pygame
from pygame.locals import *

#Tamaño de pantalla
SCREEN_WIDTH=800
SCREEN_HEIGHT=600
#Nombre de la carpeta con los archivos
DATOS="datos"

#Cargar Imagen#
def load_image(name,colorkey=False):
    "asignamos la ruta de la carpeta donde guardaremos las imagenes"
    fullname=os.path.join(DATOS,name)

    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()

#Cargar Sonido#
def load_SoundFile(name):

    class NoneSound:
        def play(self): pass

    if not pygame.mixer or not pygame.mixer.get_init():
        return NoneSound()

    fullname=os.path.join(DATOS,name)

    try:
        sound=pygame.mixer.Sound(fullname)
    except pygame.error,message:
        print'No se pudo cargar el sonido: ',fullname
        raise SystemExit,message
   
    return sound


#Nave Buena#
class XWing(pygame.sprite.Sprite):

    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image,self.rect=load_image("xwing.bmp",True)
        "posicion inicial"
        self.rect.centerx=SCREEN_WIDTH
        self.rect.centery=(SCREEN_HEIGHT-40)
       
    def update(self):
        posicion=pygame.mouse.get_pos()
        self.rect.center=posicion
        """Evitamos salidas de pantalla
            restringimos el movimiento vertical a media pantalla
        """
        if self.rect.left<0:
            self.rect.left=0
        elif self.rect.right>SCREEN_WIDTH:
            self.rect.right=SCREEN_WIDTH

        if self.rect.top<=SCREEN_HEIGHT/2:
            self.rect.top=SCREEN_HEIGHT/2
        elif self.rect.bottom>=SCREEN_HEIGHT:
            self.rect.bottom=SCREEN_HEIGHT

#Los Malos#
class TIEFighter(pygame.sprite.Sprite):
    def __init__(self,startx):
        pygame.sprite.Sprite.__init__(self)
        self.image,self.rect=load_image("tie_fighter.bmp",True)
        self.rect.centerx=startx
        self.rect.centery=0
        self.x_velocity=random.randint(-5,5)
        self.y_velocity=random.randint(1,5)

    def update(self):
        self.rect.move_ip((self.x_velocity,self.y_velocity))
       
        if self.rect.left<=0:
            self.x_velocity=-(self.x_velocity)
        elif self.rect.right>=SCREEN_WIDTH:
            self.x_velocity=-(self.x_velocity)

        """Si se sale de pantalla, lo eliminamos para liberar
        espacio"""
        if self.rect.bottom>=SCREEN_HEIGHT:
            self.kill()

        "Disparos Aleatorios"
        fire=random.randint(1,60)
        if fire==1:
            tiefighterLaserSprites.add(TIEFighterLaser(self.rect.midbottom))
            tiefighterShotFX.play()

#Laser de XWing#
class XWingLaser(pygame.sprite.Sprite):

    def __init__(self,startpos):
        pygame.sprite.Sprite.__init__(self)
        self.image,self.rect=load_image("rebel_laser.bmp",True)
        self.rect.center=startpos

    def update(self):
        if self.rect.bottom<=0:
            self.kill()
        else:
            self.rect.move_ip((0,-4))

#Laser de TIEFighter#
class TIEFighterLaser(pygame.sprite.Sprite):

    def __init__(self,startpos):
        pygame.sprite.Sprite.__init__(self)
        self.image,self.rect=load_image("empire_laser.bmp",True)
        self.rect.midtop = startpos

    def update(self):
        """Si se sale de pantalla, lo eliminamos para liberar
        espacio"""
        if self.rect.bottom>=SCREEN_HEIGHT:
            self.kill()
        else:
            self.rect.move_ip((0,4))

#puntaje#
def puntuacion(puntos):
    puntos=puntos+1

#vidas
class corazon(pygame.sprite.Sprite):

    def __init__(self,posini):
        pygame.sprite.Sprite.__init__(self)
        self.image,self.rect=load_image("corazon.gif",True)
        self.rect.centerx=posini
        self.rect.centery=25
   
"""limpia la pantalla del juego cuando te matan"""
def reboot(TIEFighterContainer):
    "Carga los 4 'malos' iniciales"
    TIEFighterContainer.add(TIEFighter(650))
    TIEFighterContainer.add(TIEFighter(50))
    TIEFighterContainer.add(TIEFighter(650))
    TIEFighterContainer.add(TIEFighter(50))
    return TIEFighterContainer
   


def main():
    random.seed()
    pygame.init()
    screen=pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT),HWSURFACE|DOUBLEBUF)
    pygame.display.set_caption("STAR WARS INVADERS")
    "Limita el movimiento del raton a la pantalla de juego"
    pygame.event.set_grab(True)
   
    background_image,background_rect=load_image("background.bmp")
    screen.blit(background_image,(0,0))

    "Imagen de final de juego"
    gameover_image,gameover_rect=load_image("Vader.bmp")

    "Cargamos los sonidos"
    explode1FX=load_SoundFile("explode1.wav")
    global tiefighterShotFX
    tiefighterShotFX=load_SoundFile("empire_laser.wav")
    xwingShotFX=load_SoundFile("rebel_laser.wav")
    explode2FX=load_SoundFile("explode2.wav")
    risamalvadaFX=load_SoundFile("risa.mp3")
#Creamos los containers
    xwingSprite=pygame.sprite.RenderClear()
    xwing=XWing()
    xwingSprite.add(xwing)
    xwingLaserSprites=pygame.sprite.RenderClear()
    #4 malos iniciales
    tiefighterSprites=pygame.sprite.RenderClear()
    reboot(tiefighterSprites)

    global tiefighterLaserSprites
   
    tiefighterLaserSprites=pygame.sprite.RenderClear()
    "Variable para bucle principal"
    running=True

    "Contador para aparicion de nuevos enemigos"
    addTieFighterCounter=0
    clock=pygame.time.Clock()
    gameover=False
    puntos=0
    nivel=0
    pygame.mouse.set_visible(False)


    #creamos las vidas
    vidas=pygame.sprite.RenderClear()
    vida3=corazon(30)
    vida2=corazon(70)
    vida1=corazon(110)
    vidas.add(vida1)
    vidas.add(vida2)
    vidas.add(vida3)
   
    #numero inicial de vidas
    nvidas=3

    #Fuente para el texto
    fuente=pygame.font.Font(None,40)

    while running is True:
       
        clock.tick(60)
        "Comprobamos si se produce algun evento de entrada"
        for event in pygame.event.get():
            if event.type == QUIT:
                running = False # Se acaba el juego
            elif event.type == KEYDOWN:
                if event.key == K_ESCAPE:
                    running = False # Se acaba el juego
                "Dispara un laser cuando pulsemos la barra espaciadora"
                elif event.key == K_SPACE:
                    xwingLaserSprites.add(XWingLaser(xwing.rect.midtop))
                    xwingShotFX.play()
            """Creamos un laser a cada lado de la nave
            pulsando el boton izq del raton"""
            elif event.type == MOUSEBUTTONDOWN:
                xwingLaserSprites.add(XWingLaser(xwing.rect.midleft))
                xwingLaserSprites.add(XWingLaser(xwing.rect.midright))
                xwingShotFX.play()
        "Ajustamos el nivel"
        if puntos>=5:
            nivel+=1
            puntos=0
        "Incrementamos el contador para crear nuevos enemigos"
        addTieFighterCounter+=1
        if addTieFighterCounter>=(100-15*nivel):"Cada nivel apareceran mas rapido"
            tiefighterSprites.add(TIEFighter(random.randint(100,700)))
            addTieFighterCounter=0
        "Actualizamos los containers"
        xwingSprite.update()
        xwingLaserSprites.update()
        tiefighterSprites.update()
        tiefighterLaserSprites.update()


        """Comprobamos si ha habido choques
        Las diferentes posibilidades son:
        Malo vs LaserBueno
        Bueno vs LaserMalo
        Bueno vs Malo
        LaserBueno vs LaserMalo
       
        """
        for hit in pygame.sprite.groupcollide(tiefighterSprites,xwingLaserSprites,1,1):
            explode1FX.play()
            puntos+=1

        for hit in pygame.sprite.groupcollide(xwingSprite,tiefighterLaserSprites,0,1):
            explode2FX.play()
            "Vamos eliminando los corazones en pantalla y restando vidas"
            if nvidas==3:
                vidas.remove(vida1)
            elif nvidas==2:
                vidas.remove(vida2)
            else:
                vidas.remove(vida3)
            nvidas-=1
            if nvidas==0:
                gameover=True
            else:
                "Vaciamos todos los containers y limpiamos la pantalla"
                tiefighterLaserSprites.empty()
                tiefighterSprites.empty()
                pygame.mouse.set_pos((SCREEN_WIDTH/2),SCREEN_HEIGHT-40)
                xwingLaserSprites.empty()


                tiefighterLaserSprites.clear(screen,background_image)
                tiefighterSprites.clear(screen,background_image)
                xwingSprite.clear(screen,background_image)
                xwingLaserSprites.clear(screen,background_image)
                vidas.clear(screen,background_image)

                fuente=pygame.font.Font(None,40)
                Puntaje=fuente.render(str(puntos),1,(255,255,255))
                Nivel=fuente.render(str(nivel),1,(255,255,255))
                screen.blit(background_image,(0,0))
                screen.blit(Puntaje,(SCREEN_WIDTH/2,0))
                screen.blit(Nivel,(SCREEN_WIDTH/2+20,0))

                tiefighterLaserSprites.draw(screen)
                xwingLaserSprites.draw(screen)
                xwingSprite.draw(screen)
                tiefighterSprites.draw(screen)
                vidas.draw(screen)

                "Establecemos un tiempo de espera antes de reiniciar"
                pygame.time.wait(800)

                "reiniciamos con los 4 malos del comienzo
                reboot(tiefighterSprites)

        """Este caso es igual que el anterior, solo que en esta ocasion se trata
        de choques entre naves"""
        for hit in pygame.sprite.groupcollide(xwingSprite,tiefighterSprites,0,1):
            explode2FX.play()
            explode1FX.play()
            if nvidas==3:
                vidas.remove(vida1)
            elif nvidas==2:
                vidas.remove(vida2)
            else:
                vidas.remove(vida3)
            nvidas-=1
            if nvidas==0:
                gameover=True
            else:
                tiefighterLaserSprites.empty()
                tiefighterSprites.empty()
                pygame.mouse.set_pos((SCREEN_WIDTH/2),10)
                xwingLaserSprites.empty()


                tiefighterLaserSprites.clear(screen,background_image)
                tiefighterSprites.clear(screen,background_image)
                xwingSprite.clear(screen,background_image)
                xwingLaserSprites.clear(screen,background_image)
                vidas.clear(screen,background_image)

                fuente=pygame.font.Font(None,40)
                Puntaje=fuente.render(str(puntos),1,(255,255,255))
                Nivel=fuente.render(str(nivel),1,(255,255,255))
                screen.blit(background_image,(0,0))
                screen.blit(Puntaje,(SCREEN_WIDTH/2,0))
                screen.blit(Nivel,(SCREEN_WIDTH/2+20,0))

                tiefighterLaserSprites.draw(screen)
                xwingLaserSprites.draw(screen)
                xwingSprite.draw(screen)
                tiefighterSprites.draw(screen)
                vidas.draw(screen)

               
                pygame.time.wait(800)

               
                reboot(tiefighterSprites)


        for hit in pygame.sprite.groupcollide(xwingLaserSprites,tiefighterLaserSprites,1,1):
            explode1FX.play()
       
        if gameover: pygame.time.delay(1000)

        "Borramos y pintamos los elementos de la pantalla"
        tiefighterLaserSprites.clear(screen,background_image)
        tiefighterSprites.clear(screen,background_image)
        xwingSprite.clear(screen,background_image)
        xwingLaserSprites.clear(screen,background_image)
        vidas.clear(screen,background_image)

        fuente=pygame.font.Font(None,40)
        Puntaje=fuente.render(str(puntos),1,(255,255,255))
        Nivel=fuente.render(str(nivel),1,(255,255,255))
        screen.blit(background_image,(0,0))
        screen.blit(Puntaje,(SCREEN_WIDTH/2,0))
        screen.blit(Nivel,(SCREEN_WIDTH/2+20,0))

        tiefighterLaserSprites.draw(screen)
        xwingLaserSprites.draw(screen)
        xwingSprite.draw(screen)
        tiefighterSprites.draw(screen)
        vidas.draw(screen)


       
        pygame.display.flip()

        "Final de juego"
        if gameover:
            screen.blit(gameover_image,(0,0))
            pygame.display.flip()
            risamalvadaFX.play()
            running=False
            pygame.event.set_grab(False)


if __name__=='__main__':
    main()
       


Como podreis comprobar, este juego tiene una serie de mejoras posibles:
creacion de una funcion que se encargue de la actualizacion(puesto que llegamos a repetir el mismo codigo tres veces), el hecho de que a partir de cierto nivel, el tiempo de aparicion entre malo y malo es cero(para esto se podria añadir que cada cinco niveles, apareciera un malo malisimo,en plan estrealla de la muerte, y el tiempo entre malo y malo se restableciera)


Otro fallo que no entiendo es el hecho d que el sonido de la risa malvada no suena,alguien sabe por que??

Espero comentarios y criticas
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)

Notapor hugoruscitti » Sab Ene 31, 2009 4:25 pm

Saludos, se ve muy interesante, ¿de casualidad
tienes los gráficos y sonidos que se usan en el
código?. Hay imágenes de libre utilización en la
siguiente página si no los tienes:

http://www.flyingyogi.com/fun/spritelib.html

Por cierto, ¿te gustaría publicar este ejemplo en una
de las secciones de la web?. Me ha gustado mucho.
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Notapor Juanxo » Sab Ene 31, 2009 5:20 pm

ante todo,gracias por la página hugo. las imagenes si que las tengo. en la pagina que puse de referencia donde venia explicado el tutorial ahi una archivo tar, en el que estan las imagenes y sonidos usadas en el juego(menos la de vader y el sonido risa malvada, que las busque en google)asi como el codigo de la version 1.0 escrito por dvl como yo la llamo.

En cuanto a lo de la publicacion, para mi seria un honor que se me publicara, para eso lo postee. si lo necesitas dimelo y te paso pongo alguna screenshot. Mientras, tratare de corregir un par de fallillos que quiero mejorar y tratare de implantar alguna cosilla, como scroll o algun malo jefe(en proceso de aprendizaje)

sabes de algun tutorial para scroll??

Tambien toi trabajando un Pong(el de toda la vida)y un BlockBreaker(el de ir rompiendo ladrillitos), pero tngo problemillas con el siegundo. :x

Es un orgullo para mi recibir tu aprobacion hugo.
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)

Notapor hugoruscitti » Dom Feb 01, 2009 12:01 am

Juanxo escribió:En cuanto a lo de la publicacion, para mi seria un honor que se me publicara, para eso lo postee. si lo necesitas dimelo y te paso pongo alguna screenshot. Mientras, tratare de corregir un par de fallillos que quiero mejorar y tratare de implantar alguna cosilla, como scroll o algun malo jefe(en proceso de aprendizaje).


¡que bien!, si, si me gustaría publicarlo y para ello me ayudaría
mucho que tenga una estructura similar a la de los otros
ejemplos de la web (sección referencias). Es decir, que tenga
un archivo con la descripción del ejemplo, una captura de pantalla
y los recursos que carga.

Igualmente si me lo envías por correo te ayudo a conseguir
el mismo formato de los otros ejemplos, la idea de tener
todos los ejemplos con el mismo formato es que resulte
mas sencillo examinarlos en grupo, y dar crédito a todos
los autores.

Juanxo escribió:sabes de algun tutorial para scroll??.


no en este momento, pero sería interesante hacer un
tópico nuevo y consultar, tal vez alguien sepa de uno
bueno por ahí...


Juanxo escribió:Tambien toi trabajando un Pong(el de toda la vida)y un BlockBreaker(el de ir rompiendo ladrillitos), pero tngo problemillas con el siegundo. :x


Si, recién veo tu mensaje sobre el segundo juego, intentaré
crear algún código de ejemplo para tratar de ayudarte en la
consulta.

Juanxo escribió:Es un orgullo para mi recibir tu aprobacion hugo.


Es un honor, por favor....
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Notapor Juanxo » Dom Feb 01, 2009 4:06 am

ok mirare los demas para cambiar lo que haga falta.

En cuanto pueda te envio todos los elementos.

el problema que tengo con el segundo es uno que postee en la seccio de lenguajes. se trata de que yo kiero aser ladrillos con diferentes números de vidas(ladrillo morao solo puede recibir un golpe, ladrillo gris,2) pero para ello tendria que actualizarlos individualmente en vez de juntarlos en grupo
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)

Se ve guapo el ejemplo

Notapor algarafa » Dom Feb 01, 2009 10:28 am

El ejemplo se ve muy bien, de hecho, el Pong y este SpaceInvaders, son los juegos que estoy usando para ir aprendiendo algo de programación orientada a objetos. Yo este no lo he probado, pero si el de Linuxjuegos, y esta guapo. Supongo que los gráficos serán libres ¿no? Lo digo porque en el otro, en el de Linuxjuegos aparecía el Xwing de Luke Skywalker y los Tiefighter, y no se si son libres. Si no podrías plantearte cambiarlos.
¿Y ante todo animo Juanxo, yo tengo ganas de probar tu arkanoid cuando lo acabes!
http://liberatumundo.wordpress.com/
Avatar de Usuario
algarafa
 
Mensajes: 135
Registrado: Lun Oct 27, 2008 6:12 pm
Ubicación: España

Notapor Juanxo » Dom Feb 01, 2009 1:10 pm

Supongo que los gráficos serán libres

Pos la verda eske no especifica nada, asi ke no se pero si los utilizo el en el ejemplo supongo que lo seran

Yo este no lo he probado, pero si el de Linuxjuegos


La verda eske este es una ampliacion de ideas que se me iban ocurriendo a partir de ese.Por cierto, estoy tratando de implementar un par de cosillas(Estrella de la muerte y efecto de explosion, que ya pasare asi ke hugo, todavia no lo subire a ejemplos)

el Pong y este SpaceInvaders, son los juegos que estoy usando para ir aprendiendo algo de programación orientada a objetos


Por si no los abias visto, en esta pagina http://www.losersjuegos.com.ar/referencia/ejemplos/ejemplos.php existen bastantes ejemplos, que sin ser juegos todos ellos, si que te explican cosas interesantes, como scroll, apuntar hacia determinadas posiciones, etc
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)

Notapor Juanxo » Mar Feb 03, 2009 1:00 am

Bueno pues ahi van un par de screenshots para ir abriendo el apetito:

Este es un malo jefe, por llamarlo de alguna manera:

Imagen

A ver quien se pasa esto:juasjuasjuas

Imagen
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)

Notapor Juanxo » Mar Feb 03, 2009 1:17 pm

**Editado:cambie el codigo,"limpiandolo" un poco, añadiendo comentarios y terminando un par de cosillas.


Buenas a todos. Aqui va la segunda entrega de star wars invaders.
no he querido editar la anterior para que se diferenciaran los cambios entre ambas. esta nueva parte trae la implementacion de "jefes malos"(Estrellas de la muerte).Espero que os guste!!

Lo unico que no entiendo es porque no funciona la risa malvada!!!
hasta otra!!


Código: Seleccionar todo
# -*- encoding: utf-8 -*-
import random,os,pygame
from pygame.locals import *


#Dimensiones de la pantalla
SCREEN_WIDTH=800
SCREEN_HEIGHT=600

#ruta donde almacenaremos los recursos(imagenes,sonidos,etc)
DATOS="datos"

#Cargar Imagen#
def load_image(name,colorkey=False):
    fullname=os.path.join(DATOS,name)

    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()

#Cargar Sonido#
def load_SoundFile(name):#Comprobamos si hay posibilidad de emitir sonido

    class NoneSound:
        def play(self): pass

    if not pygame.mixer or not pygame.mixer.get_init():
        return NoneSound()

    fullname=os.path.join(DATOS,name)
    #En caso de que se puedan escuchar sonidos, tratamos de cargar imagen
    try:#En caso de que se puedan escuchar sonidos, tratamos de cargar el sonido

        sound=pygame.mixer.Sound(fullname)
    except pygame.error,message:
        print'No se pudo cargar el sonido: ',fullname
        raise SystemExit,message
   
    return sound


#Nave Buena#

class XWing(pygame.sprite.Sprite):

    def __init__(self):
        pygame.sprite.Sprite.__init__(self)#Cargamos la imagen
        self.image,self.rect=load_image("xwing.bmp",True)
        self.rect.centerx=SCREEN_WIDTH#Posicion Inicial de la nave
        self.rect.centery=(SCREEN_HEIGHT-40)
       
    def update(self):
        posicion=pygame.mouse.get_pos()
        self.rect.center=posicion
        #o con el limite superior que le hemos impuesto
        if self.rect.left<0:#Comprobamos si choca con las paredes laterales, con la
            self.rect.left=0#pared inferior o con el limite superior que le hemos impuesto
        elif self.rect.right>SCREEN_WIDTH:
            self.rect.right=SCREEN_WIDTH

        if self.rect.top<=SCREEN_HEIGHT/2:
            self.rect.top=SCREEN_HEIGHT/2
        elif self.rect.bottom>=SCREEN_HEIGHT:
            self.rect.bottom=SCREEN_HEIGHT

#Los Malos#
class TIEFighter(pygame.sprite.Sprite):
    def __init__(self,startx):
        pygame.sprite.Sprite.__init__(self)#Cargamos imagen
        self.image,self.rect=load_image("tie_fighter.bmp",True)
        #Posicion Inicial
        self.rect.centerx=startx
        self.rect.centery=0
        self.x_velocity=random.randint(-5,5)
        self.y_velocity=random.randint(1,5)

    def update(self):
        self.rect.move_ip((self.x_velocity,self.y_velocity))
        #Comprobamos si se choca con las paredes laterales
        if self.rect.left<=0:
            self.x_velocity=-(self.x_velocity)
        elif self.rect.right>=SCREEN_WIDTH:
            self.x_velocity=-(self.x_velocity)
        #Si se sale por la parte inferior de la pantalla, lo eliminamos
        if self.rect.top>=SCREEN_HEIGHT:
            self.kill()

        #Haremos que los disparos sean aleatorios
        fire=random.randint(1,60)
        if fire==1:
            tiefighterLaserSprites.add(TIEFighterLaser(self.rect.midbottom))
            tiefighterShotFX.play()

#Laser de XWing#
class XWingLaser(pygame.sprite.Sprite):

    def __init__(self,startpos):
        pygame.sprite.Sprite.__init__(self)
        self.image,self.rect=load_image("rebel_laser.bmp",True)
        self.rect.center=startpos
    #Si se sale por la parte superior de la pantalla,lo matamos   
    def update(self):
        if self.rect.bottom<=0:
            self.kill()
        else:
            self.rect.move_ip((0,-4))

#Laser de TIEFighter#
class TIEFighterLaser(pygame.sprite.Sprite):

    def __init__(self,startpos):
        pygame.sprite.Sprite.__init__(self)
        self.image,self.rect=load_image("empire_laser.bmp",True)
        self.rect.midtop = startpos

    def update(self):
        #Ocurre lo mismo que con los TIEFighter
        if self.rect.bottom>=SCREEN_HEIGHT:
            self.kill()
        else:
            self.rect.move_ip((0,4))

#Estrella de la muerte
#Se trata de un jefe malo por decirlo de alguna manera
class Estrella_Muerte(pygame.sprite.Sprite):
    #Definimos el numero de vidas inicial
    vidas=20
   
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image,self.rect=load_image("Estrella.bmp",True)#Haremos rebotar la nave de un lado a otro de la pantalla
        self.rect.centerx=SCREEN_WIDTH/2
        self.rect.centery=150
        self.x_velocity=7

    def update(self):#Comprobamos choques
        if self.rect.right>=SCREEN_WIDTH:
            self.rect.right=SCREEN_WIDTH
            self.x_velocity=-self.x_velocity
        elif self.rect.left<=0:
            self.rect.left=0
            self.x_velocity=-self.x_velocity

        self.rect.move_ip((self.x_velocity,0))
       
        disparo=random.randint(1,60)#Implementamos dos tipos de disparos,uno en el centro
        if disparo==1:#de la parte baja, y otros dos a cada lado
            tiefighterLaserSprites.add(TIEFighterLaser(self.rect.midbottom))
            tiefighterShotFX.play()
        elif disparo==60:
            tiefighterLaserSprites.add(TIEFighterLaser(self.rect.midleft))
            tiefighterLaserSprites.add(TIEFighterLaser(self.rect.midright))           
            tiefighterShotFX.play()
           
#puntaje
def puntuacion(puntos):
    puntos=puntos+1

#vidas
class corazon(pygame.sprite.Sprite):

    def __init__(self,posini):
        pygame.sprite.Sprite.__init__(self)
        self.image,self.rect=load_image("corazon.bmp",True)
        self.rect.centerx=posini
        self.rect.centery=25
   
#Reinicio
#Esta funcion será llamada cada vez que nos den, para reiniciar el juego
def reboot(TIEFighterContainer):
   
    TIEFighterContainer.add(TIEFighter(650))
    TIEFighterContainer.add(TIEFighter(50))
    TIEFighterContainer.add(TIEFighter(650))
    TIEFighterContainer.add(TIEFighter(50))
    return TIEFighterContainer

#unimos todos los clear en una funcion para optimizar el codigo
def updates(TIEFighter,TIELaser,XWing,XWingLaser,Corazones,screen,background_image):
    TIEFighter.clear(screen,background_image)
    TIELaser.clear(screen,background_image)
    XWing.clear(screen,background_image)
    XWingLaser.clear(screen,background_image)
    Corazones.clear(screen,background_image)
    return TIEFighter,TIELaser,XWing,XWingLaser,Corazones

#unimos todos los draw en una funcion
def draws(TIEFighter,TIELaser,XWing,XWingLaser,Corazones,screen):
    TIEFighter.draw(screen)
    TIELaser.draw(screen)
    XWing.draw(screen)
    XWingLaser.draw(screen)
    Corazones.draw(screen)
    return TIEFighter,TIELaser,XWing,XWingLaser,Corazones

#funcion que se encargara de imprimir el texto
def imprimir_texto(fuente,Puntaje,Nivel,screen,background_image,puntos,nivel):
    fuente=pygame.font.Font(None,40)
    Puntaje=fuente.render('Puntos '+str(puntos),1,(255,255,255))
    Nivel=fuente.render('Nivel '+str(nivel),1,(255,255,255))
    screen.blit(background_image,(0,0))
    screen.blit(Puntaje,(0,50))
    screen.blit(Nivel,(0,95))
    return fuente,Puntaje,Nivel,screen

def main():
    random.seed()
    pygame.init()

    #Definimos la pantalla
    screen=pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT),HWSURFACE|DOUBLEBUF)
    pygame.display.set_caption("STAR WARS INVADERS")

    #Añadimos la imagen de fondo
    background_image,background_rect=load_image("background.bmp")
    screen.blit(background_image,(0,0))

    #Imagen de final de juego
    gameover_image,gameover_rect=load_image("Vader.bmp")

    #Cargamos todos los sonidos
    explode1FX=load_SoundFile("explode1.wav")
    global tiefighterShotFX
    tiefighterShotFX=load_SoundFile("empire_laser.wav")
    xwingShotFX=load_SoundFile("rebel_laser.wav")
    explode2FX=load_SoundFile("explode2.wav")
    #Esta no funciona y no se por que
    risamalvadaFX=load_SoundFile("risa.mp3")

    #Creamos los grupos
    xwingSprite=pygame.sprite.RenderClear()
    xwing=XWing()
    xwingSprite.add(xwing)

    xwingLaserSprites=pygame.sprite.RenderClear()
   
    tiefighterSprites=pygame.sprite.RenderClear()
    reboot(tiefighterSprites)#Llamamos a los cuatro malos iniciales
   
    global tiefighterLaserSprites
    tiefighterLaserSprites=pygame.sprite.RenderClear()

    EstrellaMuerteSprites=pygame.sprite.RenderClear()
   
    #Variable de control del bucle main
    running=True
    #Contador para las apariciones de los malos
    addTieFighterCounter=0
    #Reloj de juego
    clock=pygame.time.Clock()

    #Booleana de control de final de juego
    gameover=False

    #Puntos y nivel
    puntos=0
    nivel=1
    #Variable que acelerará la aparicion de los malos
    Estrella=0

    #Booleana que controla si aparecio o no la estrella
    aparecio=False

    #Hacemos invisible el raton
    pygame.mouse.set_visible(False)

    #creamos las vidas
    vidas=pygame.sprite.RenderClear()
    vida3=corazon(30)
    vida2=corazon(70)
    vida1=corazon(110)
    vidas.add(vida1)
    vidas.add(vida2)
    vidas.add(vida3)
   
    #numero inicial de vidas
    nvidas=3

    fuente=pygame.font.Font(None,40)
    Puntaje=fuente.render('Puntos '+str(puntos),1,(255,255,255))
    Nivel=fuente.render('Nivel '+str(nivel),1,(255,255,255))
   
    #Bucle Principal
    while running is True:
        clock.tick(60)#Definimos la velocidad del reloj

        for event in pygame.event.get():#Eventos de salida
            if event.type == QUIT:
                running = False # Se acaba el juego
            elif event.type == KEYDOWN:
                if event.key == K_ESCAPE:
                    running = False # Se acaba el juego
            elif event.type == MOUSEBUTTONDOWN:#Si pulsa el boton izq, aparecen un laser a cada lado"
                xwingLaserSprites.add(XWingLaser(xwing.rect.midleft))
                xwingLaserSprites.add(XWingLaser(xwing.rect.midright))               
                xwingShotFX.play()
           
        #Incremento de nivel
        if puntos>6:
            nivel+=1
            puntos=0
           
        #Control de aparicion de la Estrella(cada 3 niveles)   
        if (nivel%4)==0:
            if not aparecio:#si no hay otra estrella creada ya
                EstrellaFinal=Estrella_Muerte()               
                EstrellaMuerteSprites.add(EstrellaFinal)
                tiefighterLaserSprites.empty()#Borramos los laseres enemigos
            tiefighterSprites.empty()#Borramos todas las naves malas"
            EstrellaMuerteSprites.update()#Actualizamos los sprites y cambiamos "aparecio"
            xwingSprite.update()
            xwingLaserSprites.update()
            tiefighterLaserSprites.update()
            aparecio=True

            #Choques entre la estrella y los láseres buenos
            for hit in pygame.sprite.groupcollide(EstrellaMuerteSprites,xwingLaserSprites,0,1):
                EstrellaFinal.vidas-=1
                if EstrellaFinal.vidas==0:
                    Estrella+=1
                    EstrellaFinal.kill()
                    explode1FX.play
                    nivel+=1
                    aparecio=False
                    Estrella+=1
                   
            #choques entre los láseres malos y la nave
            for hit in pygame.sprite.groupcollide(xwingSprite,tiefighterLaserSprites,0,1):
                explode2FX.play()
                if nvidas==3:
                    vidas.remove(vida1)
                elif nvidas==2:
                    vidas.remove(vida2)
                else:
                    vidas.remove(vida3)
                nvidas-=1
                if nvidas==0:
                    gameover=True
                else:#borramos las naves malas y los laseres
                    tiefighterLaserSprites.empty()
                    tiefighterSprites.empty()
                    pygame.mouse.set_pos((SCREEN_WIDTH/2),SCREEN_HEIGHT-40)
                    xwingLaserSprites.empty()

                    #"limpiamos" la pantalla
                    updates(tiefighterSprites,tiefighterLaserSprites,xwingSprite,xwingLaserSprites,vidas,screen,background_image)
                    EstrellaMuerteSprites.clear(screen,background_image)
                   

                    #Imprimimos el texto
                    imprimir_texto(fuente,Puntaje,Nivel,screen,background_image,puntos,nivel)

                    #dibujamos los sprites
                    draws(tiefighterSprites,tiefighterLaserSprites,xwingSprite,xwingLaserSprites,vidas,screen)
                    EstrellaMuerteSprites.draw(screen)

                    #tiempo de espera antes de reinicio
                    pygame.time.wait(800)
           
            #limpiamos la pantalla
            EstrellaMuerteSprites.clear(screen,background_image)     
            updates(tiefighterSprites,tiefighterLaserSprites,xwingSprite,xwingLaserSprites,vidas,screen,background_image)
            #renderizamos el texto
            imprimir_texto(fuente,Puntaje,Nivel,screen,background_image,puntos,nivel)
            #dibujamos todos los sprites
            draws(tiefighterSprites,tiefighterLaserSprites,xwingSprite,xwingLaserSprites,vidas,screen)
            EstrellaMuerteSprites.draw(screen)
           
        #si no esta la estrella   
        else:
            addTieFighterCounter+=1
            if addTieFighterCounter>=(100-(15*Estrella)):#contador para creacion de malos
                tiefighterSprites.add(TIEFighter(random.randint(100,700)))
                addTieFighterCounter=0
               
            #actualizacion
            xwingSprite.update()
            xwingLaserSprites.update()
            tiefighterSprites.update()
            tiefighterLaserSprites.update()

            #tiefighter vs xwinglaser
            for hit in pygame.sprite.groupcollide(tiefighterSprites,xwingLaserSprites,1,1):
                explode1FX.play()
                puntos+=1
               
            #xwing vs tiefighterlaser
            for hit in pygame.sprite.groupcollide(xwingSprite,tiefighterLaserSprites,0,1):
                explode2FX.play()
                if nvidas==3:
                    vidas.remove(vida1)
                elif nvidas==2:
                    vidas.remove(vida2)
                else:
                    vidas.remove(vida3)
                nvidas-=1
                if nvidas==0:
                    gameover=True
                else:#mientras que no hayamos muerto, actualizamos, pintamos y reiniciamos
                    tiefighterLaserSprites.empty()
                    tiefighterSprites.empty()
                    pygame.mouse.set_pos((SCREEN_WIDTH/2),SCREEN_HEIGHT-40)
                    xwingLaserSprites.empty()

                    #borramos las superficies de los sprites
                    updates(tiefighterSprites,tiefighterLaserSprites,xwingSprite,xwingLaserSprites,vidas,screen,background_image)
                    #renderizamos el texto
                    imprimir_texto(fuente,Puntaje,Nivel,screen,background_image,puntos,nivel)
                    #dibujamos los sprites
                    draws(tiefighterSprites,tiefighterLaserSprites,xwingSprite,xwingLaserSprites,vidas,screen)

                    #tiempo de espera antes de reiniciar
                    pygame.time.wait(800)
                    #reincio de partida
                    reboot(tiefighterSprites)
                   
            #igual que el anterior, pero esta vez xwing vs tie
            for hit in pygame.sprite.groupcollide(xwingSprite,tiefighterSprites,0,1):
                explode2FX.play()
                explode1FX.play()
                if nvidas==3:
                    vidas.remove(vida1)
                elif nvidas==2:
                    vidas.remove(vida2)
                else:
                    vidas.remove(vida3)
                nvidas-=1
                if nvidas==0:
                    gameover=True
                else:
                    tiefighterLaserSprites.empty()
                    tiefighterSprites.empty()
                    xwingLaserSprites.empty()                   
                    pygame.mouse.set_pos((SCREEN_WIDTH/2),10)

                    #limpiamos la pantalla
                    updates(tiefighterSprites,tiefighterLaserSprites,xwingSprite,xwingLaserSprites,vidas,screen,background_image)
                    #renderizamos el texto
                    imprimir_texto(fuente,Puntaje,Nivel,screen,background_image,puntos,nivel)
                    #dibujamos los sprites
                    draws(tiefighterSprites,tiefighterLaserSprites,xwingSprite,xwingLaserSprites,vidas,screen)

                    #tiempo de espera
                    pygame.time.wait(800)

                    #reiniciamos con los 4 malos iniciales
                    reboot(tiefighterSprites)

            #choque entre láseres
            for hit in pygame.sprite.groupcollide(xwingLaserSprites,tiefighterLaserSprites,1,1):
                explode1FX.play()

            #ponemos un tiempo de pausa antes de salir
            if gameover: pygame.time.delay(1000)

            #si no ha habido ninguna colision
            #limpiamos la pantalla
            updates(tiefighterSprites,tiefighterLaserSprites,xwingSprite,xwingLaserSprites,vidas,screen,background_image)
            #renderizamos el texto
            imprimir_texto(fuente,Puntaje,Nivel,screen,background_image,puntos,nivel)
            #dibujamos los sprites
            draws(tiefighterSprites,tiefighterLaserSprites,xwingSprite,xwingLaserSprites,vidas,screen)

        #volcamos todo a la pantalla
        pygame.display.flip()

        #si se acabo el juego
        if gameover:
            screen.blit(gameover_image,(0,0))
            pygame.display.flip()
            risamalvadaFX.play()
            running=False
            return

if __name__=='__main__':
    main()
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)

Notapor Juanxo » Mar Feb 03, 2009 6:03 pm

Hugo ya ta listo. de momento no voi a meterle nada mas(un menú si acaso mas adelante cuando aprenda xD). cuando me digas te envio las cosillas
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)

Notapor hugoruscitti » Mar Feb 03, 2009 10:32 pm

Cuando quieras.
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Notapor Dokan » Mar Mar 03, 2009 3:06 pm

Me faltan sprites para poder probarlo bien. Cuando voy a pasar de nivel 3 se cierra, pero de momento está mucho mejor que mi intento. xD
¡¡Enhorabuena!!
Avatar de Usuario
Dokan
 
Mensajes: 143
Registrado: Lun Dic 03, 2007 10:40 pm

Notapor Juanxo » Dom Mar 08, 2009 2:50 am

En teoría el juego esta terminado y lo tiene hugo para subirlo cuando tnga tiempo.

Le hemos cambiado los sprites(evitar denuncias de Lucas Arts xD) y hugo le ha puesto explosiones.

Gracias Juan Carlos por el comentario
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)


Volver a Ejemplos

¿Quién está conectado?

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