Ayuda a nuestra heroína Barbarianna, a atravezar las turbulencias del tiempo, y escalar las torres mas peligrosas, mientras peleas con dinosaurios mutantes y persigues al doctor Gero, que ha violado las leyes del tiempo y se ha apoderado de la Commodore 128kb.
*Primero debemos tener JAVA instalado en nuestro sistema operativo. *Segundo clonamos el repositorio y lo abrirmos desde nuestro IDE, por ejemplo Eclipse. *Tercero nos pocisionamos sobre el archivo "src/juego/Juego.java" y ejecutamos el código.
Barbarianna será nuestro personaje principal, ella realizará la mayor cantidad de tareas. Puede saltar, moverse, disparar rayos e ir subiendo de piso en piso hasta conseguir la Commodore Por eso hemos concentrado en vikinga una gran cantidad de atributos que nos permita desarrollar todas estas acciones.
-
Método Dibujar:
-
Para dibujarse, la vikinga solo necesitará 2 parametros (x,y) que la posicionarán en la ubicación definida para el inicio del juego o el respawn.
-
Según la actividad que esté realizando barbariana, se utilizará una imagen distinta de extensión .GIF. Se implementaron imagenes para: saltar, correr, y estar quieta.
-
-
Movimientos:
-
los metodos moverHaciaDerecha y moverHaciaIzquierda, estan delimitados por el entorno, y guardan una variable llamada direccion, que será la que usaremos para ajustar tanto las imagenes de barbarianna, como el sentido del rayo y el escudo.
-
-
Cambio de piso:
-
Según donde esté parada, Barbarianna podrá subir de piso, o caer al piso anterior. Para permitir el movimiento entre dichos pisos, se le ha otorgado a barbarianna una banderaDeSalto y una BanderaDeCaida. Estas funciones nos devolveran true o false segun donde esté parada la vikinga. De activarse puedoSaltar, nuestro personaje tendrá permido saltar hasta el piso siguiente, y si se activa meSaliDelPiso la vikinga caerá hasta chocarse con el piso anterior.
-
-
Vikinga creadora de objetos:
-
La clase disparar genera un nuevo Rayo, dando origen a otro objeto del juego con sus propios atributos y comportamientos. Se origina en la clase barbarianna, porque efectivamente surge de ella. El rayo utilizará como parámetros la posicion x e y de barbarianna y la direccion en la que se está moviendo.
-
-
Peligros para Barbarianna:
-
Se han trabajado 2 choques peligrosos para nuestro personaje en los métodos ChocasteConUnRaptor y chocasteUnLaser. ambos choques son capaces de acabar con una de las vidas de Barbarianna. Por eso en estas funciones incluimos en el argumento al raptor y al laser respectivamente, para poder asi calcular la posición de ambos y detectar la colisión con nuestra vikinga.
-
-
Ganar: recuperasteCommodore es la función que permite a Barbarianna saber si ha llegado a la posición de la Commodore 128kb evaluando una colisión con el objeto. De esta manera habremos logrado el objetivo de nuestra heroina.
-
Protegerse: Barbarianna tiene la posibilidad de utilizar su escudo para evitar los ataques letales de los velociraptors. Para ello se creó una función tuEscudoChocoConUnLaser que devuelve true en caso de que nuestra heroína haya logrado bloquear un ataque raptoriano.
-
Agacharse: Vikinga tiene la facutad de evitar los lasers raptonianos mediante un rápido movimiento.
Nuestros recurrentes y veloces enemigos irán descendiendo ferózmente por los pisos del castillo. Una alteración en la linea temporal hizo que estas temibles criaturas arrojen rayos de sus ojos, y solo podrán ser detenidos por los poderes de nuestra heroína.
-
Movimiento: Los raptors solo pueden moverse de izquierda a derecha, irán rebotando al llegar a los límites del entorno y caerán al llegar al hueco de cada piso. Otra vez, en esta clase, la variable direccion determinará la imagen del raptor y la dirección en la que disparará los lasers.
-
Ataque: Los raptors irán disparando lasers a medida que van descendiendo. estos lasers pueden quitar vidas a la vikinga, y se originarán en la posición del velociraptor, respetando el direccionamiento. De esta manera el Laser pasa a ser otro objeto del juego.
-
Muerte: Aunque estas criaturas sean temibles, un simple rayo de nuestra heroína puede destruirlos. En la funcion chocasteUnRayo se evalúa la posición del raptor y se verifica un posible impacto con el poder de Barbarianna. De darse la colisión, tanto el raptor como el rayo serán puestos en null, es decir, serán destruidos.
Este objeto es creado dentro de la clase Vikinga. Utiliza la posición y direccionamiento de Barbarianna para dibujarse.
-
Utilidad: A esta clase se le evaluará la posición constantemente para verificar si ha colisiónado con otro objeto. por ese motivo no tiene otro comportamiento mas que dibujarse y moverse, hasta chocar y desaparecer.
Son una amenaza constante. Pero a diferencia del velociraptor, pueden ser bloqueados por el escudo mágico de Barbarianna. Este objeto se origina dentro de Velociraptor, y desaparece cuando llega al límite del entorno o cuando el escudo los destruye.
Esta clase brindará chances extras de Ganar. Se mostrará como un corazón en pantalla que aumentará la vida de Barbarianna en 1.
Esta clase, si bien se pensó como un objeto estático, durante el desarrollo se ha convirtido en una clase de referencia. Con el correr de los días se otorgó al piso la función de evaluar el contacto con otro objeto. Esto permitió obtener las posiciones de caída de los raptors y la vikinga, como así también la posición de ascenso, para sortear los distintos niveles.
El objeto mas preciado. Esta clase es estática, no hace nada. Solo se posiciona en el extremo superior izquierdo de la pantalla, y finalizará el juego si Barbarianna logra alcanzarla.
Es la clase donde convergen todos los elementos del programa.
-
Entorno y tick: Es el universo en donde se desarrolla el juego. Aporta todas las funcionalidades necesarias para el entorno gráfico , incluso el texto que se muestra por pantalla.
entorno.cambiarFont("sans", 20, Color.white);
entorno.escribirTexto("Vidas: " + vidas + " Puntos: " + puntaje, entorno.ancho() - 200, 22);Si entorno es el espacio donde se desarrolla el juego, la función tick es la que representará el correr del tiempo
-
Casos especiales: Finalizará el juego en caso de que las vidas de la vikinga disminuyan a 0. O cuando Barbarianna alcance la Commodore 128kb y destruya al Dr Gero.
-
Asignación de teclas:
-
saltar: "w" o "u"
-
lanzar rayo: "space"
-
mover izquierda: "a"
-
mover derecha: "d"
-
bloqueo con escudo: "e"
-
agacharse: "s"
-
-
Eventos: Durante el juego se irán dando diferentes situaciones que se resolverán en esta clase:
-
Puede que la vikinga choque con un raptor. En tal caso la vikinga morirá y reaparecerá en el punto de partida. Las vidas de vikinga se disminuirán en 1
-
Lo mismo ocurrirá si un laser logra impactar en la heroína.
-
Puede un rayo chocar un raptor. Dicho caso significaría la muerte del raptor y la desaparición del rayo. los puntos del jugador se incrementan en 80
-
Puede un laser impactar el escudo de Barbarianna y desintegrarse.
Se han utilizado diferentes métodos para evaluar estos casos. Entre ellos el for each nos ha resultado el ciclo mas práctico y sencillo.
.For each
for (Laser l :laser) { if (l != null){ l.dibujar(entorno); l.mover(entorno); } } for (Laser l : laser){ if (l != null && vikinga.chocasteUnLaser(l)) { vikinga.respawn(); vidas -= 1; } }
-
-
Imagen y sonido:
-
Todas las imagenes se editaron desde la pagina "http:// www.gifgifs.com", esto permitió ajustar el sentido de las imagenes, derecha o izquierda, segun la acción que realizan nuestros personajes. Ademas de esta pagina se utilizó en la edición el programa Photoshop.
-
Sonido: Se los descargó en formato wav y se los editó con el programa "Ableton Live". Ajustando el volumen y la duración
-
Implementación: Se utilizaron las ventajas de la librería Entorno y sus herramientas. Un claro ejemplo de la implementación de imagenes puede observarse en las siguientes sentencias, donde las variables fondo, gameOver y vikingadead se cargan con archivos de extención tanto png como gif.
-
fondo = Herramientas.cargarImagen("fondo.png");
gameOver = Herramientas.cargarImagen("endgame.png");
vikingaLose = Herramientas.cargarImagen("vikingadead.gif");Herramientas.cargarSonido("sounds/risamalvada.wav").start();-
lógica de salto: Se utilizó una función llamada puedoSaltar, que verifica la existencia de un piso sobre la vikinga. En caso de no existir, esta bandera se pondrá en true permitiendo que surta efecto la presión de las teclas "u" o "w", y la vikinga se eleve al siguiente piso. Barbarianna caerá todo el tiempo, a menos que los pisos lo eviten
-
Pisos: Originalmente se diseñaron de forma estática en la clase juego. posteriormente se optó por una clase que permitiera generar un array. Finalmente, Piso acabó teniendo 2 funciones booleanas fundamentales, que nos permitieron construír tanto el descenso de los raptors como el salto de piso de la vikinga.
public boolean puedoSaltar(Piso[] pisos) {
if (y - alto / 2 <= 0){
return false;
}
if (pisos[0].chocasteParteInferiorCon(x, y - alto / 2) || pisos[1].chocasteParteInferiorCon(x, y - alto / 2)
|| pisos[2].chocasteParteInferiorCon(x, y - alto / 2) || pisos[3].chocasteParteInferiorCon(x, y - alto / 2)
||pisos[4].chocasteParteInferiorCon(x, y - alto / 2) || pisos[5].chocasteParteInferiorCon(x, y - alto / 2)){
estaSaltando = false;
return false;
}
return true
}-
Invariantes de representacion: Ha sido necesaria la verificación constante, mediante condicionales, de la existencia de cada uno de los objetos que iban a interactuar en el estado natural de juego. Muchos de los errores que arrojaba eclipse de debieron a estas fallas.
" Cannot invoke "juego.Velociraptor.dibujar(entorno.Entorno)" because "this.raptors[e]" is null at juego.Juego.tick "
Nos parece pertinente utilizar este apartado para exponer nuestras experiencias desde lo grupal.
-
El trabajo con git, nos ha permitido un fácil intercambio de los archivos. Luego de un difícil acercamiento, pudimos comprobar la eficiencia y seguridad que otorga a los proyectos.
-
El tp permitió poner en práctica y en discusión todos los conocimientos adquiridos durante la cursada, brindandonos la oportunidad de profundizar, de forma muy amena, temas que parecían inaccesibles. Descubrimos de esta manera, lo beneficioso que resultan los distintos enfoques sobre un mismo problema.
-
Notamos también como la buena elección de los nombres de las variables, como asi también pensar adecuadamente cada objeto simplifican de una manera increible el algoritmo, y clarifican el camino a la hora de la toma de decisiones.
