viernes, 29 de junio de 2012

Invasión y Batalla

Los muchachos de Invasión y Batalla me hicieron llegar la información sobre el blog de su juego.  Dicho juego será colgado en http://invasionybatalla.blogspot.com/ .  Los integrantes de este equipo son:

  • Amundarain, Darcy
  • Cordoba, Pedro
  • Oropeza, Jesús
  • Obregon, Walter
  • Rodriguez, Jessica
  • Vielma, Lismar
A continuación una captura de pantalla y una breve reseña del videojuego tomada textualmente de su blog:


INVASION Y BATALLA... ES UN VIDEO JUEGO DE ACCION BASADO EN UN PAISAJE NATURAL, LA ESTRATEGIA CONSISTE EN DERRIBAR LOS HELICOPTEROS QUE VAN SOBREVOLANDO EL AREA, PARA ELLO EXISTE UN SOLDADO DE COMBATE QUE DEBE IMPEDIR LA INVASION Y EL BOMBARDEO DE SU TERRITORIO ATACANDO CON SU ARMA PARA TRATAR DE ELIMINAR LA MAYOR CANTIDAD POSIBLE DE HELICÓPTEROS Y BOMBAS QUE VAN DISMUYENDO LA VIDA DEL SOLDADO. MIENTRAS MAS SE ELIMINEN LOS INVASORES SE OBTENDRÁ MAS PUNTAJE Y AUMENTARA DE NIVEL. ES MUY FACIL DE JUGAR, AL EJECUTAR EL VIDEO JUEGO SOLO TIENES QUE PRECIONAR CUALQUIER TECLA PARA EMPEZAR LA DIVERSION. PARA EMPEZAR A DISPARAR SOLO NECESITAS EL MOUSE Y HACER MUCHOS CLIC, Y SI DESEAS SALIR DEL JUEGO SOLO PRECIONA LA TECLA "ESCAPE" 

23 comentarios:

  1. Muy buen trabajo hasta el momento =)Felicidades.

    Porfa, cuando puedan subir parte del código o mas de este maravilloso proyecto lo agregare también en la documentación y en nuestro blog http://pygamesaborvenezolano.tk/, siempre y cuando respetando el tipo de licencias que están usando para el, que espero sea libre ^^ para que todos podamos mejorar el juego o compartirlo

    ResponderEliminar
  2. Hola:

    Como dice Ensor, estamos a la espera del código, aunque sea un demo...

    ResponderEliminar
  3. Hola muchachos:

    El équipo de "Invasión y Batalla" ha colgado el juego para su descarga en el sitio dado arriba. Yo por mi parte descargué el comprimido para revisarlo en casa con más calma...

    ResponderEliminar
  4. hola chicos muy buen juego como hicieron para el direccionamiento de la mira? :)

    ResponderEliminar
  5. Preguntas para el équipo de "Invasión y Batalla"

    Traten de explicar sus respuestas para alguién que esta aprendiendo a usar Python / Pygame desde cero...

    1) Veo que los helicopteros, las bombas, la base y los disparos tienen sus respectivas definiciones de clases que heredan de la clase Sprite de pygame. ¿Para qué sirve el atributo "containers" de la clase pygame.sprite.Sprite?

    2) ¿Para qué definen una instancia "all" de python.sprite.OrderedUpdates()?

    3) ¿Qué son los "sprite groups" (clase pygame.sprite.Groups()) y para qué se usan en los video juegos?

    4) En las siguientes asignaciones (líneas 207-211) de main.py):
    Arma.containers = all
    Base.containers = all
    Tiro.containers = all, disparos
    Helicopter.containers = all, helicopteros
    Bomba.containers = all, bombs
    ¿cómo funcionan las asignaciones con comas ","? ¿Porqué algunas asignaciones usan "," y otras no?

    5) ¿Para qué se usa el módulo "pixelperfect"?
    6) Con respecto a las asignaciones en las líneas 217-218 de main.py, ¿qué es lo que se le está asignando a los identificadores "arma" y "base? ¿Son clases? ¿porqué no se hacen semejantes asignaciones para los helicopteros, las bombas, los disparos, etc.?
    7) ¿Qué diferencia hay entre Arma y Base? ¿Para qué se crean estos como clases distintas?
    8) ¿Sería posible una explicación sobre cada definición de clase (con sus métodos) y como se integran y utilizan estos objetos para lograr el juego?
    9) ¿Cómo es posible la creación de nuevas instancias de helicopteros, bombas, etc. solamente con la invocación de la respectiva clase (por ejemplo: Helicopter(), Bomba(...), etc.)?
    10) ¿Cómo se avanza de nivel y en cual parte del código se hace esto?

    Tengo más preguntas pero no quiero abrumarlos con tantas incógnitas. Recuerden: expliquen todo como si tuviesen al frente a un carajito de 9 años.

    ResponderEliminar
  6. Compañeros buenas tardes disculpen, pude observar en su juego que al disparar y y mover el cursor las balas tienen como un efecto de onda. que utilizaron para hacer tal efecto?

    ResponderEliminar
  7. Hola muchachos... Una pregunta, como hicieron para darle movimiento a los sprites de bombas cuando caian de los helicopteros..?... Gracias de antemano...

    ResponderEliminar
  8. Saludos buenas tardes a todos, empecemos a resolver las dudas! Dando aporte como grupo cada uno de los integrantes de este equipo dio su granito de arena aunque no todos estuvieron directamente involucrados en el código de programación, sin la ayuda de todos este juego no hubiese sido posible.

    Dando respuestas al profesor!

    Rodriguez, Jessica:
    1) Veo que los helicopteros, las bombas, la base y los disparos tienen sus respectivas definiciones de clases que heredan de la clase Sprite de pygame. ¿Para qué sirve el atributo "containers" de la clase pygame.sprite.Sprite?

    El atributo "containers" en español contenedores, contiene valga la redundancia, los objetos visibles del juego, en el caso de la pregunta hace referencia a todos los objetos de colección de cada clase, helicópteros, bombas, base y disparos se hace el llamado al atributo "containers" porque es quien contiene almacenados los sprite de cada clase.

    2) ¿Para qué definen una instancia "all" de python.sprite.OrderedUpdates()?

    Para ser más específicos usaremos las líneas de código:

    all = pygame.sprite.OrderedUpdates()
    helicopteros = pygame.sprite.Group()
    disparos = pygame.sprite.Group()
    bombs = pygame.sprite.Group()

    La instancia all, hace referencia a todo, es decir todo el orden y actualización de los objetos que fueron insertados en el caso sería all = pygame.sprite.OrderedUpdates() mas no python.sprite.OrderedUpdates()

    Se muestran grupos de objetos (sprite) con un orden de actualización.

    ResponderEliminar
  9. Walter Obregon:

    3) ¿Qué son los "sprite groups" (clase pygame.sprite.Groups()) y para qué se usan en los video juegos?

    Los grupos sprite no son más que las imágenes del video juego y groups son los grupos donde se forman el conjunto de imágenes. Entonces “sprite groups” es el conjunto de imágenes usadas por cada clase del juego de forma agrupada, es un contenedor específico de imágenes. En el juego no se usó (clase pygame.sprite.Groups()) como una clase, sino como una función donde se hace llamado al grupo de imágenes de una clase que es diferente.

    4) En las siguientes asignaciones (líneas 207-211) de main.py):
    Arma.containers = all
    Base.containers = all
    Tiro.containers = all, disparos
    Helicopter.containers = all, helicopteros
    Bomba.containers = all, bombs
    ¿cómo funcionan las asignaciones con comas ","? ¿Porqué algunas asignaciones usan "," y otras no?

    Ya conociendo lo que es un contenedor “containers” y haciendo uso de las variables: arma, base, tiro, helicóptero, bomba; cada una denota una asignación distinta ya que el arma y la base están formados por una sola imagen, y tiro, helicopter y bomba están formados también por una sola imagen, pero hace referencia con el atributo all y la “,” a todo el contenido de imágenes de su propia función; las “,” que se usan es para agragar todo el contenido de una variable en ella misma, para ser más claro la variable helicopter contiene varios helicópteros igual que la variable tiro y la variable bomba todos estas usan conjuntos de su grupo “aunque no están especificadas como un grupo” , las variables base y arma están compuestas de manera simple, no poseen ningún otro atributo de asignación.

    5) ¿Para qué se usa el módulo "pixelperfect"?

    El modulo "pixelperfect" es usado para la detección de colisiones, de manera que sean lo más real o precisas posible en python / pygame hay colisiones por área como por ejemplo el uso de una imágenes sin fondo transparente chocando con otra imagen, tomando en cuenta que lo q se desea no es chocar el borde de las imágenes sino el borde contenido dentro de esas imágenes, la otra forma de generar colisión es pixel a pixel que es lo que implementa este módulo, primero se realiza una colisión de área, y luego sino hubo colisión se realiza la detección de colisión por pixeles entre los objetos.

    ResponderEliminar
  10. Oropeza, Jesus

    6) Con respecto a las asignaciones en las líneas 217-218 de main.py, ¿qué es lo que se le está asignando a los identificadores "arma" y "base? ¿Son clases? ¿porqué no se hacen semejantes asignaciones para los helicopteros, las bombas, los disparos, etc.?

    Líneas 217-218
    arma = Arma()
    base = Base()
    Estas no son clases forman parte de una función llamada game.
    A la variable arma (minúscula) se la asigna Arma() ya que esta si es una clase y se iguala el argumento según sea su clase, hay dos tipos de variables “arma” y “Arma” de la misma manera funciona la variable base (minúscula).

    No se hacen las asignaciones a las otras variables porque “arma” , “Arma” y “base” , “Base” no poseen ninguna referencia a otro atributo solo a el mismo y es estático no posee movimiento, cosa distinta sucede con las demás variables.

    ResponderEliminar
  11. Lismar, Vielma

    7) ¿Qué diferencia hay entre Arma y Base? ¿Para qué se crean estos como clases distintas?

    La diferencia principal de esas clases es que Arma es una clase que contiene el objeto de disparo, usando ángulos y condiciones para su movimiento desde un punto fijo.

    La clase Base contiene el objeto, “soldado de batalla” en un punto fijo por lo cual era necesario crear dos clases distintas, y darle la función específica, de manera estructurada.

    ResponderEliminar
  12. Pedro Cordova:

    8) ¿Sería posible una explicación sobre cada definición de clase (con sus métodos) y como se integran y utilizan estos objetos para lograr el juego?

    Todas las clases formadas en el video juego tienen funciones específicas dentro del juego, todas están definidas orientadas a objetos, todos los métodos usados están en función de la librería pygame.
    La clase Arma (léase bien) ya que hay dos variables con el mismo nombre, una hace referencia a la clase y la otra iguala sus argumentos a ella misma, funciona como un puntero, esta contiene la posición en pantalla de la imagen (Arma.png) un ángulo de dirección inicial para el disparo y un sonido propio de disparo. Usa funciones internas a la clase que permiten la rotación en ángulos del arma desde su punto inicial, también contiene funciones precisas como por ejemplo mousebutton = pygame.mouse.get_pressed() que obtiene el estado de los botones del mouse presionados para ejercer el movimiento del arma en posiciones x, y de la pantalla.

    La clase Base contiene la imagen o sprite del soldado de batalla en una posición fija de la pantalla, todo el grupo de imágenes importadas se encuentran alojadas en la carpeta “data”.

    La clase Tiro, contiene la imagen que sale a través del arma, también trabaja con una posición y ángulo inicial y algunas funciones matemáticas que van actualizando los disparos, trabaja en conjunto con la clase Arma, de hecho sus posiciones iniciales son las mismas para que concuerden al momento de correr el juego.

    La clase Helicopter contiene el grupo de sprite que efectúan el movimiento de hélices del helicóptero, son 3 imágenes del mismo tamaño que se van llamando una a una y comparando a su vez en una sola posición. Para que fueran apareciendo aleatoriamente se utilizó ramdon.

    La clase Bomba contiene la referencia a la imagen que cae desde el helicóptero y va disminuyendo la vida del soldado, todas las clases cumplen funciones de actualización en todo el video juego.

    Todos los métodos funcionan integrados al menú o main, claro importando módulos como pixelperfect y data.


    9) ¿Cómo es posible la creación de nuevas instancias de helicopteros, bombas, etc. solamente con la invocación de la respectiva clase (por ejemplo: Helicopter(), Bomba(...), etc.)?

    La manera para el llamado de esas instancias es propia de cada clase usando sus respectivas invocaciones con ramdon, claro todas las clases funcionan en conjunto al finalizar la vida del soldado, automáticamente esas invocaciones de bomba finalizan, si se logran dar cuenta al finalizar el juego siguen apareciendo algunos helicópteros mas no caen bombas.

    ResponderEliminar
  13. Darcy, Amundarain:

    10) ¿Cómo se avanza de nivel y en cual parte del código se hace esto?

    La declaración e inicio del nivel es a partir de la línea 224 donde se inicializan sus valores iniciales y que van incrementando a partir de la línea 244 revisando las colisiones entre los disparos y los helicópteros, también se integran el aumento de nivel en dichas líneas dando valores de incremento al destruir cada helicóptero y cada bomba.

    ResponderEliminar
  14. Buenas Tardes a todos, bueno profesor con respecto a la pregunta 7, la diferencia principal entre esas clases es que Arma es una clase que contiene el objeto de disparo, usando ángulos y condiciones para su movimiento desde desde un punto fijo.La clase Base contiene el objeto "soldado de batalla" en un punto fijo, por el cual era necesario crear dos clases distintas, y darle la función especifica de manera estructurada.

    ResponderEliminar
  15. Buenas tardes, continuando con la pregunta de nuestro compañero oscar le aclaro que no utilizamos ningún efecto más que el propio pygame, la implementación de la velocidad del disparo es la que genera el efecto que tú nombras en líneas de código 108-113.

    espero haber aclarado tu duca oscar y gracias por tu participacion.

    ResponderEliminar
  16. Feliz Verde
    buenas noches muchachos primero que todo muy buen juego :) bien mi pregunta es como le hicieron para colocar una barrita de vida :) y que esta disminuya cada vez que dañen al soldadito

    ResponderEliminar
  17. buenas noches compañeros. Continuando con el tema de la utilización de la pantalla completa ensor menciono esta función pygame.display.toggle_fullscreen () , y yo la probé en el juego en busca del dorado y si funciona; ¿si yo quiero hacer que su juego se vea en pantalla completa, en que parte del código colocaría esa función?.

    ResponderEliminar
  18. Buenas muchachos excelente juego,tengo una pregunta. ¿Como hicieron para que se de el movimiento de hélices del helicóptero?

    ResponderEliminar
  19. buenos días muchachos esta calidad su juego..

    ResponderEliminar
  20. una pregunta muchachos como le hicieron para que al caer las bombas a l suelo te quite vida también..????

    ResponderEliminar
  21. 1) Veo que los helicopteros, las bombas, la base y los disparos tienen sus respectivas definiciones de clases que heredan de la clase Sprite de pygame. ¿Para qué sirve el atributo "containers" de la clase pygame.sprite.Sprite?

    Con respecto a su primera pregunta, el atributo “container” sirve para agrupar los datos de cada clase que se van a utilizar en el juego, por ejemplo:
    En la clase “class Arma” están agrupados varios datos como son: el sonido, la imagen, al angulo, tiempo y posición del Arma dentro de la ventana del juego.



    2) ¿Para qué definen una instancia "all" de python.sprite.OrderedUpdates()?
    Con respecto a la segunda pregunta, hay un pequeño error a su pregunta; no es python.sprite.OrderedUpdates() si no que es pygame.sprite.OrderedUpdates()
    La instancia “all” significa que cada cierto se va a actualizar los datos de cada clases como por ejemplo:
    La clase “Arma.containers = all” hace referencia que se va actualizar todos los datos referente a Arma.

    3) ¿Qué son los "sprite groups" (clase pygame.sprite.Groups()) y para qué se usan en los video juegos?

    Los “sprite groups” son grupos de imágenes que se usaran en el juego que se está diseñando y se usan para llamar un conjunto de imágenes. Por ejemplo:

    helicopteros = pygame.sprite.Group()

    Aquí se hace referencia al conjunto de imágenes que estarán localizados en la clase llamada helicópteros.


    Profesor discúlpenos nuevamente, la verdad es que tuvimos que haber colocado el verdadero autor del juego, la verdad si entendimos el código del juego ya que le cambiamos en algunas partes los colores, las imágenes y similitud con el código original. Esto fue lo que puede responderle, mis compañeros les sabrán responder las otras preguntas.

    ResponderEliminar
  22. Hola muchachos:

    Esbozaré en esta entrada algunas cosas sobre las cuales elaboraré más en "Pygame en dos platos". En teoría, ustedes pueden tener animaciones en un videojuego a punta de puros blit de imagenes. Tendrían que controlar la posición, la dirección y otros atributos de cada elemento animado del videojuego mediante variables separadas. Pero en los video juegos es común tener grupos de elementos muy parecidos o identicos. Por ejemplo, en el juego que presentaron tienen los helicopteros, las balas, las bombas, etc. Para eso son los sprites. Un sprite es una clase que ustedes definen y que hereda de pygame.Sprite(). Mediante el método __init__() de su clase, ustedes fijan los atributos iniciales de la instancia del sprite que estan creando. Cada helicoptero, disparo, etc. en el juego sería una instancia. Mediante el método update (que es estándar para la clase Sprite), ustedes definen como se va a ir actualizando cada instancia del Sprite. En su juego, Bomba, Arma, Helicopter, Tiro y Base son las definiciones de las clases de Sprites. Cuando ustedes invocan por ejemplo: Arma(), Base(), Helicopter(), Bomba(heli.rect.midbottom), están invocando los métodos __init__ correspondientes y efectivamente creando instancias de esos sprites.

    Aparte de todo eso, los sprites son clases muy utiles en los video juegos porque permitiran detectar colisiones entre objetos de una clase y otra. Por ejemplo, los helicopteros "mueren" al ser impactados por los disparos de la base.

    ¿Pero si por ejemplo Bomba(heli.rect.midbottom) devuelve una instancia de Bomba en la posición horizontal del helicoptero que la lanza, porqué no se le asigna una variable a esa nueva instancia? ¿Cómo uno hace referencia a cada comba o helicoptero luego si no lo guarda en una variable? La respuesta a esa pregunta tiene que ver con los famosos containers... Continuará.

    ResponderEliminar