Juego de batallas espaciales

Juego de batallas espaciales

Notapor algarafa » Dom Oct 03, 2010 7:07 pm

Hola a todos los losersdevelopers:

Como ya enseñé en otro hilo, estoy haciendo un juego con una navecita. En este hilo iré posteando los progresos según vaya consiguiendo avances más o menos importantes. De momento cuenta con lo siguiente:

- Nave protagonista
- Misiles para la nave protagonista
- Enemigos aleatorios

De momento se parece mucho al Invaders de Juanxo, aunque tengo pensado hacer algo distinto. Tenía pensado dividir el juego en varias tandas, unas de enemigos aleatorios, como los que hay ahora en las que tuvieras que matar x enemigos sin que se te escape ningno por la parte de abajo de la ventana. Otra con enemigos más fuertes que no se desplacen demasiado pero que disparen. Estos no sería aleatorios si no que irían definidos. Finalmente un enemigo final.

De momento no tengo ninguna duda. Lo único que quiero preguntar es si estoy mezclando demasiado las calses de Nave y Misil. Es que le paso muchos atributos de la clase misil a nave para no tener que cargarlos una y otra vez.

Imagen

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
import random

# ------------------------------
# Constantes
# ------------------------------

SCREEN_WIDTH = 400
SCREEN_HEIGHT = 600
IMG_DIR = 'images'
SOUND_DIR = 'sounds'

# ------------------------------
# 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
   
# Función para cargar sonidos.
def load_sound(name, dir_sound):
   ruta = os.path.join(dir_sound, name)
   try:
      sound = pygame.mixer.Sound(ruta)
      print 'Cargando sonido', ruta, '...¡éxito!'
   except:
      sound = None
      print 'No se pudo cargar el sonido', ruta
   
   return sound

# Clase para la nave.
class Nave(pygame.sprite.Sprite):
   
   def __init__(self, sprites, misiles, misil_img, misil_sound):
      pygame.sprite.Sprite.__init__(self)
      self.image = load_image('nave.png', IMG_DIR, alpha = True)
      self.rect = self.image.get_rect()
      self.sprites = sprites
      self.misiles = misiles
      self.misil_img = misil_img
      self.misil_sound = misil_sound
      self.counter = 0
      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
         
      # Actualiza el contador para simular la recarga de munición.
      if self.counter > 0:
         self.counter -= 1
         
      self.rect.move_ip(self.speed)
      
   # Indica si podemos disparar o no.
   def can_shoot(self):
      return self.counter == 0
         
   # Dispara los misiles.
   def shoot(self):
      if self.can_shoot():
         misil = Misil(self.rect.midtop, self.misiles, self.misil_img)
         self.sprites.add(misil)
         self.misiles.add(misil)
         self.misil_sound.play()
         # Actualiza el tiempo de recarga.
         self.counter = 40
         
# Clase para los enemigos.
class Enemigo(pygame.sprite.Sprite):
   
   def __init__(self, image):
      pygame.sprite.Sprite.__init__(self)
      self.image = image
      self.rect = self.image.get_rect()
      self.generar_pos()
      self.generar_vel()
      self.vida = 1
      
   def update(self):
      if self.rect.left < 0:
         self.speed[0] = -self.speed[0]
      if self.rect.right > SCREEN_WIDTH:
         self.speed[0] = -self.speed[0]
         
      # Si se queda sin vida o si sale de pantalla lo matamos.
      if self.vida == 0:
         self.kill()
      if self.rect.top == SCREEN_HEIGHT:
         self.kill()
         
      self.rect.move_ip(self.speed)
      
      
   def generar_pos(self):
      # Genera uns posición de x aleatoria.
      pos = random.randrange(50, SCREEN_WIDTH -50)
      self.rect.centerx = pos
      self.rect.centery = 25
      
   def generar_vel(self):
      # Genera una velocidad aleatoria.
      x = random.randrange(-5, 5)
      y = random.randrange(1, 3)
      self.speed = [x, y]
      
# Clase para el misil.
class Misil(pygame.sprite.Sprite):
   
   def __init__(self, initial_pos, misiles, image):
      pygame.sprite.Sprite.__init__(self)
      self.image = image
      self.rect = self.image.get_rect()
      self.rect.midbottom = initial_pos
      self.speed = [0, -4]
      self.poder_destruccion = 1
      misiles.add(self)
      
   # 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)
         
   # Comprobamos las colisiones con enemigos.
   def colisiones(self, objetivos): # Objetivos debe ser una lista.
      for objetivo in objetivos:
         if self.rect.colliderect(objetivo):
            objetivo.vida -= self.poder_destruccion
            self.kill()
   

# ------------------------------
# Función principal
# ------------------------------

def main():
   pygame.init()
   pygame.mixer.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))
   
   # Cargamos las imágenes y sonidos que usaremos mucho para no tener
   # que cargarlas cada vez que creemos un objeto de esa clase.
   misil_img = load_image('misil.png', IMG_DIR, alpha = True)
   misil_sound = load_sound('misil.wav', SOUND_DIR)
   enemigo_img = load_image('enemigo.png', IMG_DIR, alpha = True)
   
   # Cremoas el frupo de sprites.
   sprites = pygame.sprite.Group()
   
   # Creamos un contador para los enemigos aleatorios.
   contador = 0
   
   # Creamos un grupo para los misiles y otra para los enemigos.
   misiles = pygame.sprite.Group()
   enemigos = pygame.sprite.Group()
   
   # Creamos la nave y la añadimos al grupo sprites.
   nave = Nave(sprites, misiles, misil_img, misil_sound)
   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:
               nave.shoot()
               
            elif event.key == K_ESCAPE:
               print 'Cerrando juego...'
               sys.exit()
               
      # Actualizamos el contador de enemigos aleatorios.
      if contador > 0:
         contador -= 1
         
      # Generamos los enemigos aleatorios.
      if contador == 0:
         enemigo = Enemigo(enemigo_img)
         sprites.add(enemigo)
         enemigos.add(enemigo)
         contador = 100
         
      # Comprobamos las colisiones.
      for misil in misiles:
         misil.colisiones(enemigos)
      
      # Actualizamos los sprites.
      sprites.update()
            
      # Actualizamos la pantalla.
      sprites.clear(screen, fondo)
      sprites.draw(screen)
      pygame.display.flip()
   
if __name__ == "__main__":
   main()


En próximos posts pondré un link de descarga para que no tengáis que buscar imágenes para probarlo. Es que le quiero buscar un nombre para crearle una página dentro de mi blog y así ir subiendolo periódicamente.

¡Un saludo! :wink:

P.D.: Cuando el juego esté listo, losersjuegos tendrá su lugar em los créditos :D
http://liberatumundo.wordpress.com/
Avatar de Usuario
algarafa
 
Mensajes: 135
Registrado: Lun Oct 27, 2008 6:12 pm
Ubicación: España

Re: Juego de batallas espaciales

Notapor algarafa » Sab Oct 09, 2010 3:15 pm

Bueno, le he añadido un menú como el ue hay en la sección artículos. Lo modifiqué apra aprovechar la función de carga de fuentes que ya tenía. El caso es que el menú funciona perfectamente, pero no se me ocurre como definir la función jugar. El menú lo llamo desde dentro de la función main() así que no puede llamar a main(). Y si lo llamo desde afuera tengo que crear una screen para el menú. ¿Cómo lo haríais cosotros?

Hoy os dejo ya un link de descaga de Megaupload:
http://www.megaupload.com/?d=NMP6MAXK

Una captura de como se ve el menú:
Imagen

P.D.: Al final le he puesto de nombre Red Giant haciendo alusión a las estrellas gigantes rojas :P
http://liberatumundo.wordpress.com/
Avatar de Usuario
algarafa
 
Mensajes: 135
Registrado: Lun Oct 27, 2008 6:12 pm
Ubicación: España

Re: Juego de batallas espaciales

Notapor hugoruscitti » Sab Oct 09, 2010 3:34 pm

algarafa escribió:El caso es que el menú funciona perfectamente, pero no se me ocurre como definir la función jugar. El menú lo llamo desde dentro de la función main() así que no puede llamar a main(). Y si lo llamo desde afuera tengo que crear una screen para el menú. ¿Cómo lo haríais cosotros?

Buenas, ante todo muchas felicitaciones, se ve muy bueno el juego.

Con respecto a las escenas, me parece que te puede resultar útil
investigar el patron de diseño "Strategy". Comenté algo de eso
en un mensaje muy extenso que está acá:

viewtopic.php?p=590#p590

Básicamente la idea es que el bucle de tu juego conozca a un objeto
que represente la escena actual. Cada "estado" de tu juego, como
el menú, la pantalla de créditos y el juego serían escenas.

Algo así podría ser el código de tu bucle:

Código: Seleccionar todo
escena = Menu()

while True:
    escena.update()
    escena.draw(screen)
    clock.tick(30)


Entonces, si quieres pasar del menú a la escena
de juego ejecutarías una sentencia cómo:

Código: Seleccionar todo
escena = Juego()


Y como puedes ver, no hace falta cambiar el bucle de juego, toda
la magia está en intercambiar objetos para pasar de una
escena a la otra.

Aquí hay un gráfico de la estructura de objetos
que había propuesto en ese otro mensaje del
foro que te comenté:

Imagen

Te recomiendo leer ese otro mensaje que cité del foro, es un
poco extenso, pero hacia el final hablé un poquito de este
patrón de diseño y seguramenté te resultará de utilidad.

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

Re: Juego de batallas espaciales

Notapor algarafa » Lun Oct 11, 2010 8:58 am

¡Gracias por la info Hugo! Me he estado leyendo ese estilo de diseño y parece muy útil. Me parece que en Asadetris habíais hecho algo similar o sea que miraré allí a ver como implementasteis el menú. Además está muy bien porque no solo puedo crear como escenas el menú, los créditos y el juego, si no que dentro del juego puedo crear distintos niveles tratando a cada uno como una escena...

Voy a ver como lo metó en el juego y ya os comento. ¡Muchas gracias! :D
http://liberatumundo.wordpress.com/
Avatar de Usuario
algarafa
 
Mensajes: 135
Registrado: Lun Oct 27, 2008 6:12 pm
Ubicación: España

Re: Juego de batallas espaciales

Notapor algarafa » Lun Oct 11, 2010 9:59 am

Bien, he metido el bucle principal dentro de una clase y me encuentro un problema muy extraño. Si la escena a la que llamo es Game() pasando por completo del Menú, el juego funciona genial. Si llamo a menú sucede un fenómeno muy extraño. No me da ningún error pero aparece la ventana en negro, y si clicko en otra ventana y vuelvo a clickar en la del juego misteriosamente el menú aparece. Pero cuando le doy a una tecla que debería actualizarse la opción seleccion ada, no lo hace. Eso si si repito la maniobra de clickar en otra ventana si funciona. No se a que se puede deber.

Dejo el código, para probarlo podeís usar el archivo del post anterior sustituyendo el código por el que pongo a continuación.

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
import random

# ------------------------------
# Constantes
# ------------------------------

SCREEN_WIDTH = 400
SCREEN_HEIGHT = 600
IMG_DIR = 'images'
SOUND_DIR = 'sounds'
FONTS_DIR = 'fonts'

# ------------------------------
# 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
   
# Función para cargar sonidos.
def load_sound(name, dir_sound):
   ruta = os.path.join(dir_sound, name)
   try:
      sound = pygame.mixer.Sound(ruta)
      print 'Cargando sonido', ruta, '...¡éxito!'
   except:
      sound = None
      print 'No se pudo cargar el sonido', ruta
   
   return sound
   
# Función para cargar fuentes, devuelve el sprite y su rect.
def texto(texto, fuente, dir_fonts, posx, posy, size = 25,
      color = (255, 255, 255)):
      ruta = os.path.join(dir_fonts, fuente)
      fuente = pygame.font.Font(ruta, size)
      salida = pygame.font.Font.render(fuente, texto, 1, color)
      salida_rect = salida.get_rect()
      salida_rect.centerx = posx
      salida_rect.centery = posy
      return salida, salida_rect
      
# Clase para el menú.
class Menu():
   
   def __init__(self, opciones):
      self.opciones = opciones
      self.seleccionado = 0
      self.total = len(self.opciones)
      self.mantiene_pulsado = False
      self.fondo_menu = load_image('background_menu.jpg', IMG_DIR)
      
   def update(self):
      # Altera la opción seleccionada con las teclas cursor.
      key = pygame.key.get_pressed()
      
      if not self.mantiene_pulsado:
         if key[K_UP]:
            self.seleccionado -= 1
         elif key[K_DOWN]:
            self.seleccionado += 1
         elif key[K_RETURN]:
            # Invoca a la función asociada a la opción-
            titulo, funcion = self.opciones[self.seleccionado]
            print 'Selecionando función:', titulo
            funcion()
      # Procura que el cursor esté entre las opciones permitidas.
      if self.seleccionado < 0:
         self.seleccionado = 0
      elif self.seleccionado > self.total -1:
         self.seleccionado = self.total -1
         
      # Indica si el usuario mantiene pulsada alguna tecla.
      self.mantiene_pulsado = key[K_UP] or key[K_DOWN] or key[K_RETURN]
      
      for event in pygame.event.get():
         if event.type == QUIT:
            print 'Cerrando juego...'
            sys.exit()
      
   def imprimir(self, screen):
      screen.blit(self.fondo_menu, (0, 0))
      
      # Imprime sobre screen el texto de cada opción del menú.
      indice = 0
      altura_de_opcion = 50
      x = SCREEN_WIDTH / 2
      y = 300
      
      for (titulo, funcion) in self.opciones:
         if indice == self.seleccionado:
            color = (255, 255, 255)
         else:
            color = (255, 0, 0)
         
         posx = x
         posy = y + altura_de_opcion * indice
         opcion = texto(titulo, 'vibrocentric.ttf', FONTS_DIR, posx,\
         posy, size = altura_de_opcion, color = color)
         indice += 1
         screen.blit(opcion[0], opcion[1])
         
# Función para comenzar el nuevo juego.
def nuevo_juego():
   escena = Game(screen)
   
def salir_juego():
   print 'Cerrando juego...'
   sys.exit()

# 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.counter = 0
      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
         
      # Actualiza el contador para simular la recarga de munición.
      if self.counter > 0:
         self.counter -= 1
         
      self.rect.move_ip(self.speed)
      
   # Indica si podemos disparar o no.
   def can_shoot(self):
      return self.counter == 0
         
   # Dispara los misiles.
   def shoot(self, sprites, misiles, misil_img, misil_sound):
      if self.can_shoot():
         misil = Misil(self.rect.midtop, sprites, misiles, misil_img,\
         misil_sound)
         # Actualiza el tiempo de recarga.
         self.counter = 40
         
# Clase para los enemigos.
class Enemigo(pygame.sprite.Sprite):
   
   def __init__(self, image):
      pygame.sprite.Sprite.__init__(self)
      self.image = image
      self.rect = self.image.get_rect()
      self.generar_pos()
      self.generar_vel()
      self.vida = 1
      
   def update(self):
      if self.rect.left < 0:
         self.speed[0] = -self.speed[0]
      if self.rect.right > SCREEN_WIDTH:
         self.speed[0] = -self.speed[0]
         
      # Si se queda sin vida o si sale de pantalla lo matamos.
      if self.vida == 0:
         self.kill()
      if self.rect.top == SCREEN_HEIGHT:
         self.kill()
         
      self.rect.move_ip(self.speed)
      
      
   def generar_pos(self):
      # Genera uns posición de x aleatoria.
      pos = random.randrange(50, SCREEN_WIDTH -50)
      self.rect.centerx = pos
      self.rect.centery = 25
      
   def generar_vel(self):
      # Genera una velocidad aleatoria.
      x = random.randrange(-5, 5)
      y = random.randrange(1, 3)
      self.speed = [x, y]
      
# Clase para el misil.
class Misil(pygame.sprite.Sprite):
   
   def __init__(self, initial_pos, sprites, misiles, image, sound):
      pygame.sprite.Sprite.__init__(self)
      self.image = image
      self.sound = sound
      self.rect = self.image.get_rect()
      self.rect.midbottom = initial_pos
      self.speed = [0, -4]
      self.poder_destruccion = 1
      sprites.add(self)
      misiles.add(self)
      self.sound.play()
      
   # 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)
         
   # Comprobamos las colisiones con enemigos.
   def colisiones(self, objetivos): # Objetivos debe ser una lista.
      for objetivo in objetivos:
         if self.rect.colliderect(objetivo):
            objetivo.vida -= self.poder_destruccion
            self.kill()

# Clase para la escena del juego.            
class Game():
   
   def __init__(self, screen):
      
      # Cargamos e imprimimos el fondo.
      self.fondo = load_image('background.jpg', IMG_DIR)
      screen.blit(self.fondo, (0, 0))
      
      # Cargamos las imágenes y sonidos que usaremos mucho para no tener
      # que cargarlas cada vez que creemos un objeto de esa clase.
      self.misil_img = load_image('misil.png', IMG_DIR, alpha = True)
      self.misil_sound = load_sound('misil.wav', SOUND_DIR)
      self.enemigo_img = load_image('enemigo.png', IMG_DIR, alpha = True)
      
      # Creamos el grupo de sprites general, otro de misiles y otro de
      # enemigos.
      self.sprites = pygame.sprite.Group()
      self.misiles = pygame.sprite.Group()
      self.enemigos = pygame.sprite.Group()
      
      # Creamos un contador para los enemigos aleatorios.
      self.contador = 0
      
      # Creamos la nave y la añadimos al grupo sprites.
      self.nave = Nave()
      self.sprites.add(self.nave)
      
   def update(self):
      
      # 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:
               self.nave.speed[1] -= 0.3
            elif event.key == K_DOWN:
               self.nave.speed[1] += 0.3
            elif event.key == K_LEFT:
               self.nave.speed[0] -= 0.3
            elif event.key == K_RIGHT:
               self.nave.speed[0] += 0.3
            elif event.key == K_SPACE:
               self.nave.shoot(self.sprites, self.misiles,\
                self.misil_img, self.misil_sound)
               
            elif event.key == K_ESCAPE:
               print 'Cerrando juego...'
               sys.exit()
               
      # Actualizamos el contador de enemigos aleatorios.
      if self.contador > 0:
         self.contador -= 1
         
      # Generamos los enemigos aleatorios.
      if self.contador == 0:
         self.enemigo = Enemigo(self.enemigo_img)
         self.sprites.add(self.enemigo)
         self.enemigos.add(self.enemigo)
         self.contador = 100
         
      # Comprobamos las colisiones.
      for misil in self.misiles:
         misil.colisiones(self.enemigos)
         
      # Actualizamos los sprites.
      self.sprites.update()
      
   def imprimir(self, screen):
      
      # Actualizamos la pantalla.
      self.sprites.clear(screen, self.fondo)
      self.sprites.draw(screen)
      pygame.display.flip()
   
# ------------------------------
# Función principal
# ------------------------------

def main():
   pygame.init()
   pygame.mixer.init()
   pygame.font.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('Red Giant - Versión en desarrollo')
   icon = pygame.image.load('images/nave.png').convert_alpha()
   pygame.display.set_icon(icon)
   print 'Creando ventana... ¡éxito!'
   
   # 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)
   
   # Lanzamos el menú.
   opciones = [
      ('Jugar', nuevo_juego),
      ('Salir', salir_juego)
      ]
      
   escena = Menu(opciones)
   
   # Bucle principal.
   while True:
      # Actualizamos la escena.
      escena.update()
      escena.imprimir(screen)
      clock.tick(60)
   
if __name__ == "__main__":
   main()


¡Muchas gracias! :D

P.D.: Probablemente sea un fallo tonto, pero llevo un buen rato mirando el código y no descubro porque es. :|
http://liberatumundo.wordpress.com/
Avatar de Usuario
algarafa
 
Mensajes: 135
Registrado: Lun Oct 27, 2008 6:12 pm
Ubicación: España

Re: Juego de batallas espaciales

Notapor Juanxo » Lun Oct 11, 2010 1:53 pm

y estabas en lo cierto... si no me equivoco, creo que te falta el pygame.display.flip al final de Menu.imprimir. Quizás por eso si se muestra cuando cambias de escena, donde si que llamas a esa funcion
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)

Re: Juego de batallas espaciales

Notapor algarafa » Lun Oct 11, 2010 2:37 pm

Si, ahora funcion el menú perfectamente, gracias Juanxo. Lo que funciona a media es la opción Jugar del menú, cuando le doy cambia de escena, porque carga todo lo que le mando que cargue en el init de la escena Game, pero por alguna razón en el bucle principal se sigue acualizando la escena del menú. Supongo que es porque el escena = Game() lo hago dentro de la función y se lo toma como una variablo local de la función. No puedo pasarle argumentos a la función por el menú, ¿alguna sugerencia?

Lamento avasallaros con mis dudas, pero es la primera vez que pongo un menú a un juego y ando muy perdido. ¡Muchas gracias por todo!
http://liberatumundo.wordpress.com/
Avatar de Usuario
algarafa
 
Mensajes: 135
Registrado: Lun Oct 27, 2008 6:12 pm
Ubicación: España

Re: Juego de batallas espaciales

Notapor hugoruscitti » Lun Oct 11, 2010 4:34 pm

Buenas, no pude ver mucho, pero me da la sensación que
el problema podría venir por el uso de la referencia
escena.

Por ejemplo, en la función main aparece este código:

Código: Seleccionar todo
def main(...
   
   [...]

   escena = Menu(opciones)

   # Bucle principal.
   while True:
      # Actualizamos la escena.
      escena.update()
      escena.imprimir(screen)
      clock.tick(60)


Por lo tanto, como escena es una variable local, solo
desde esa parte de código se podría cambiar la referencia.
Es decir, la variable escena siempre será una instancia del
Menú.

Pero, por lo que pude ver mas arriba, hay una función que intenta
cambiar de escena:

Código: Seleccionar todo
# Función para comenzar el nuevo juego.
def nuevo_juego():
   escena = Game(screen)


A simple vista pareciera "querer" cambiar a la referencia
escena del bucle del juego, pero como está dentro de una
función significa otra cosa. Cuando python llama
a esa función genera una referencia nueva (escena) que
es local, y que solamente vive en esa función, así que
genera la escena, la apunta un instante y luego elimina
la escena.

Cuando tu juego regrese al bucle principal, la variable seguirá
apuntando al Menu como antes, no se enterará del cambio...


Una solución rápida al problema es hacer que la variable
escena sea global. Y cada función que quiera acceder
a ella tendrá que decir que es una variable local:

Código: Seleccionar todo
escena = None  # al principio de script

def nuevo_juego():
   global escena
   escena = Game(screen)


def main(...
    [...]
    global escena
    escena = Menu(opciones)


Eso solucionaría el problema, pero no es la única solución, otra
forma es crear un objeto que represente a todo el juego completo, y
poner el bucle principal ahí. De esa forma, ese objeto que representa
a todo el juego puede tener un atributo para apuntar a la
escena y así hacerlo mas seguro. Por ejemplo, ese objeto que
representa todo se podría llamar Mundo, Escenario o Director (por que maneja escenas...):

Código: Seleccionar todo
class Director():

   def __init__(self):
        self.escena = None
        self.cambiar_escena(Menu(opciones))

    def cambiar_escena(self, nueva):
        print "saliendo de la escena", self.escena
        print "y entrando en la escena", escena

        self.escena.terminar()
        self.escena = nueva

    def bucle(self, screen):
        self.escena.update()
        self.escena.imprimir(screen)



Ah... una cosa mas, si haces esta segunda opción, envíale una referencia
al director a cada una de las escenas cuando las generas, así cada
escena puede saltar a otra escena cuando quiera. Por ejemplo:


Código: Seleccionar todo
class Menu():
    def __init__(self, director, opciones):
         self.director = director

    def ir_al_juego(self):
         self.director.cambiar_escena(Juego(self.director))

class Juego()

    def __init__(self, director):
        self.director = director

    def regresar_al_menu(self):
        self.director.cambiar_escena(Menu(self.director))

etc...



Bueno, algunas ideas... si puedo mas tarde veo bien
tu código y te digo con mas exactitud, pero creo (ahora)
que por ahí venía el problema. Coméntanos cualquier cosa...

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

Re: Juego de batallas espaciales

Notapor algarafa » Lun Oct 11, 2010 5:02 pm

¡Ahora funciona perfectamente! Bueno, hoy he aprendido algo más. Al final lo he solucionado haciendo la variable global. Me parece mejor código el del director, pero no tengo pensado que este proyecto sea muy grande, así que lo dejaré para próximos proyectos.No hace falta que te mires el código Hugo, te agradezco mucho tu ayuda. Me voy a dedicar a hacer la escena de los créditos y a mejorar la escena Game.

¡Muchas gracias por todo!
http://liberatumundo.wordpress.com/
Avatar de Usuario
algarafa
 
Mensajes: 135
Registrado: Lun Oct 27, 2008 6:12 pm
Ubicación: España

Re: Juego de batallas espaciales

Notapor algarafa » Mié Oct 27, 2010 12:12 pm

¡Lamento haber estado tanto sin postear! Es que ando de examenes. Pongo una imagen de la nueva "versión" del juego y el link de descarga.

Imagen

https://sites.google.com/site/liberatumundodescargas/red-giant/RedGiant-0.2.tar.gz?attredirects=0&d=1

¡Un saludo!
http://liberatumundo.wordpress.com/
Avatar de Usuario
algarafa
 
Mensajes: 135
Registrado: Lun Oct 27, 2008 6:12 pm
Ubicación: España

Re: Juego de batallas espaciales

Notapor shackra » Dom Nov 07, 2010 3:51 am

cool!, haz hecho mas que yo en "poco" tiempo xD
felicidades, eso me impulsa a terminar (comenzar?) mi juego "ClickMania" :p

pero claro, nunca entendi bien eso de los menus o escenas para los juegos :C, quizas en este post tenga respuesta a mi duda que me atormenta desde hace tiempo :P.
Avatar de Usuario
shackra
 
Mensajes: 308
Registrado: Lun Jun 15, 2009 4:10 pm
Ubicación: Costa Rica

Re: Juego de batallas espaciales

Notapor algarafa » Dom Nov 07, 2010 3:46 pm

shackra escribió:cool!, haz hecho mas que yo en "poco" tiempo xD
felicidades, eso me impulsa a terminar (comenzar?) mi juego "ClickMania" :p

pero claro, nunca entendi bien eso de los menus o escenas para los juegos :C, quizas en este post tenga respuesta a mi duda que me atormenta desde hace tiempo :P.

Jejeje, yo lo que hago para motivarme es ir subiendo mis progresos aquí, en pygame.org y en mi blog. Los comentarios de la gente animan mucho. Pero ahora que estoy de examenes me cuesta sacar el tiempo para mantener mi blog y programar. Aprovecho el post para preguntar una duda.

No se si os habreis dado cuenta de que al controlar la nave y disparar solo se puede pulsar una tecla al mismo tiempo. Es decir no puedes moverte y disparar a la vez. ¿Si compruebo las teclas dentro de nave.update() con pygame.key.get_pressed() en vez de con pygame.event.get() se solucionaría el problema? Más tarde subo unas capturas del progreso del juego ahora cuenta con:

- Navecitas aleatorias que salen en la parte de abajo del menú para darle más vidilla.
- Pantalla de Game Over cuando mueres (muy chula)
- Láser que se cagan los enemigos cuando les enchufas con eso :P

¡Un saludo!
http://liberatumundo.wordpress.com/
Avatar de Usuario
algarafa
 
Mensajes: 135
Registrado: Lun Oct 27, 2008 6:12 pm
Ubicación: España

Re: Juego de batallas espaciales

Notapor endaramiz » Lun Nov 08, 2010 3:59 pm

Lo he mirado bastante rápido así que quizás me equivoco. Pero creo que el problema está en que las comprobaciones están en una secuencia if,elseif... por lo tanto, siempre que se apriete una tecla, no se comprobarán las demás. Una solución sería cambiar cambiar los elseif por if.

Si no se arregla avisa y quizás alguien más pueda echar una mano.

Saludos.
Avatar de Usuario
endaramiz
 
Mensajes: 283
Registrado: Vie Ago 31, 2007 9:25 am
Ubicación: Barcelona

Re: Juego de batallas espaciales

Notapor algarafa » Lun Nov 08, 2010 6:06 pm

No se ha arreglado, pero gracias por tu respuesta endaramiz. A ver si otro se da cuenta del problema. Aprovecho y os pongo las capturas de lo nuevo. El texto del Game Over me quedo demasiado épico :P

Imagen
Imagen
Imagen

¡Un saludo y gracias por la ayuda!
http://liberatumundo.wordpress.com/
Avatar de Usuario
algarafa
 
Mensajes: 135
Registrado: Lun Oct 27, 2008 6:12 pm
Ubicación: España

Re: Juego de batallas espaciales

Notapor shackra » Lun Nov 08, 2010 8:54 pm

algarafa escribió:Imagen


Epico... :O
finalmente en esta versión la nave muere :D, yo descargue la version 0.2 y me di cuenta que la nave no moria xD
Avatar de Usuario
shackra
 
Mensajes: 308
Registrado: Lun Jun 15, 2009 4:10 pm
Ubicación: Costa Rica

Re: Juego de batallas espaciales

Notapor Juanxo » Lun Nov 08, 2010 11:47 pm

buenas rafa:

he estado mirando el código y ahí van mis ideas:

- Creo que endaramiz iba en el buen camino, ya que aunque no es un problema de los elif, si que para otras ocasiones tendrías que tener en cuenta el tema de los eventos excluyentes y cuales son compatibles. Lo único que se me ocurre es que si las pulsas a la vez, solo le de tiempo a generar uno de los dos eventos, por lo que solo se ejecuta uno. Si puedes, prueba a imprimir el tipo del evento cada vez que se crea uno para comprobar si cuando pulsas las dos se crean los dos eventos.

- He intentado ejecutar el código que subiste como enlace, pero me da errores de sintaxis en las clases ( tienes Menu(): en vez de Menu: ). No se si será mi versión o algo, pero a mi esto me tira errores de sintaxis.

- Creo que podrías refactorizar el código de los misiles, y acabar con una sola clase misil, ya que la única diferencia entre ellos es el valor de daño que hacen.

Un saludo y sigue dándole duro al teclado
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)

Re: Juego de batallas espaciales

Notapor algarafa » Mar Nov 09, 2010 7:29 pm

Hola a todos:

Respecto a los errores de sintaxis, es muy extraño eres el primero que me lo comenta. A mi con Python 2.5 y 2.6 me tira genial. ¿Qué versión tienes?

He probado lo que me comenta Juanxo y solo me genera uno de los eventos a la vez, concretamente el último en ser pulsado. Es decir si pulsa K_UP y mientras lo mantengo pulsado pulso K_LEFT solo me genera K_LEFT. No tengo ni idea de porque es así. Por eso comentaba lo de pygame.key.get_pressed() porque lo que hace es generar una lista con las teclas pulsadas y no mirar eventos. ¿Puede alguien aclararme algo sobre esto?

Respecto a lo de unificar los misiles en una sola clas, yo lo veo bien. Lo que hago es pasarle la variable de cuanta vida baja por argumento y listo.

Shackra, cuando corrijamos lo de poder pulsar más de una tecla a la vez ya subo la nueva versión y puedes disfrutar de la pantalla de Game Over :P Además es animada (lo que pasa que ne la imagen no se nota). Primero aparecen las letras en grando y se van alejando hasta quedar como en la imagen, y la nave se está moviendo continuamente.

¡Un saludo y gracias por todo! ;)

P.D.: Ahora entiendo porque los programas vienen en varios archivos de código fuente, quizás debiera plantearme dividir el proyecto en más de un archivo porque buscar algo entre 800 líneas es un calvario XD Menos mal que los editores de texto para programadores ayudan.
http://liberatumundo.wordpress.com/
Avatar de Usuario
algarafa
 
Mensajes: 135
Registrado: Lun Oct 27, 2008 6:12 pm
Ubicación: España

Re: Juego de batallas espaciales

Notapor Juanxo » Mar Nov 09, 2010 7:50 pm

tiene todo el sentido del mundo, por que el evento te avisa solo cuando se pulsa, no cuando ya estaba pulsada. Para ver si esta pulsada cada frame, usa key.get_pressed(). Pero no se si esto te lo arreglará
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)

Re: Juego de batallas espaciales

Notapor algarafa » Sab Nov 13, 2010 9:36 am

Ya he probado lo del pygame.key.get_pressed y efectivamente funciona. Ahora voy a meter también las armas dentro de la clase Nave por que si no cuando disparas aparece el mismo problema de antes. Además así aprovecho y unifico el código de los misiles, supermisiles y los láseres.

¡Gracias por la ayuda!
http://liberatumundo.wordpress.com/
Avatar de Usuario
algarafa
 
Mensajes: 135
Registrado: Lun Oct 27, 2008 6:12 pm
Ubicación: España

Re: Juego de batallas espaciales

Notapor algarafa » Dom Nov 14, 2010 3:54 pm

¡Listo! Ya he hecho todo lo que comentaba en el anterior post. Podeís ver la entrada en la dirección siguiente (también se encuentra ahí el enlace de descarga):

http://liberatumundo.wordpress.com/2010 ... giant-0-3/

¡Un saludo!
http://liberatumundo.wordpress.com/
Avatar de Usuario
algarafa
 
Mensajes: 135
Registrado: Lun Oct 27, 2008 6:12 pm
Ubicación: España

Re: Juego de batallas espaciales

Notapor shackra » Lun Ene 03, 2011 9:20 pm

Chico, deberías considera subir tu juego al grupo de Losersjuegos en gNewBook, la red social libre y alternativa al facebook! ;) si deseas saber un poco mas te recomiendo que visites este post.

un saludo!.

p.s: deberías mejorar el sistema de colisiones de la nave, ya que los misiles chocan con la nave principal en espacios que se suponen vacíos! :p
Avatar de Usuario
shackra
 
Mensajes: 308
Registrado: Lun Jun 15, 2009 4:10 pm
Ubicación: Costa Rica

Re: Juego de batallas espaciales

Notapor algarafa » Jue Ene 06, 2011 12:10 pm

Ya he visto lo del Gnewbook, me pasaré por allí cuando tenga un momento. Respecto a lo del sistema de colisiones, de momento deje el sencillo colliderect porque no se como hacerlo mejor tampoco.

Os traigo la nueva versión. Como explico en el enlace de a continuación es la versión casi final. Espero vuestros comentarios/sugerencias:
http://liberatumundo.wordpress.com/2011/01/06/red-giant-1-0-version-casi-final/

Imagen

¡Un saludo! :wink:
http://liberatumundo.wordpress.com/
Avatar de Usuario
algarafa
 
Mensajes: 135
Registrado: Lun Oct 27, 2008 6:12 pm
Ubicación: España

Re: Juego de batallas espaciales

Notapor kaiser » Jue Ene 06, 2011 2:27 pm

Lo primero es lo primero: enhorabuena! El juego está muy currado, la pantalla de game over es toda una inspiración y la tipografía de RED GIANT me encanta. Además el que exista varios tipos de de enemigos y armas le da mucha calidad, sin embargo siento como que a la nave principal le falta velocidad. Éste tipo de juegos suelen ser muy rápidos y frenéticos, los enemigos cumplen a la perfección son muchos, rápidos y variados, pero la nave principal no está a la altura, los efectos de aceleración están bien para demostrar nivel de programación pero le restan muchísima jugabilidad al juego, la nave se mueve demasiado lenta, le faltan muchos "reflejos" y dispara demasiado despacio para la cantidad de enemigos que hay y lo rápido que se mueven. Esa nave está bien para un juego tipo galaxian donde las naves se mueven en bloque:

Imagen

Pero para un juego tipo space invaders se necesita mucha más agilidad tanto de movimiento como de disparo, en Red Giant me siento casi como un francotirador, calculando velocidades y tiempos, disparando al hueco donde se supone que va a estar la nave cuando mi disparo llegue allí. Un juego de éste estilo tiene que ofrecer un derroche de disparos (como si los láseres fuesen el disparo principal), una nave ágil y una pantalla un poco más grande.

Como posibles mejoras para la siguiente versión, a parte de poder guardar la puntuación, también le daría mucha calidad un sistema de power-up's.

Bugs no he detectado ninguno, pero el supermisil cuando se choca con una nave pequeña la mata y sigue su camino matando a más naves, tal vez lo hallas hecho a propósito o tal vez no, pero creo que sería más interesante que el misil desaparezca al chocar contra la primera nave, así hay que calcular mejor cuando lanzarlo para matar a las supernaves. Por otro lado, en la foto que has colgado, pare que las supernaves tienen una línea trasparente por la cual se transparentan las naves que hay debajo, en éste caso una nave verde, pero eso en el juego no se nota ya que estas atento a otras cosas xD.

En cuanto a la interfaz, el aspecto de la nave principal no parece estar a la altura del aspecto de los enemigos, las vidas creo que quedaría mejor si fuesen naves en vez e muñecos y el contador de puntuación me parece un poco simple, yo lo haría más pequeño, con una tipografía más retro para que tenga un aspecto arcade.

Por último dos sugerencias: prácticamente no se nota cuando te han quitado una vida, yo haría que las naves que chocan contigo exploten para que se note más, y en la pantalla de game over pondría a la nave explotando o dañada o algo así.

Te recomiendo que le eches un vistazo a chromium-bsu, que es un juego muy interesante.

No te tomes nada de ésto como una crítica, solo como la opinión personal de un gamer al que le gustan los juegos rápidos. Como programador solo puedo decirte dos cosas: bravo y ánimo.

Un Saludo!
De la API al IDE y del IDE a la API.
Avatar de Usuario
kaiser
 
Mensajes: 121
Registrado: Mié Nov 24, 2010 7:47 pm
Ubicación: Madrid (España)

Re: Juego de batallas espaciales

Notapor carlostex » Vie Ene 07, 2011 2:05 am

algarafa escribió:Ya he visto lo del Gnewbook, me pasaré por allí cuando tenga un momento. Respecto a lo del sistema de colisiones, de momento deje el sencillo colliderect porque no se como hacerlo mejor tampoco.


Hola, diseñé un sistema de colisiones por polígonos, primero se establece el polígono, y lo que tienes que hacer es ir actualizando el sistema en cada frame, y le puedes consultar al sistema si un objeto colisionó con otro, ahora no me acuerdo muy bien como está, pero lo diseñe para que sea lo mas eficiente, no procesa objetos que están fuera del cuadro, y no recuerdo si implemente una idea que tenía para que no se tenga que evaluar todos los objetos contra todos, para este sistema si vale la pena hacer esa comprobación, pues los cálculos que hace el sistema son con matrices y eso puede quitar tiempo.
Si te interesa te paso las fuentes para que te des una idea, o si lo quieres implementar así te puedo ayudar, el sistema no es especifico del juego para el que lo hice, no debe ser complicado pasarlo a tus estructuras.
El conocimiento de unos es conocimiento de todos.
Avatar de Usuario
carlostex
 
Mensajes: 249
Registrado: Mar Jul 14, 2009 4:13 am
Ubicación: mexico

Re: Juego de batallas espaciales

Notapor shackra » Sab Ene 08, 2011 8:07 pm

creo que las respuestas sobre las colisiones de las naves esta en el siguiente enlace U_U: http://www.losersjuegos.com.ar/_media/referencia/ejemplos/nieve/nieve.tar.gz
Avatar de Usuario
shackra
 
Mensajes: 308
Registrado: Lun Jun 15, 2009 4:10 pm
Ubicación: Costa Rica

Re: Juego de batallas espaciales

Notapor algarafa » Sab Ene 08, 2011 8:48 pm

Muchas gracias a carlostex y a shackra por los aportes sobre las colisiones. Lo más probable es que en este juego no lo implemente, pero para proyectos futuros me alegro de tener la referencia aquí.

Kaiser, no te puedes imaginar cuanto te agradezco una crítica tan completa. La velocidad de la nave, puede que en efecto se vea afectada por los efectos de aceleración. Preguntaré a gente que a jugado a mi juego, y si coinciden con tu opinión, lo modificaré. Lo de la frecuencia de disparo esra simplemente para que fuera más difícil. También por eso le puse el láser, para que hubiera un arma rápida.

Los supermisiles atraviesan a las naves porque me parecio que sería un desperdicio perder un supermisil por una de las naves pequeñas, así que lo que hice fue lo siguiente. Un supermisil baja 3 vidas. Si choca con una nave de 1 vida, la mata y el misil sigue su curso, pero la proxima vez que choque solo podrá bajar 2 vidas. Cuando el supermisil baja las 3 vidas que tiene asignadas, desaparece. Prueba a ver si puedes dar a 3 naves de las normales con un supermisil y verás lo que te digo.

La nave grande, tiene la linea invisible porque seleccione con gimp por color todo el fondo, y pillo también esa zona xD. Los gráficos en general son estos porque son lo que pille por Internet.

El tema power-up's si que me lo ha dicho más gente. Me parece que algo así si que lo implemetaré, una especie de escudo o algo así y recargas de munición y demás.

¡Un saludo! :wink:
http://liberatumundo.wordpress.com/
Avatar de Usuario
algarafa
 
Mensajes: 135
Registrado: Lun Oct 27, 2008 6:12 pm
Ubicación: España

Re: Juego de batallas espaciales

Notapor shackra » Lun Ene 10, 2011 6:56 pm

algarafa escribió:Los supermisiles atraviesan a las naves porque me parecio que sería un desperdicio perder un supermisil por una de las naves pequeñas, así que lo que hice fue lo siguiente. Un supermisil baja 3 vidas. Si choca con una nave de 1 vida, la mata y el misil sigue su curso, pero la proxima vez que choque solo podrá bajar 2 vidas. Cuando el supermisil baja las 3 vidas que tiene asignadas, desaparece. Prueba a ver si puedes dar a 3 naves de las normales con un supermisil y verás lo que te digo.


joder, que violento xD, mejor pon este power-up:

Imagen

así podrás partir el ordenador del jugador por la mitad cuando uses ese power-up xD

edito: agregarle mas código para que parta mas computadoras si se juega en un Cyber Cafe, eso le pondrá mas emoción al juego xD
Avatar de Usuario
shackra
 
Mensajes: 308
Registrado: Lun Jun 15, 2009 4:10 pm
Ubicación: Costa Rica

Re: Juego de batallas espaciales

Notapor danielpuch » Mié Ene 19, 2011 3:48 am

Hola algarafa, primero y antes que nada te felicito por tu juego, muy bien logrado.

Y para un admirador de la galaxian como soy yo, me encantan ver por ahi este tipo de juegos.

Te queria comentar que he jugado un poco en tu juego y noté tambien lo que te comenta Kaiser, la nave principal es un poco lenta
para el juego, no tanto que sea lenta en realidad pero el efecto de aceleracion hace que tarde un poquito en agarrar
velocidad y hace que se sienta lenta.

Creo que ese efecto de aceleracion seria bueno para un juego de repente de carreras, donde un auto va acelerando
y va agarrando velocidad pero no tanto para un juego de este tipo de naves donde la idea es rapidez y destruccion de las naves enemigas.

Igual es un comentario nada mas, la verdad que te felicito por el juego, muy bien logrado y lo seguire jugando
y te comento si noto alguna cosa mas que me parezca importante que sepas. ARRIBA!

Saludos
daniel
Avatar de Usuario
danielpuch
 
Mensajes: 71
Registrado: Mar Ene 11, 2011 10:40 pm
Ubicación: Elizabeth, New Jersey

Re: Juego de batallas espaciales

Notapor algarafa » Dom Ene 23, 2011 7:52 pm

¡De nuevo gracias por los ánimos! Viendo que coincidís en lo de que los efecots de aceleración sobran, he creado una encuesta en mi blog preguntando la opinión a otros lectores (espero recibir algún voto :P). Os dejo el enlace por si quereís votar (se os agradece :D )

http://liberatumundo.wordpress.com/2011 ... red-giant/

¡Un saludo! :wink:
http://liberatumundo.wordpress.com/
Avatar de Usuario
algarafa
 
Mensajes: 135
Registrado: Lun Oct 27, 2008 6:12 pm
Ubicación: España

Re: Juego de batallas espaciales

Notapor algarafa » Sab Ene 29, 2011 6:26 pm

Ya he modificado el marcador de puntos y he añadido la posibilidad de guardar el récord más alto. ¿Era este el aspecto retro al que os referiais?

Imagen

¡Un saludo!

Edito: Acabo de cambiar la tipografía por esta otra, ¿os convence? Si encontráis una tipografía más adecuada, hacedmelo saber por favor.

http://img245.imagevenue.com/img.php?im ... _535lo.jpg
http://liberatumundo.wordpress.com/
Avatar de Usuario
algarafa
 
Mensajes: 135
Registrado: Lun Oct 27, 2008 6:12 pm
Ubicación: España

Re: Juego de batallas espaciales

Notapor algarafa » Lun Jul 25, 2011 10:40 am

Bueno, después de varios meses desaparecido de la faz de la tierra, me ha dado por subir la versión final de este juego. No he corregido el movimiento de la nave porque doy el juego por acabado, me gustaría dedicar mi tiempo a otro proyecto que empezaré junto con el curso 2011-2012. Todavía no se que haré, pero algo se conseguirá XD.

Aquí el link de descarga para la versión final: https://sites.google.com/site/liberatumundodescargas/red-giant/RedGiant-1.1.tar.gz?attredirects=0&d=1

Para correrlo solo hacen falta python y pygame. Ahora unas imágenes de la evolución del juego:

Primer juego de naves que intente hacer, la nave era ese cuadradito (vamos, echadle imaginación :D ):
http://imageshack.us/photo/my-images/195/navere.png/

Este juego cuando comence su desarrollo:
Imagen

Y el juego acabado:
Imagen

Espero que lo disfruteis y que nos leamos por losersjuegos. ¡Un saludo! ;)
http://liberatumundo.wordpress.com/
Avatar de Usuario
algarafa
 
Mensajes: 135
Registrado: Lun Oct 27, 2008 6:12 pm
Ubicación: España

Re: Juego de batallas espaciales

Notapor shackra » Mar Ago 02, 2011 8:24 pm

que genial, una nueva version de tu juegos Red Giant :3
¡excelente trabajo!
Avatar de Usuario
shackra
 
Mensajes: 308
Registrado: Lun Jun 15, 2009 4:10 pm
Ubicación: Costa Rica


Volver a Videojuegos

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados