Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Cuadros de texto actualizados

-Ya se pueden usar dos o más cuadros de texto al mismo tiempo.
-Cuadros de texto izq y der se posicionan correctamente.
  • Loading branch information...
commit 9bf296848c364c00562ce82502aa86d5f1d2e901 1 parent 814faab
@Luraguse Luraguse authored
View
125 lumpundform-android/assets/escenas/escenario_1.xml
@@ -1,63 +1,64 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<escenas>
- <escena nombre="101">
- <paso numero="1">
- <accion actor="heroe" objetivo="ir_a" destino="1200" />
- <accion actor="heroe" objetivo="hablar" posicion="izq" destino="600" texto="Lorem ipsum dolor sit amet" />
- </paso>
- <paso numero="2">
- <accion actor="amigo" objetivo="hablar" posicion="der" destino="600" texto="Amigo Hallo Welt2!" />
- </paso>
- <paso numero="3">
- <accion actor="heroe" objetivo="hablar" posicion="izq" destino="600" texto="Hallo Welt!" />
- </paso>
- <paso numero="4">
- <accion actor="heroe" objetivo="hablar" posicion="izq" destino="600" texto="ciao mondo!" />
- <accion actor="heroe" objetivo="teletransportarse" posicionX="200" posicionY="400" />
- </paso>
- <paso numero="5">
- <accion actor="heroe" objetivo="ir_a" destino="1300" />
- </paso>
- <paso numero="5">
- <accion actor="amigo" objetivo="hablar" posicion="der" destino="600" texto="Amigo Hallo Welt5!" />
- </paso>
- </escena>
-
- <escena nombre="102">
- <paso numero="1">
- <accion actor="amigo" objetivo="hablar" posicion="izq" destino="600" texto="Amigo Hola Mundo2!" posicionX="1600" posicionY="400" />
- </paso>
-
- <paso numero="2">
- <accion actor="amigo" objetivo="hablar" posicion="izq" destino="600" texto="Amigo Hello world2!" />
- </paso>
- <paso numero="3">
- <accion actor="amigo" objetivo="hablar" posicion="izq" destino="600" texto="Amigo Hallo Welt2!" />
- </paso>
- <paso numero="4">
- <accion actor="amigo" objetivo="hablar" posicion="izq" destino="600" texto="Amigo ciao mondo2!" />
- </paso>
- <paso numero="5">
- <accion actor="amigo" objetivo="teletransportarse" posicionX="600" posicionY="800" />
- </paso>
- <paso numero="6">
- <accion actor="amigo" objetivo="ir_a" destino="1900"/>
- </paso>
- </escena>
-
- <escena nombre="103">
- <paso numero="1">
- <accion actor="heroe" objetivo="hablar" posicion="izq" destino="600" texto="Hola Mundo3!" />
- </paso>
-
- <paso numero="2">
- <accion actor="heroe" objetivo="hablar" posicion="izq" destino="600" texto="Hello world3!" />
- </paso>
- <paso numero="3">
- <accion actor="heroe" objetivo="hablar" posicion="izq" destino="600" texto="Hallo Welt3!" />
- </paso>
- <paso numero="4">
- <accion actor="heroe" objetivo="hablar" posicion="izq" destino="600" texto="ciao mondo3!" />
- </paso>
- </escena>
+<?xml version="1.0" encoding="UTF-8"?>
+<escenas>
+ <escena nombre="101">
+ <paso numero="1">
+ <accion actor="heroe" objetivo="ir_a" destino="1200" />
+ <accion actor="heroe" objetivo="hablar" posicion="izq" destino="600" texto="Lorem ipsum dolor sit ametl" />
+ <accion actor="amigo" objetivo="hablar" posicion="der" destino="600" texto="Lorem ipsum dolor sit ametl" />
+ </paso>
+ <paso numero="2">
+ <accion actor="amigo" objetivo="hablar" posicion="der" destino="600" texto="Lorem ipsum dolor sit ametl" />
+ </paso>
+ <paso numero="3">
+ <accion actor="heroe" objetivo="hablar" posicion="izq" destino="600" texto="Hallo Welt!" />
+ </paso>
+ <paso numero="4">
+ <accion actor="heroe" objetivo="hablar" posicion="izq" destino="600" texto="ciao mondo!" />
+ <accion actor="heroe" objetivo="teletransportarse" posicionX="200" posicionY="400" />
+ </paso>
+ <paso numero="5">
+ <accion actor="heroe" objetivo="ir_a" destino="1300" />
+ </paso>
+ <paso numero="5">
+ <accion actor="amigo" objetivo="hablar" posicion="der" destino="600" texto="Amigo Hallo Welt5!" />
+ </paso>
+ </escena>
+
+ <escena nombre="102">
+ <paso numero="1">
+ <accion actor="amigo" objetivo="hablar" posicion="izq" destino="600" texto="Amigo Hola Mundo2!" posicionX="1600" posicionY="400" />
+ </paso>
+
+ <paso numero="2">
+ <accion actor="amigo" objetivo="hablar" posicion="izq" destino="600" texto="Amigo Hello world2!" />
+ </paso>
+ <paso numero="3">
+ <accion actor="amigo" objetivo="hablar" posicion="izq" destino="600" texto="Amigo Hallo Welt2!" />
+ </paso>
+ <paso numero="4">
+ <accion actor="amigo" objetivo="hablar" posicion="izq" destino="600" texto="Amigo ciao mondo2!" />
+ </paso>
+ <paso numero="5">
+ <accion actor="amigo" objetivo="teletransportarse" posicionX="600" posicionY="800" />
+ </paso>
+ <paso numero="6">
+ <accion actor="amigo" objetivo="ir_a" destino="1900"/>
+ </paso>
+ </escena>
+
+ <escena nombre="103">
+ <paso numero="1">
+ <accion actor="heroe" objetivo="hablar" posicion="izq" destino="600" texto="Hola Mundo3!" />
+ </paso>
+
+ <paso numero="2">
+ <accion actor="heroe" objetivo="hablar" posicion="izq" destino="600" texto="Hello world3!" />
+ </paso>
+ <paso numero="3">
+ <accion actor="heroe" objetivo="hablar" posicion="izq" destino="600" texto="Hallo Welt3!" />
+ </paso>
+ <paso numero="4">
+ <accion actor="heroe" objetivo="hablar" posicion="izq" destino="600" texto="ciao mondo3!" />
+ </paso>
+ </escena>
</escenas>
View
1,269 lumpundform/src/com/lumpundform/escenario/EscenarioBase.java
@@ -1,636 +1,635 @@
-package com.lumpundform.escenario;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Random;
-
-import com.badlogic.gdx.Gdx;
-import com.badlogic.gdx.graphics.g2d.SpriteBatch;
-import com.badlogic.gdx.graphics.g2d.tiled.TiledObject;
-import com.badlogic.gdx.graphics.g2d.tiled.TiledObjectGroup;
-import com.badlogic.gdx.math.Vector2;
-import com.badlogic.gdx.scenes.scene2d.Actor;
-import com.badlogic.gdx.scenes.scene2d.Stage;
-import com.badlogic.gdx.scenes.scene2d.actions.Actions;
-import com.badlogic.gdx.scenes.scene2d.actions.SequenceAction;
-import com.badlogic.gdx.utils.Array;
-import com.badlogic.gdx.utils.XmlReader;
-import com.badlogic.gdx.utils.XmlReader.Element;
-import com.lumpundform.actores.Heroe;
-import com.lumpundform.actores.Humanoide;
-import com.lumpundform.actores.ObjetoActor;
-import com.lumpundform.actores.Personaje;
-import com.lumpundform.ataques.Ataque;
-import com.lumpundform.ataques.AtaqueEscudo;
-import com.lumpundform.colision.Linea;
-import com.lumpundform.colision.Poligono;
-import com.lumpundform.eventos.Escena;
-import com.lumpundform.eventos.Evento;
-import com.lumpundform.excepciones.ActorNoDefinidoException;
-import com.lumpundform.excepciones.EscenarioSinHeroeException;
-import com.lumpundform.lumpundform.CamaraJuego;
-import com.lumpundform.pociones.PocionBase;
-import com.lumpundform.pociones.PocionMana;
-import com.lumpundform.pociones.PocionVida;
-import com.lumpundform.pociones.Porcentaje;
-import com.lumpundform.utilerias.U;
-
-/**
- * La base para los escenarios, extiende a {@link Stage} y agrega funciones y
- * valores específicos del juego.
- *
- * @author Sergio Valencia & Luis Gutiérrez
- *
- */
-public class EscenarioBase extends Stage {
- private Poligono piso;
- private Random random;
- private Porcentaje porcentajePociones;
- private int contador = 0;
- private boolean heroeMuerto;
-
- private Array<Evento> eventos;
- private Array<Escena> escenas;
-
- private boolean interfazBloqueada = false;
-
- /**
- * Inicializa un nuevo escenario con los datos dados. Se inicializa un nuevo
- * contador aleatorio para las pociones.
- *
- * @param width
- * El ancho del escenario.
- * @param height
- * El alto del escenario.
- * @param stretch
- * Si se debe estirar.
- * @param batch
- * El {@link SpriteBatch} con el que se van a dibujar los
- * {@link Actor}es.
- */
- EscenarioBase(float width, float height, boolean stretch, SpriteBatch batch) {
- super(width, height, stretch, batch);
- eventos = new Array<Evento>();
- random = new Random();
- setPorcentajePociones(new Porcentaje());
- }
-
- @Override
- public void addActor(Actor actor) {
- /**
- * Asigna un ID a todos los {@link ObjetoActor}es agregados al
- * escenario.
- */
- if (ObjetoActor.class.isInstance(actor)) {
- ObjetoActor oa = (ObjetoActor) actor;
- oa.setId(contador++);
- }
- super.addActor(actor);
- }
-
- /**
- * Dibuja las líneas de colisión del piso del escenario y de todos los
- * {@link ObjetoActor}es que se encuentran en el escenario.
- */
- void dibujarLineasColision(CamaraJuego camara) {
- for (ObjetoActor actor : getActores(ObjetoActor.class)) {
- U.dibujarLineasColision(actor.getHitbox(), camara);
- }
-
- U.dibujarLineasColision(getPiso(), camara);
- }
-
- /**
- * Revisa si el {@link Heroe} está colisionando con algún otro
- * {@link Personaje} en el escenario. Marca al {@link Heroe} como
- * colisionando.
- */
- void colisionActores() {
- try {
- Heroe heroe = getHeroe();
- heroe.setColisionActores(false);
-
- for (Personaje personaje : getActores(Personaje.class)) {
- if (personaje.getName() != "heroe" && heroe.getHitbox().estaColisionando(personaje.getHitbox())) {
- heroe.setColisionActores(true);
- break;
- }
- }
- } catch (EscenarioSinHeroeException e) {
- }
- }
-
- /**
- * Revisa si el {@link Heroe} está tocando una {@link PocionBase} para ver
- * si la agarra.
- */
- void colisionPociones() {
- try {
- Heroe heroe = getHeroe();
-
- for (PocionBase pocion : getActores(PocionBase.class)) {
- if (heroe.getHitbox().estaColisionando(pocion.getHitbox())) {
- if (heroe.agarrarPocion(pocion.getTipo())) {
- pocion.remove();
- }
- }
- }
- } catch (EscenarioSinHeroeException e) {
- }
- }
-
- /**
- * Revisa le colisión de los {@link Ataque}s del escenario con los
- * {@link Personaje}s del mismo para hacer daño. Si un ataque choca con un
- * escudo, se destruye sin hacer daño.
- */
- void colisionAtaques() {
- for (Ataque ataque : getActores(Ataque.class)) {
- for (Personaje personaje : getActores(Personaje.class)) {
- if (personaje.isEnemigo() != ataque.getPersonaje().isEnemigo()
- && personaje.getHitbox().estaColisionando(ataque.getHitbox())) {
- if (ataque.isHaceDano()) {
- personaje.quitarVida(ataque.getDano());
- }
- ataque.destruir();
- }
- }
- for (Ataque at : getActores(Ataque.class)) {
- if (AtaqueEscudo.class.isInstance(at)
- && at.getPersonaje().isEnemigo() != ataque.getPersonaje().isEnemigo()
- && at.getHitbox().estaColisionando(ataque.getHitbox())) {
- ataque.destruir();
- }
- }
- }
- }
-
- /**
- * Detecta la colisión de todos los {@link ObjetoActor}es con el piso.
- */
- void colisionPiso() {
- Map<String, Boolean> caidaLibre = new HashMap<String, Boolean>();
-
- for (ObjetoActor actor : getActores(ObjetoActor.class)) {
- caidaLibre.put(actor.getName(), false);
-
- // Datos para cuando va hacia derecha o izquierda
- String puntoColision, puntoColisionTemp;
- String direccionDiagonalDer, direccionDiagonalIzq, direccionLinea;
- if (actor.derecha()) {
- puntoColision = "inf-der";
- puntoColisionTemp = "inf-izq";
- direccionDiagonalDer = "abajo";
- direccionDiagonalIzq = "arriba";
- direccionLinea = "x";
- } else {
- puntoColision = "inf-izq";
- puntoColisionTemp = "inf-der";
- direccionDiagonalDer = "arriba";
- direccionDiagonalIzq = "abajo";
- direccionLinea = "-x";
- }
-
- // Revisa si el actor está en caída libre o si está colisionando
- // alguna de las esquinas de su hitbox para inicializar variables
- Vector2 p = null;
- Float altura = null;
- String direccionDiagonal = null;
- if (!getPiso().estaColisionando(actor.getEsquina("inf-izq"))
- && !getPiso().estaColisionando(actor.getEsquina("inf-der"))) {
- caidaLibre.put(actor.getName(), true);
-
- Vector2 puntoTemp = actor.getEsquina(puntoColisionTemp);
- p = new Vector2(puntoTemp.x, puntoTemp.y - 25);
- altura = actor.getY();
- direccionDiagonal = direccionDiagonalDer;
- } else if (getPiso().estaColisionando(actor.getEsquina(puntoColision))) {
- p = actor.getEsquina(puntoColision);
- altura = actor.getY() + 25;
- direccionDiagonal = direccionDiagonalIzq;
- }
-
- // Saca la línea en la cual se va a posicionar el actor si es
- // necesario
- if (p != null) {
- Linea l = getPiso().linea("arriba", p);
-
- // Posiciona al actor sobre la línea si la linea tiene una
- // pendiente menor a 1
- if (l != null && l.pendiente() != null && l.pendiente() <= 1.0001d && l.yEnX(p) <= altura
- && (l.direccionDiagonal() == direccionDiagonal || l.direccionLinea() == direccionLinea)) {
- caidaLibre.put(actor.getName(), false);
- actor.setY(l.yEnX(p));
- }
- }
-
- // Cambia el estado colisión del actor, asi como teletransportar del
- // héroe
- if (caidaLibre.get(actor.getName())) {
- actor.setColisionPiso(false);
- if (actor.isCaer()) {
- actor.setY(actor.getY() - 5);
- }
- } else {
- actor.setColisionPiso(true);
- if (actor.getName() == "heroe") {
- actor.setTeletransportar(false);
- }
- }
- }
- }
-
- /**
- * Limita las posiciones de los {@link ObjetoActor}es del escenario para que
- * no se salgan del mismo.
- *
- * @param width
- * El ancho del {@link EscenarioBase}.
- */
- void acomodarActores(float width) {
-
- for (Personaje personaje : getActores(Personaje.class)) {
- if (personaje.getEsquina("inf-izq").x < 0)
- personaje.setEsquinaX("inf-izq", 0.0f);
- if (personaje.getEsquina("inf-der").x > width)
- personaje.setEsquinaX("inf-izq", (width - personaje.getHitbox().getAncho()));
-
- // Detecta colisión con paredes
- Vector2 pc = null;
- String lineaLateral;
- Double yPunto = null;
- if (personaje.derecha()) {
- pc = personaje.getEsquina("inf-der");
- lineaLateral = "izquierda";
- yPunto = Math.floor(pc.y);
- } else {
- pc = personaje.getEsquina("inf-izq");
- lineaLateral = "derecha";
- yPunto = Math.floor(pc.y) + 10.0f;
- }
-
- if (getPiso().estaColisionando(pc) && getPiso().linea("arriba", pc).esHorizontal()
- && getPiso().linea(lineaLateral, pc).esVertical()
- && yPunto < Math.floor(getPiso().linea("arriba", pc).yEnX(pc))) {
- Linea linea = getPiso().linea(lineaLateral, pc);
- if (linea != null) {
- Float xLinea = null;
- if (lineaLateral == "izquierda") {
- xLinea = linea.xEnY(pc) - personaje.getHitbox().getAncho() - 1;
- } else {
- xLinea = linea.xEnY(pc) + 1;
- }
- personaje.setEsquinaX("inf-izq", xLinea);
- }
- }
- }
- }
-
- /**
- * Acomoda al {@link Heroe} para que no se salga de la {@link CamaraJuego}.
- */
- void acomodarHeroe() {
- try {
- CamaraJuego camara = U.getCamara();
- float min = camara.getPosicionOrigen().x;
- float max = camara.getPosicionOrigen().x + camara.viewportWidth;
- Heroe heroe = getHeroe();
- if (heroe.getEsquina("inf-izq").x < min)
- heroe.setEsquinaX("inf-izq", min);
- if (heroe.getEsquina("inf-der").x > max)
- heroe.setEsquinaX("inf-izq", (max - heroe.getHitbox().getAncho()));
- } catch (EscenarioSinHeroeException e) {
- }
- }
-
- /**
- * Carga todos los eventos al {@link EscenarioBase} que se encuentran el
- * archivo .tmx.
- *
- * @param tog
- * El {@link TiledObjectGroup} donde se encuentran todos los
- * eventos.
- */
- void cargarEventos(TiledObjectGroup tog) {
- for (TiledObject to : tog.objects) {
- eventos.add(new Evento(U.voltearCoordenadas(to.x, to.y), to, this));
- }
- }
-
- /**
- * Revisa todos los eventos del {@link EscenarioBase} para ver si se
- * ejecutan.
- */
- void revisarEventos() {
- try {
- for (int i = 0; i < eventos.size; i++) {
- eventos.get(i).revisarEvento(getHeroe());
- }
- } catch (EscenarioSinHeroeException e) {
- }
- }
-
- /**
- * Carga todas las {@link Escena}s del escenario especificado.
- *
- * @param escenario
- * El nombre del escenario del cual cargar las escenas.
- */
- void cargarEscenas(String escenario) {
- escenas = new Array<Escena>();
-
- XmlReader xmlF;
- String xmlS;
- Element xmlE;
-
- xmlF = new XmlReader();
- xmlS = Gdx.files.internal("escenas/escenario_" + escenario + ".xml").readString();
- xmlE = xmlF.parse(xmlS);
-
- Array<Element> escena = xmlE.getChildrenByNameRecursively("escena");
-
- for (Element e : escena) {
- escenas.add(new Escena(e, e.get("nombre")));
- }
- }
-
- /**
- * @param nombre
- * El nombre de la {@link Escena} a buscar.
- * @return La {@link Escena} con el nombre dado o <code>null</code> si no se
- * encontró.
- */
- public Escena getEscena(String nombre) {
- for (Escena escena : escenas) {
- if (escena.getNombre().equals(nombre))
- return escena;
- }
- return null;
- }
-
- /**
- * Agrega a un actor sin evento.
- *
- * @param tipo
- * @param posicion
- * @see #agregarActor(String, Vector2, String)
- */
- void agregarActor(String tipo, Vector2 posicion) {
- agregarActor(tipo, posicion, "");
- }
-
- /**
- * Agrega un actor al {@link EscenarioBase} en la posición y del tipo
- * especificado. También se inicializa el evento al que pertenece.
- *
- * @param tipo
- * El tipo de {@link ObjetoActor} a agregar.
- * @param posicion
- * La posición en donde agregarlo.
- * @param evento
- * El evento al que pertenece el {@link ObjetoActor}. Si no
- * pertenece a ningún evento, pasar <code>""</code>.
- */
- public void agregarActor(String tipo, Vector2 posicion, String evento) {
- Personaje actor;
- if (tipo == "heroe") {
- actor = new Heroe(posicion);
- setHeroeMuerto(false);
- } else if (tipo == "humanoide") {
- actor = new Humanoide("amigo", posicion);
- } else if (tipo == "enemigo") {
- actor = new Humanoide("amigo", posicion);
- actor.setEnemigo(true);
- } else {
- throw new ActorNoDefinidoException("El Actor " + tipo + " no esta definido");
- }
- actor.setPerteneceAEvento(evento);
- addActor(actor);
- }
-
- /**
- * Regresa al {@link Heroe} del escenario.
- *
- * @return El héroe.
- * @throws EscenarioSinHeroeException
- * Cuando el {@link EscenarioBase} no tiene {@link Heroe}.
- */
- public Heroe getHeroe() throws EscenarioSinHeroeException {
- List<Heroe> actores = getActores(Heroe.class);
- if (actores.size() == 0) {
- throw new EscenarioSinHeroeException("No hay héroe en el escenario.");
- } else {
- return actores.get(0);
- }
- }
-
- /**
- * Busca a todos los actores dentro del escenario de la clase dada.
- *
- * @param <T>
- * La clase a buscar. Tiene que heredar de {@link Actor}.
- * @param clase
- * Llamar .class de la clase
- * @return Una lista de los actores tipo <T>.
- */
- public <T extends Actor> List<T> getActores(Class<T> clase) {
- @SuppressWarnings("unchecked")
- Iterator<T> i = (Iterator<T>) getActors().iterator();
- List<T> actores = new ArrayList<T>();
- while (i.hasNext()) {
- T actor = i.next();
- if (clase.isInstance(actor)) {
- actores.add(actor);
- }
- }
- return actores;
- }
-
- /**
- * Quita todos los ataques que no están dentro de la vista de la
- * {@link CamaraJuego}.
- */
- void destruirAtaques() {
- CamaraJuego camara = U.getCamara();
- for (Ataque ataque : getActores(Ataque.class)) {
- if ((ataque.getX() + ataque.getWidth()) < camara.getPosicionOrigen().x
- || ataque.getX() > (camara.getPosicionOrigen().x + camara.viewportWidth)) {
- ataque.quitar();
- }
- }
- }
-
- /**
- * Busca el {@link Evento} del nombre dado.
- *
- * @param nombreEvento
- * El nombre del {@link Evento}.
- * @return El {@link Evento} encontrado o null si no se encontró.
- */
- public Evento getEvento(String nombreEvento) {
- for (Evento evento : eventos) {
- if (evento.getNombre().equals(nombreEvento)) {
- return evento;
- }
- }
- return null;
- }
-
- /**
- * Crea una {@link PocionBase} si cumple las condiciones de probabilidad.
- *
- * @param posicion
- * La posición de la poción de ser creada.
- */
- public void crearPocion(Vector2 posicion) {
- if (random.nextFloat() < getPorcentajePociones().getValor()) {
- if (random.nextBoolean()) {
- addActor(new PocionVida(posicion));
- } else {
- addActor(new PocionMana(posicion));
- }
- getPorcentajePociones().reset();
- } else {
- getPorcentajePociones().aumentar();
- }
- }
-
- /**
- * Continúa la conversación del evento con nombre <code>nombre</code>.
- *
- * @param nombre
- * El nombre del {@link Evento}.
- */
- public void continuarConversacionActual(String nombre) {
- for (Evento evento : eventos) {
- if (evento.getNombre().equals(nombre)) {
- evento.continuarConversacionEnEscena();
- }
- }
- }
-
- /**
- * Hace un toggle del UI. Si está visible, la esconde, si no, la muestra.
- */
- public void toggleUI() {
- for (Actor actor : getActors()) {
- if (actor.getClass().getSimpleName().contains("Boton")
- || actor.getClass().getSimpleName().contains("Barra")) {
- if (actor.isVisible()) {
- SequenceAction sequence = new SequenceAction();
- sequence.addAction(Actions.fadeOut(0.30f));
- sequence.addAction(Actions.delay(0.30f));
- sequence.addAction(Actions.hide());
- actor.addAction(sequence);
- } else {
- SequenceAction sequence = new SequenceAction();
- sequence.addAction(Actions.show());
- sequence.addAction(Actions.fadeIn(0.30f));
- actor.addAction(sequence);
- }
- }
- }
- }
-
- /**
- * Esconde o muestra la UI.
- *
- * @param setVisible
- * Si se va a esconder o a mostrar.
- */
- public void esconderUI(boolean setVisible) {
- for (Actor actor : getActors()) {
- if (actor.getClass().getSimpleName().contains("Boton")
- || actor.getClass().getSimpleName().contains("Barra")) {
- if (!setVisible) {
- SequenceAction sequence = new SequenceAction();
- sequence.addAction(Actions.fadeOut(0.30f));
- sequence.addAction(Actions.delay(0.30f));
- sequence.addAction(Actions.hide());
- actor.addAction(sequence);
- } else {
- SequenceAction sequence = new SequenceAction();
- sequence.addAction(Actions.show());
- sequence.addAction(Actions.fadeIn(0.30f));
- actor.addAction(sequence);
- }
- }
- }
- }
-
- /**
- * Busca o crea un {@link Actor} en posición 0,0.
- *
- * @param nombreActor
- * @return
- * @see #getActor(String, Vector2)
- */
- @SuppressWarnings("javadoc")
- public ObjetoActor getActor(String nombreActor) {
- return getActor(nombreActor, new Vector2(0, 0));
- }
-
- /**
- * Busca al {@link Actor} del nombre dado. Si no lo encuentra crea uno nuevo
- * en la posición especificada y lo regresa.
- *
- * @param nombreActor
- * El nombre del {@link Actor}.
- * @param posicion
- * La posición donde crearlo de no existir.
- * @return El {@link Actor} encontrado o creado.
- */
- public ObjetoActor getActor(String nombreActor, Vector2 posicion) {
- ObjetoActor personaje = null;
- for (ObjetoActor personajeTemporal : getActores(ObjetoActor.class)) {
- if (personajeTemporal.getName().equals(nombreActor)) {
- personaje = personajeTemporal;
- break;
- }
- }
- if (personaje == null) {
- addActor(new Humanoide(nombreActor, posicion));
- personaje = (Personaje) getActor(nombreActor);
- }
- return personaje;
- }
-
- public Poligono getPiso() {
- return piso;
- }
-
- public void setPiso(Poligono piso) {
- this.piso = piso;
- }
-
- public Porcentaje getPorcentajePociones() {
- return porcentajePociones;
- }
-
- public void setPorcentajePociones(Porcentaje porcentajePociones) {
- this.porcentajePociones = porcentajePociones;
- }
-
- public Array<Evento> getEventos() {
- return eventos;
- }
-
- public boolean isHeroeMuerto() {
- return heroeMuerto;
- }
-
- public void setHeroeMuerto(boolean heroeMuerto) {
- this.heroeMuerto = heroeMuerto;
- }
-
- public boolean getInterfazBloqueada() {
- return interfazBloqueada;
- }
-
- public void setInterfazBloqueada(boolean bloquear) {
- this.interfazBloqueada = bloquear;
- }
+package com.lumpundform.escenario;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+
+import com.badlogic.gdx.Gdx;
+import com.badlogic.gdx.graphics.g2d.SpriteBatch;
+import com.badlogic.gdx.graphics.g2d.tiled.TiledObject;
+import com.badlogic.gdx.graphics.g2d.tiled.TiledObjectGroup;
+import com.badlogic.gdx.math.Vector2;
+import com.badlogic.gdx.scenes.scene2d.Actor;
+import com.badlogic.gdx.scenes.scene2d.Stage;
+import com.badlogic.gdx.scenes.scene2d.actions.Actions;
+import com.badlogic.gdx.scenes.scene2d.actions.SequenceAction;
+import com.badlogic.gdx.utils.Array;
+import com.badlogic.gdx.utils.XmlReader;
+import com.badlogic.gdx.utils.XmlReader.Element;
+import com.lumpundform.actores.Heroe;
+import com.lumpundform.actores.Humanoide;
+import com.lumpundform.actores.ObjetoActor;
+import com.lumpundform.actores.Personaje;
+import com.lumpundform.ataques.Ataque;
+import com.lumpundform.ataques.AtaqueEscudo;
+import com.lumpundform.colision.Linea;
+import com.lumpundform.colision.Poligono;
+import com.lumpundform.eventos.Escena;
+import com.lumpundform.eventos.Evento;
+import com.lumpundform.excepciones.ActorNoDefinidoException;
+import com.lumpundform.excepciones.EscenarioSinHeroeException;
+import com.lumpundform.lumpundform.CamaraJuego;
+import com.lumpundform.pociones.PocionBase;
+import com.lumpundform.pociones.PocionMana;
+import com.lumpundform.pociones.PocionVida;
+import com.lumpundform.pociones.Porcentaje;
+import com.lumpundform.utilerias.U;
+
+/**
+ * La base para los escenarios, extiende a {@link Stage} y agrega funciones y
+ * valores específicos del juego.
+ *
+ * @author Sergio Valencia & Luis Gutiérrez
+ *
+ */
+public class EscenarioBase extends Stage {
+ private Poligono piso;
+ private Random random;
+ private Porcentaje porcentajePociones;
+ private int contador = 0;
+ private boolean heroeMuerto;
+
+ private Array<Evento> eventos;
+ private Array<Escena> escenas;
+
+ private boolean interfazBloqueada = false;
+
+ /**
+ * Inicializa un nuevo escenario con los datos dados. Se inicializa un nuevo
+ * contador aleatorio para las pociones.
+ *
+ * @param width
+ * El ancho del escenario.
+ * @param height
+ * El alto del escenario.
+ * @param stretch
+ * Si se debe estirar.
+ * @param batch
+ * El {@link SpriteBatch} con el que se van a dibujar los
+ * {@link Actor}es.
+ */
+ EscenarioBase(float width, float height, boolean stretch, SpriteBatch batch) {
+ super(width, height, stretch, batch);
+ eventos = new Array<Evento>();
+ random = new Random();
+ setPorcentajePociones(new Porcentaje());
+ }
+
+ @Override
+ public void addActor(Actor actor) {
+ /**
+ * Asigna un ID a todos los {@link ObjetoActor}es agregados al
+ * escenario.
+ */
+ if (ObjetoActor.class.isInstance(actor)) {
+ ObjetoActor oa = (ObjetoActor) actor;
+ oa.setId(contador++);
+ }
+ super.addActor(actor);
+ }
+
+ /**
+ * Dibuja las líneas de colisión del piso del escenario y de todos los
+ * {@link ObjetoActor}es que se encuentran en el escenario.
+ */
+ void dibujarLineasColision(CamaraJuego camara) {
+ for (ObjetoActor actor : getActores(ObjetoActor.class)) {
+ U.dibujarLineasColision(actor.getHitbox(), camara);
+ }
+
+ U.dibujarLineasColision(getPiso(), camara);
+ }
+
+ /**
+ * Revisa si el {@link Heroe} está colisionando con algún otro
+ * {@link Personaje} en el escenario. Marca al {@link Heroe} como
+ * colisionando.
+ */
+ void colisionActores() {
+ try {
+ Heroe heroe = getHeroe();
+ heroe.setColisionActores(false);
+
+ for (Personaje personaje : getActores(Personaje.class)) {
+ if (personaje.getName() != "heroe" && heroe.getHitbox().estaColisionando(personaje.getHitbox())) {
+ heroe.setColisionActores(true);
+ break;
+ }
+ }
+ } catch (EscenarioSinHeroeException e) {
+ }
+ }
+
+ /**
+ * Revisa si el {@link Heroe} está tocando una {@link PocionBase} para ver
+ * si la agarra.
+ */
+ void colisionPociones() {
+ try {
+ Heroe heroe = getHeroe();
+
+ for (PocionBase pocion : getActores(PocionBase.class)) {
+ if (heroe.getHitbox().estaColisionando(pocion.getHitbox())) {
+ if (heroe.agarrarPocion(pocion.getTipo())) {
+ pocion.remove();
+ }
+ }
+ }
+ } catch (EscenarioSinHeroeException e) {
+ }
+ }
+
+ /**
+ * Revisa le colisión de los {@link Ataque}s del escenario con los
+ * {@link Personaje}s del mismo para hacer daño. Si un ataque choca con un
+ * escudo, se destruye sin hacer daño.
+ */
+ void colisionAtaques() {
+ for (Ataque ataque : getActores(Ataque.class)) {
+ for (Personaje personaje : getActores(Personaje.class)) {
+ if (personaje.isEnemigo() != ataque.getPersonaje().isEnemigo()
+ && personaje.getHitbox().estaColisionando(ataque.getHitbox())) {
+ if (ataque.isHaceDano()) {
+ personaje.quitarVida(ataque.getDano());
+ }
+ ataque.destruir();
+ }
+ }
+ for (Ataque at : getActores(Ataque.class)) {
+ if (AtaqueEscudo.class.isInstance(at)
+ && at.getPersonaje().isEnemigo() != ataque.getPersonaje().isEnemigo()
+ && at.getHitbox().estaColisionando(ataque.getHitbox())) {
+ ataque.destruir();
+ }
+ }
+ }
+ }
+
+ /**
+ * Detecta la colisión de todos los {@link ObjetoActor}es con el piso.
+ */
+ void colisionPiso() {
+ Map<String, Boolean> caidaLibre = new HashMap<String, Boolean>();
+
+ for (ObjetoActor actor : getActores(ObjetoActor.class)) {
+ caidaLibre.put(actor.getName(), false);
+
+ // Datos para cuando va hacia derecha o izquierda
+ String puntoColision, puntoColisionTemp;
+ String direccionDiagonalDer, direccionDiagonalIzq, direccionLinea;
+ if (actor.derecha()) {
+ puntoColision = "inf-der";
+ puntoColisionTemp = "inf-izq";
+ direccionDiagonalDer = "abajo";
+ direccionDiagonalIzq = "arriba";
+ direccionLinea = "x";
+ } else {
+ puntoColision = "inf-izq";
+ puntoColisionTemp = "inf-der";
+ direccionDiagonalDer = "arriba";
+ direccionDiagonalIzq = "abajo";
+ direccionLinea = "-x";
+ }
+
+ // Revisa si el actor está en caída libre o si está colisionando
+ // alguna de las esquinas de su hitbox para inicializar variables
+ Vector2 p = null;
+ Float altura = null;
+ String direccionDiagonal = null;
+ if (!getPiso().estaColisionando(actor.getEsquina("inf-izq"))
+ && !getPiso().estaColisionando(actor.getEsquina("inf-der"))) {
+ caidaLibre.put(actor.getName(), true);
+
+ Vector2 puntoTemp = actor.getEsquina(puntoColisionTemp);
+ p = new Vector2(puntoTemp.x, puntoTemp.y - 25);
+ altura = actor.getY();
+ direccionDiagonal = direccionDiagonalDer;
+ } else if (getPiso().estaColisionando(actor.getEsquina(puntoColision))) {
+ p = actor.getEsquina(puntoColision);
+ altura = actor.getY() + 25;
+ direccionDiagonal = direccionDiagonalIzq;
+ }
+
+ // Saca la línea en la cual se va a posicionar el actor si es
+ // necesario
+ if (p != null) {
+ Linea l = getPiso().linea("arriba", p);
+
+ // Posiciona al actor sobre la línea si la linea tiene una
+ // pendiente menor a 1
+ if (l != null && l.pendiente() != null && l.pendiente() <= 1.0001d && l.yEnX(p) <= altura
+ && (l.direccionDiagonal() == direccionDiagonal || l.direccionLinea() == direccionLinea)) {
+ caidaLibre.put(actor.getName(), false);
+ actor.setY(l.yEnX(p));
+ }
+ }
+
+ // Cambia el estado colisión del actor, asi como teletransportar del
+ // héroe
+ if (caidaLibre.get(actor.getName())) {
+ actor.setColisionPiso(false);
+ if (actor.isCaer()) {
+ actor.setY(actor.getY() - 5);
+ }
+ } else {
+ actor.setColisionPiso(true);
+ if (actor.getName() == "heroe") {
+ actor.setTeletransportar(false);
+ }
+ }
+ }
+ }
+
+ /**
+ * Limita las posiciones de los {@link ObjetoActor}es del escenario para que
+ * no se salgan del mismo.
+ *
+ * @param width
+ * El ancho del {@link EscenarioBase}.
+ */
+ void acomodarActores(float width) {
+
+ for (Personaje personaje : getActores(Personaje.class)) {
+ if (personaje.getEsquina("inf-izq").x < 0)
+ personaje.setEsquinaX("inf-izq", 0.0f);
+ if (personaje.getEsquina("inf-der").x > width)
+ personaje.setEsquinaX("inf-izq", (width - personaje.getHitbox().getAncho()));
+
+ // Detecta colisión con paredes
+ Vector2 pc = null;
+ String lineaLateral;
+ Double yPunto = null;
+ if (personaje.derecha()) {
+ pc = personaje.getEsquina("inf-der");
+ lineaLateral = "izquierda";
+ yPunto = Math.floor(pc.y);
+ } else {
+ pc = personaje.getEsquina("inf-izq");
+ lineaLateral = "derecha";
+ yPunto = Math.floor(pc.y) + 10.0f;
+ }
+
+ if (getPiso().estaColisionando(pc) && getPiso().linea("arriba", pc).esHorizontal()
+ && getPiso().linea(lineaLateral, pc).esVertical()
+ && yPunto < Math.floor(getPiso().linea("arriba", pc).yEnX(pc))) {
+ Linea linea = getPiso().linea(lineaLateral, pc);
+ if (linea != null) {
+ Float xLinea = null;
+ if (lineaLateral == "izquierda") {
+ xLinea = linea.xEnY(pc) - personaje.getHitbox().getAncho() - 1;
+ } else {
+ xLinea = linea.xEnY(pc) + 1;
+ }
+ personaje.setEsquinaX("inf-izq", xLinea);
+ }
+ }
+ }
+ }
+
+ /**
+ * Acomoda al {@link Heroe} para que no se salga de la {@link CamaraJuego}.
+ */
+ void acomodarHeroe() {
+ try {
+ CamaraJuego camara = U.getCamara();
+ float min = camara.getPosicionOrigen().x;
+ float max = camara.getPosicionOrigen().x + camara.viewportWidth;
+ Heroe heroe = getHeroe();
+ if (heroe.getEsquina("inf-izq").x < min)
+ heroe.setEsquinaX("inf-izq", min);
+ if (heroe.getEsquina("inf-der").x > max)
+ heroe.setEsquinaX("inf-izq", (max - heroe.getHitbox().getAncho()));
+ } catch (EscenarioSinHeroeException e) {
+ }
+ }
+
+ /**
+ * Carga todos los eventos al {@link EscenarioBase} que se encuentran el
+ * archivo .tmx.
+ *
+ * @param tog
+ * El {@link TiledObjectGroup} donde se encuentran todos los
+ * eventos.
+ */
+ void cargarEventos(TiledObjectGroup tog) {
+ for (TiledObject to : tog.objects) {
+ eventos.add(new Evento(U.voltearCoordenadas(to.x, to.y), to, this));
+ }
+ }
+
+ /**
+ * Revisa todos los eventos del {@link EscenarioBase} para ver si se
+ * ejecutan.
+ */
+ void revisarEventos() {
+ try {
+ for (int i = 0; i < eventos.size; i++) {
+ eventos.get(i).revisarEvento(getHeroe());
+ }
+ } catch (EscenarioSinHeroeException e) {
+ }
+ }
+
+ /**
+ * Carga todas las {@link Escena}s del escenario especificado.
+ *
+ * @param escenario
+ * El nombre del escenario del cual cargar las escenas.
+ */
+ void cargarEscenas(String escenario) {
+ escenas = new Array<Escena>();
+
+ XmlReader xmlF;
+ String xmlS;
+ Element xmlE;
+
+ xmlF = new XmlReader();
+ xmlS = Gdx.files.internal("escenas/escenario_" + escenario + ".xml").readString();
+ xmlE = xmlF.parse(xmlS);
+
+ Array<Element> escena = xmlE.getChildrenByNameRecursively("escena");
+
+ for (Element e : escena) {
+ escenas.add(new Escena(e, e.get("nombre")));
+ }
+ }
+
+ /**
+ * @param nombre
+ * El nombre de la {@link Escena} a buscar.
+ * @return La {@link Escena} con el nombre dado o <code>null</code> si no se
+ * encontró.
+ */
+ public Escena getEscena(String nombre) {
+ for (Escena escena : escenas) {
+ if (escena.getNombre().equals(nombre))
+ return escena;
+ }
+ return null;
+ }
+
+ /**
+ * Agrega a un actor sin evento.
+ *
+ * @param tipo
+ * @param posicion
+ * @see #agregarActor(String, Vector2, String)
+ */
+ void agregarActor(String tipo, Vector2 posicion) {
+ agregarActor(tipo, posicion, "");
+ }
+
+ /**
+ * Agrega un actor al {@link EscenarioBase} en la posición y del tipo
+ * especificado. También se inicializa el evento al que pertenece.
+ *
+ * @param tipo
+ * El tipo de {@link ObjetoActor} a agregar.
+ * @param posicion
+ * La posición en donde agregarlo.
+ * @param evento
+ * El evento al que pertenece el {@link ObjetoActor}. Si no
+ * pertenece a ningún evento, pasar <code>""</code>.
+ */
+ public void agregarActor(String tipo, Vector2 posicion, String evento) {
+ Personaje actor;
+ if (tipo == "heroe") {
+ actor = new Heroe(posicion);
+ setHeroeMuerto(false);
+ } else if (tipo == "humanoide") {
+ actor = new Humanoide("amigo", posicion);
+ } else if (tipo == "enemigo") {
+ actor = new Humanoide("amigo", posicion);
+ actor.setEnemigo(true);
+ } else {
+ throw new ActorNoDefinidoException("El Actor " + tipo + " no esta definido");
+ }
+ actor.setPerteneceAEvento(evento);
+ addActor(actor);
+ }
+
+ /**
+ * Regresa al {@link Heroe} del escenario.
+ *
+ * @return El héroe.
+ * @throws EscenarioSinHeroeException
+ * Cuando el {@link EscenarioBase} no tiene {@link Heroe}.
+ */
+ public Heroe getHeroe() throws EscenarioSinHeroeException {
+ List<Heroe> actores = getActores(Heroe.class);
+ if (actores.size() == 0) {
+ throw new EscenarioSinHeroeException("No hay héroe en el escenario.");
+ } else {
+ return actores.get(0);
+ }
+ }
+
+ /**
+ * Busca a todos los actores dentro del escenario de la clase dada.
+ *
+ * @param <T>
+ * La clase a buscar. Tiene que heredar de {@link Actor}.
+ * @param clase
+ * Llamar .class de la clase
+ * @return Una lista de los actores tipo <T>.
+ */
+ public <T extends Actor> List<T> getActores(Class<T> clase) {
+ @SuppressWarnings("unchecked")
+ Iterator<T> i = (Iterator<T>) getActors().iterator();
+ List<T> actores = new ArrayList<T>();
+ while (i.hasNext()) {
+ T actor = i.next();
+ if (clase.isInstance(actor)) {
+ actores.add(actor);
+ }
+ }
+ return actores;
+ }
+
+ /**
+ * Quita todos los ataques que no están dentro de la vista de la
+ * {@link CamaraJuego}.
+ */
+ void destruirAtaques() {
+ CamaraJuego camara = U.getCamara();
+ for (Ataque ataque : getActores(Ataque.class)) {
+ if ((ataque.getX() + ataque.getWidth()) < camara.getPosicionOrigen().x
+ || ataque.getX() > (camara.getPosicionOrigen().x + camara.viewportWidth)) {
+ ataque.quitar();
+ }
+ }
+ }
+
+ /**
+ * Busca el {@link Evento} del nombre dado.
+ *
+ * @param nombreEvento
+ * El nombre del {@link Evento}.
+ * @return El {@link Evento} encontrado o null si no se encontró.
+ */
+ public Evento getEvento(String nombreEvento) {
+ for (Evento evento : eventos) {
+ if (evento.getNombre().equals(nombreEvento)) {
+ return evento;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Crea una {@link PocionBase} si cumple las condiciones de probabilidad.
+ *
+ * @param posicion
+ * La posición de la poción de ser creada.
+ */
+ public void crearPocion(Vector2 posicion) {
+ if (random.nextFloat() < getPorcentajePociones().getValor()) {
+ if (random.nextBoolean()) {
+ addActor(new PocionVida(posicion));
+ } else {
+ addActor(new PocionMana(posicion));
+ }
+ getPorcentajePociones().reset();
+ } else {
+ getPorcentajePociones().aumentar();
+ }
+ }
+
+ /**
+ * Continúa la conversación del evento con nombre <code>nombre</code>.
+ *
+ * @param nombre
+ * El nombre del {@link Evento}.
+ */
+ public void continuarConversacionActual(String nombre) {
+ for (Evento evento : eventos) {
+ if (evento.getNombre().equals(nombre))
+ evento.continuarConversacionEnEscena();
+ }
+ }
+
+ /**
+ * Hace un toggle del UI. Si está visible, la esconde, si no, la muestra.
+ */
+ public void toggleUI() {
+ for (Actor actor : getActors()) {
+ if (actor.getClass().getSimpleName().contains("Boton")
+ || actor.getClass().getSimpleName().contains("Barra")) {
+ if (actor.isVisible()) {
+ SequenceAction sequence = new SequenceAction();
+ sequence.addAction(Actions.fadeOut(0.30f));
+ sequence.addAction(Actions.delay(0.30f));
+ sequence.addAction(Actions.hide());
+ actor.addAction(sequence);
+ } else {
+ SequenceAction sequence = new SequenceAction();
+ sequence.addAction(Actions.show());
+ sequence.addAction(Actions.fadeIn(0.30f));
+ actor.addAction(sequence);
+ }
+ }
+ }
+ }
+
+ /**
+ * Esconde o muestra la UI.
+ *
+ * @param setVisible
+ * Si se va a esconder o a mostrar.
+ */
+ public void esconderUI(boolean setVisible) {
+ for (Actor actor : getActors()) {
+ if (actor.getClass().getSimpleName().contains("Boton")
+ || actor.getClass().getSimpleName().contains("Barra")) {
+ if (!setVisible) {
+ SequenceAction sequence = new SequenceAction();
+ sequence.addAction(Actions.fadeOut(0.30f));
+ sequence.addAction(Actions.delay(0.30f));
+ sequence.addAction(Actions.hide());
+ actor.addAction(sequence);
+ } else {
+ SequenceAction sequence = new SequenceAction();
+ sequence.addAction(Actions.show());
+ sequence.addAction(Actions.fadeIn(0.30f));
+ actor.addAction(sequence);
+ }
+ }
+ }
+ }
+
+ /**
+ * Busca o crea un {@link Actor} en posición 0,0.
+ *
+ * @param nombreActor
+ * @return
+ * @see #getActor(String, Vector2)
+ */
+ @SuppressWarnings("javadoc")
+ public ObjetoActor getActor(String nombreActor) {
+ return getActor(nombreActor, new Vector2(0, 0));
+ }
+
+ /**
+ * Busca al {@link Actor} del nombre dado. Si no lo encuentra crea uno nuevo
+ * en la posición especificada y lo regresa.
+ *
+ * @param nombreActor
+ * El nombre del {@link Actor}.
+ * @param posicion
+ * La posición donde crearlo de no existir.
+ * @return El {@link Actor} encontrado o creado.
+ */
+ public ObjetoActor getActor(String nombreActor, Vector2 posicion) {
+ ObjetoActor personaje = null;
+ for (ObjetoActor personajeTemporal : getActores(ObjetoActor.class)) {
+ if (personajeTemporal.getName().equals(nombreActor)) {
+ personaje = personajeTemporal;
+ break;
+ }
+ }
+ if (personaje == null) {
+ addActor(new Humanoide(nombreActor, posicion));
+ personaje = (Personaje) getActor(nombreActor);
+ }
+ return personaje;
+ }
+
+ public Poligono getPiso() {
+ return piso;
+ }
+
+ public void setPiso(Poligono piso) {
+ this.piso = piso;
+ }
+
+ public Porcentaje getPorcentajePociones() {
+ return porcentajePociones;
+ }
+
+ public void setPorcentajePociones(Porcentaje porcentajePociones) {
+ this.porcentajePociones = porcentajePociones;
+ }
+
+ public Array<Evento> getEventos() {
+ return eventos;
+ }
+
+ public boolean isHeroeMuerto() {
+ return heroeMuerto;
+ }
+
+ public void setHeroeMuerto(boolean heroeMuerto) {
+ this.heroeMuerto = heroeMuerto;
+ }
+
+ public boolean getInterfazBloqueada() {
+ return interfazBloqueada;
+ }
+
+ public void setInterfazBloqueada(boolean bloquear) {
+ this.interfazBloqueada = bloquear;
+ }
}
View
287 lumpundform/src/com/lumpundform/eventos/Escena.java
@@ -1,145 +1,144 @@
-package com.lumpundform.eventos;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import com.badlogic.gdx.math.Vector2;
-import com.badlogic.gdx.utils.Array;
-import com.badlogic.gdx.utils.XmlReader.Element;
-import com.lumpundform.actores.ObjetoActor.Direccion;
-import com.lumpundform.actores.Personaje;
-import com.lumpundform.escenario.EscenarioBase;
-import com.lumpundform.interfaz.CuadroTexto;
-import com.lumpundform.utilerias.U;
-
-public class Escena {
-
- // Elementos de la escena
- private Array<Paso> pasos = new Array<Paso>();
- private String nombre;
- private int paso = 0;
- private boolean terminado = false;
-
- private EscenarioBase escenario;
-
- // Cuadros de texto
- Map<String, CuadroTexto> cuadrosTexto = new HashMap<String, CuadroTexto>();
-
- public Escena(Element escena, String nombreEscena) {
- crearPasos(escena.getChildrenByNameRecursively("paso"));
- this.nombre = nombreEscena;
- }
-
- private void crearPasos(Array<Element> pasos) {
- for (int i = 0; i < pasos.size; i++) {
- this.pasos.add(new Paso(pasos.get(i)));
- }
- }
-
- public void ejecutarEscena(EscenarioBase escenario) {
- this.escenario = escenario;
- revisarPasos();
- }
-
- private void revisarPasos() {
- if (paso < pasos.size) {
- revisarAcciones(pasos.get(paso));
- } else {
- terminado = true;
- }
- }
-
- private void revisarAcciones(Paso paso) {
- if (accionesTerminadas(paso)) {
- ejecutarAcciones(paso);
- } else {
- siguientePaso();
- }
- }
-
- private void ejecutarAcciones(Paso paso) {
- for (int i = 0; i < paso.acciones.size; i++) {
- if (!paso.acciones.get(i).getTerminado()) {
- ejecutarAccion(paso.acciones.get(i), (Personaje) escenario.getActor(paso.acciones.get(i)
- .getNombreActor(), paso.acciones.get(i).getPosicion()));
- }
- }
- }
-
- private void ejecutarAccion(Accion accion, Personaje personaje) {
- if (accion.getObjetivo().equals("hablar"))
- hablar(accion, personaje);
- else if (accion.getObjetivo().equals("ir_a"))
- caminar(accion.getDestino(), accion, personaje);
- else if (accion.getObjetivo().equals("teletransportarse"))
- teletransportarse(accion.getPosicion(), accion, personaje);
- }
-
- private void siguientePaso() {
- this.paso++;
- }
-
- private boolean accionesTerminadas(Paso paso) {
- for (int i = 0; i < paso.acciones.size; i++) {
- if (!paso.acciones.get(i).getTerminado())
- return true;
- }
- return false;
- }
-
- // Acciones para las escenas
-
- private void hablar(Accion accion, Personaje personaje) {
- if (!accion.getTerminado()) {
- if (!cuadrosTexto.containsKey(personaje.getName())) {
- U.l("dir", accion.getPosicionTexto());
- CuadroTexto tempCT = new CuadroTexto(accion.getPosicionTexto());
- tempCT.setTexto(accion.getTexto());
- cuadrosTexto.put(personaje.getName(), tempCT);
- }
- }
- dibujarTexto(personaje.getName());
- }
-
- private void caminar(float destino, Accion accion, Personaje personaje) {
-
- if (!accion.getTerminado()) {
- personaje.setDestinoX(destino);
- personaje.setDireccionDestinoX(Direccion.DERECHA);
- personaje.moverDestino();
- }
- if ((personaje.getDestinoX() > personaje.getX() && personaje.getDireccionDestinoX() == Direccion.IZQUIERDA)
- || (personaje.getDestinoX() < personaje.getX() && personaje.getDireccionDestinoX() == Direccion.DERECHA))
- accion.terminar();
- }
-
- private void teletransportarse(Vector2 pos, Accion accion, Personaje personaje) {
- personaje.habilidad("teletransportar", pos);
- accion.terminar();
- }
-
- public String getNombre() {
- return nombre;
- }
-
- public boolean getTerminada() {
- return terminado;
- }
-
- public void continuarConversacion() {
- Paso pasoActual = getPasoActual();
- if (pasoActual != null && pasoActual.tieneAccionHablar())
- pasoActual.terminarAccionHablar();
- }
-
- private Paso getPasoActual() {
- if (paso < pasos.size)
- return pasos.get(paso);
- return null;
- }
-
- private void dibujarTexto(String nombrePersonaje) {
- CuadroTexto ct = cuadrosTexto.get(nombrePersonaje);
- ct.draw();
- }
+package com.lumpundform.eventos;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import com.badlogic.gdx.math.Vector2;
+import com.badlogic.gdx.utils.Array;
+import com.badlogic.gdx.utils.XmlReader.Element;
+import com.lumpundform.actores.ObjetoActor.Direccion;
+import com.lumpundform.actores.Personaje;
+import com.lumpundform.escenario.EscenarioBase;
+import com.lumpundform.interfaz.CuadroTexto;
+import com.lumpundform.utilerias.U;
+
+public class Escena {
+
+ // Elementos de la escena
+ private Array<Paso> pasos = new Array<Paso>();
+ private String nombre;
+ private int paso = 0;
+ private boolean terminado = false;
+
+ private EscenarioBase escenario;
+
+ // Cuadros de texto
+ Map<String, CuadroTexto> cuadrosTexto = new HashMap<String, CuadroTexto>();
+
+ public Escena(Element escena, String nombreEscena) {
+ crearPasos(escena.getChildrenByNameRecursively("paso"));
+ this.nombre = nombreEscena;
+ }
+
+ private void crearPasos(Array<Element> pasos) {
+ for (int i = 0; i < pasos.size; i++) {
+ this.pasos.add(new Paso(pasos.get(i)));
+ }
+ }
+
+ public void ejecutarEscena(EscenarioBase escenario) {
+ this.escenario = escenario;
+ revisarPasos();
+ }
+
+ private void revisarPasos() {
+ if (paso < pasos.size) {
+ revisarAcciones(pasos.get(paso));
+ } else {
+ terminado = true;
+ }
+ }
+
+ private void revisarAcciones(Paso paso) {
+ if (accionesTerminadas(paso)) {
+ ejecutarAcciones(paso);
+ } else {
+ siguientePaso();
+ }
+ }
+
+ private void ejecutarAcciones(Paso paso) {
+ for (int i = 0; i < paso.acciones.size; i++) {
+ if (!paso.acciones.get(i).getTerminado()) {
+ ejecutarAccion(paso.acciones.get(i), (Personaje) escenario.getActor(paso.acciones.get(i)
+ .getNombreActor(), paso.acciones.get(i).getPosicion()));
+ }
+ }
+ }
+
+ private void ejecutarAccion(Accion accion, Personaje personaje) {
+ if (accion.getObjetivo().equals("hablar"))
+ hablar(accion, personaje);
+ else if (accion.getObjetivo().equals("ir_a"))
+ caminar(accion.getDestino(), accion, personaje);
+ else if (accion.getObjetivo().equals("teletransportarse"))
+ teletransportarse(accion.getPosicion(), accion, personaje);
+ }
+
+ private void siguientePaso() {
+ this.paso++;
+ }
+
+ private boolean accionesTerminadas(Paso paso) {
+ for (int i = 0; i < paso.acciones.size; i++) {
+ if (!paso.acciones.get(i).getTerminado())
+ return true;
+ }
+ return false;
+ }
+
+ // Acciones para las escenas
+
+ private void hablar(Accion accion, Personaje personaje) {
+ if (!accion.getTerminado()) {
+ if (!cuadrosTexto.containsKey(personaje.getName())) {
+ U.l("dir", accion.getPosicionTexto());
+ CuadroTexto tempCT = new CuadroTexto(accion.getPosicionTexto());
+ tempCT.setTexto(accion.getTexto());
+ cuadrosTexto.put(personaje.getName(), tempCT);
+ }
+ }
+ dibujarTexto(personaje.getName());
+ }
+
+ private void caminar(float destino, Accion accion, Personaje personaje) {
+
+ if (!accion.getTerminado()) {
+ personaje.setDestinoX(destino);
+ personaje.setDireccionDestinoX(Direccion.DERECHA);
+ personaje.moverDestino();
+ }
+ if ((personaje.getDestinoX() > personaje.getX() && personaje.getDireccionDestinoX() == Direccion.IZQUIERDA)
+ || (personaje.getDestinoX() < personaje.getX() && personaje.getDireccionDestinoX() == Direccion.DERECHA))
+ accion.terminar();
+ }
+
+ private void teletransportarse(Vector2 pos, Accion accion, Personaje personaje) {
+ personaje.habilidad("teletransportar", pos);
+ accion.terminar();
+ }
+
+ public String getNombre() {
+ return nombre;
+ }
+
+ public boolean getTerminada() {
+ return terminado;
+ }
+
+ public void continuarConversacion() {
+ Paso pasoActual = getPasoActual();
+ if (pasoActual != null && pasoActual.tieneAccionHablar())
+ pasoActual.terminarAccionHablar();
+ }
+
+ private Paso getPasoActual() {
+ if (paso < pasos.size)
+ return pasos.get(paso);
+ return null;
+ }
+
+ private void dibujarTexto(String nombrePersonaje) {
+ cuadrosTexto.get(nombrePersonaje).draw();
+ }
}
View
104 lumpundform/src/com/lumpundform/eventos/Paso.java
@@ -1,53 +1,53 @@
-package com.lumpundform.eventos;
-
-import com.badlogic.gdx.utils.Array;
-import com.badlogic.gdx.utils.XmlReader.Element;
-
-public class Paso {
- Array<Accion> acciones = new Array<Accion>();
- private int accionAEjecutar = 0;
-
- public Paso(Element paso) {
- crearAcciones(paso.getChildrenByNameRecursively("accion"));
- }
-
- private void crearAcciones(Array<Element> paso) {
- for (int i = 0; i < paso.size; i++) {
- acciones.add(new Accion(paso.get(i)));
- }
- }
-
- public int getAccionAEjecutar() {
- return accionAEjecutar;
- }
-
- public void siguienteAccion() {
- accionAEjecutar++;
- }
-
- public boolean tieneAccionHablar() {
- for (int i = 0; i < acciones.size; i++) {
- Accion accion = acciones.get(i);
- if (accion.getObjetivo().equals("hablar") && !accion.getTerminado()) {
- return true;
- }
- }
- return false;
- }
-
- public void terminarAccionHablar() {
- Accion accionHablar = getAccionHablar();
- if (accionHablar != null)
- accionHablar.terminar();
- }
-
- private Accion getAccionHablar() {
- for (int i = 0; i < acciones.size; i++) {
- Accion accion = acciones.get(i);
- if (accion.getObjetivo().equals("hablar")) {
- return accion;
- }
- }
- return null;
- }
+package com.lumpundform.eventos;
+
+import com.badlogic.gdx.utils.Array;
+import com.badlogic.gdx.utils.XmlReader.Element;
+
+public class Paso {
+ Array<Accion> acciones = new Array<Accion>();
+ private int accionAEjecutar = 0;
+
+ public Paso(Element paso) {
+ crearAcciones(paso.getChildrenByNameRecursively("accion"));
+ }
+
+ private void crearAcciones(Array<Element> paso) {
+ for (int i = 0; i < paso.size; i++) {
+ acciones.add(new Accion(paso.get(i)));
+ }
+ }
+
+ public int getAccionAEjecutar() {
+ return accionAEjecutar;
+ }
+
+ public void siguienteAccion() {
+ accionAEjecutar++;
+ }
+
+ public boolean tieneAccionHablar() {
+ for (int i = 0; i < acciones.size; i++) {
+ Accion accion = acciones.get(i);
+ if (accion.getObjetivo().equals("hablar") && !accion.getTerminado()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public void terminarAccionHablar() {
+ Array<Accion> accionesHablar = getAccionesHablar();
+ for (Accion accion : accionesHablar) {
+ accion.terminar();
+ }
+ }
+
+ private Array<Accion> getAccionesHablar() {
+ Array<Accion> acciones = new Array<Accion>();
+ for (Accion accion : this.acciones) {
+ if(accion.getObjetivo().equals("hablar"))
+ acciones.add(accion);
+ }
+ return acciones;
+ }
}
View
176 lumpundform/src/com/lumpundform/interfaz/CuadroTexto.java
@@ -1,86 +1,92 @@
-package com.lumpundform.interfaz;
-
-import com.badlogic.gdx.Gdx;
-import com.badlogic.gdx.graphics.Texture;
-import com.badlogic.gdx.graphics.g2d.BitmapFont;
-import com.badlogic.gdx.graphics.g2d.NinePatch;
-import com.badlogic.gdx.graphics.g2d.SpriteBatch;
-import com.lumpundform.utilerias.Fuentes;
-
-public class CuadroTexto {
- private NinePatch np = new NinePatch(new Texture(Gdx.files.internal("texturas/ct.png")), 3,
- 3, 3, 3);
-
- private static BitmapFont bmf = Fuentes.regular();
-
- private Texture retrato = new Texture(Gdx.files.internal("personajes/samus_portrait.png"));
-
- private SpriteBatch batch = new SpriteBatch();
-
- public Boolean dibujar = true;
-
- public float posicionX;
- private float posicionY = 400.0f;
- private float anchoCuadro = 300.0f;
- private float altoCuadro = 60.0f;
- private float paddingX = 10.0f;
- private float paddingY = 5.0f;
- private float posicionRetratoX;
-
- public boolean terminado = false;
- public boolean continuar = false;
-
-
- public int index = 0;
-
- public String texto;
- public String newstr = "";
-
- public CuadroTexto(String posicion) {
- if(posicion == "der") {
- this.posicionX = Gdx.graphics.getWidth() - this.anchoCuadro - 10.0f;
- this.posicionRetratoX = (posicionX - paddingX);
- } else {
- this.posicionX = 10.0f;
- this.posicionRetratoX = (posicionX + (anchoCuadro - retrato.getWidth() - paddingX));
- }
- }
-
- public void setTexto(String texto) {
- this.texto = texto;
- }
-
- public void setX(float x) {
- this.posicionX = x;
- }
-
- public void setY(float y) {
- this.posicionY = y;
- }
-
- public void setWidth(float width) {
- this.anchoCuadro = width;
- }
-
- public void setHeight(float height) {
- this.altoCuadro = height;
- }
-
- public void setPaddingX(float paddingX) {
- this.paddingX = paddingX;
- }
-
- public void setPaddingY(float paddingY) {
- this.paddingY = paddingY;
- }
-
- public void draw() {
- batch.begin();
- np.draw(batch, posicionX, posicionY, anchoCuadro, altoCuadro);
- bmf.setColor(1.0f, 1.0f, 1.0f, 1.0f);
- bmf.setScale(0.50f);
- bmf.drawWrapped(batch, texto, (posicionX + paddingX), (posicionY + altoCuadro - paddingY), (anchoCuadro - paddingX - retrato.getWidth()));
- batch.draw(retrato, posicionRetratoX, (posicionY + (altoCuadro - retrato.getHeight() - paddingY)), retrato.getWidth(), retrato.getHeight());
- batch.end();
- }
+package com.lumpundform.interfaz;
+
+import com.badlogic.gdx.Gdx;
+import com.badlogic.gdx.graphics.Texture;
+import com.badlogic.gdx.graphics.g2d.BitmapFont;
+import com.badlogic.gdx.graphics.g2d.NinePatch;
+import com.badlogic.gdx.graphics.g2d.SpriteBatch;
+import com.lumpundform.utilerias.Fuentes;
+import com.lumpundform.utilerias.U;
+
+public class CuadroTexto {
+ private NinePatch np = new NinePatch(new Texture(Gdx.files.internal("texturas/ct.png")), 3,
+ 3, 3, 3);
+
+ private static BitmapFont bmf = Fuentes.regular();
+
+ private Texture retrato = new Texture(Gdx.files.internal("personajes/samus_portrait.png"));
+
+ private SpriteBatch batch = new SpriteBatch();
+
+ public Boolean dibujar = true;
+
+ public float posicionX;
+ private float posicionY = 400.0f;
+ private float anchoCuadro = 300.0f;
+ private float altoCuadro = 60.0f;
+ private float paddingX = 7.0f;
+ private float paddingY = 5.0f;
+ private float posicionTextoX;
+ private float posicionRetratoX;
+
+ public boolean terminado = false;
+ public boolean continuar = false;
+
+
+ public int index = 0;
+
+ public String texto;
+ public String newstr = "";
+
+
+ public CuadroTexto(String posicion) {
+ if(posicion.equals("der")) {
+ this.posicionX = Gdx.graphics.getWidth() - this.anchoCuadro - 10.0f;
+ this.posicionRetratoX = (posicionX + paddingX);
+ this.posicionTextoX = posicionX + (paddingX * 2) + retrato.getWidth();
+
+ } else {
+ this.posicionX = 10.0f;
+ this.posicionRetratoX = (posicionX + (anchoCuadro - retrato.getWidth() - paddingX));
+ this.posicionTextoX = posicionX + paddingX;
+ }
+ }
+
+ public void setTexto(String texto) {
+ this.texto = texto;
+ }
+
+ public void setX(float x) {
+ this.posicionX = x;
+ }
+
+ public void setY(float y) {
+ this.posicionY = y;
+ }
+
+ public void setWidth(float width) {
+ this.anchoCuadro = width;
+ }
+
+ public void setHeight(float height) {
+ this.altoCuadro = height;
+ }
+
+ public void setPaddingX(float paddingX) {
+ this.paddingX = paddingX;
+ }
+
+ public void setPaddingY(float paddingY) {
+ this.paddingY = paddingY;
+ }
+
+ public void draw() {
+ batch.begin();
+ np.draw(batch, posicionX, posicionY, anchoCuadro, altoCuadro);
+ bmf.setColor(1.0f, 1.0f, 1.0f, 1.0f);
+ bmf.setScale(0.50f);
+ bmf.drawWrapped(batch, texto, posicionTextoX, (posicionY + altoCuadro - paddingY), (anchoCuadro - (paddingX * 2) - retrato.getWidth()));
+ batch.draw(retrato, posicionRetratoX, (posicionY + (altoCuadro - retrato.getHeight() - paddingY)), retrato.getWidth(), retrato.getHeight());
+ batch.end();
+ }
}
Please sign in to comment.
Something went wrong with that request. Please try again.