/** * Método que define el comportamiento de la entidad stormtrooper. Es obligatorio para toda * entidad animada. Calculará la ruta más cercana a la fuerza y se moverá hacia ella. En caso de * pasar caer en la misma celda que otro soldado, se quedará inmóvil si ésta está apagada, y se * moverá aleatoriamente a una celda adyacente, si está ardiendo. */ public void actuar() { Orientacion o = super.calcularRuta(); super.mover(o); if (this.getCelda() instanceof Explosion) { boolean ardiendo = ((Explosion) this.getCelda()).isArdiendo(); for (Entidad e : this.getCelda().getEntidades()) { if (e instanceof StormTrooper && e != this) { if (ardiendo) { Random r = new Random(); Celda c = getCelda().getCeldasVecinas().get(r.nextInt(4)); mover(c.getPosicion().adyacencia(c.getPosicion())); } else { super.mover(null); } } } } }
/** * Este método crea la lista de enemigos que deben ser creados en el mapa segun la ronda y el * nivel. * * @param nivel */ public void crearNuevosEnemigos(int cantidad_enemigos) { Cantidad_Enemigos = cantidad_enemigos; if (ColaEnemigos == null) ColaEnemigos = new LinkedList(); else ColaEnemigos.clear(); /* Hago esta copia para no perder la informacion inicial. * Me facilita analizar si cuando se persiste la fabrica * respeta la cantidad al recuperarse. */ int cantidadDeEnemigos = Cantidad_Enemigos; // Itero sobre todas las rondas for (int i = 0; i < niveles_base.length; i++) { /* Aca es donde calculo los enemigos que voy a crear * segun los porsentajes cargados en le array. */ int cant_enemigos_actual = (int) (cantidadDeEnemigos * niveles_base[i]); /* A la cantidad de enemigos total que tengo le * resto los que voy a crear en esta ronda. */ cantidadDeEnemigos = cantidadDeEnemigos - cant_enemigos_actual; Escenario escenario = Escenario.obtenerEscenario(); Posicion aux_pos = new Posicion(escenario.getEntrada()); for (int j = 0; j < cant_enemigos_actual; j++) { /* Uso un random para elegir al azar que enemigo voy * a crear. */ int x = (int) (Math.random() * 4); Enemigo para_crear = (Enemigo) CodigosUtiles.get(String.valueOf(x)); ColaEnemigos.add(para_crear.clone()); } } // Establezco el intervalo entre salidas de enemigos. EL valor 150 fue // puesto para que el intervalo resultante fuera adecuado, es decir si // muy corto ni muy largo intervalo_entre_salidas = 150 / NumeroNivel; }
/** * Act - do whatever the Capitan wants to do. This method is called whenever the 'Act' or 'Run' * button gets pressed in the environment. */ public void act() { if (!pasoAlJugador()) { super.act(); rebota(); } else { Escenario e = (Escenario) getWorld(); Batman i = e.getBatman(); // i.restaSalud(i.getSalud()/2); e.restaNumEnemigos(); getWorld().removeObject(this); } }
/** * ESte método crea uan isntancia de la fabrica de enemigos, a partir de un elemento XML * * @param xmlElement El elemento XML que representa la Fabrica * @return Una instancia de la Fabrica de Enemigos con los datos del XML * @throws InvocationTargetException * @throws IllegalAccessException * @throws InstantiationException * @throws NoSuchMethodException * @throws ClassNotFoundException * @throws IllegalArgumentException * @throws SecurityException */ public static FabricaDeEnemigos recuperar(Element xmlElement) throws SecurityException, IllegalArgumentException, ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException { // Cargo los datos principales del XML int cant_enemigos = Integer.parseInt(xmlElement.getAttributeValue("Cantidad_Enemigos")); int num_nivel = Integer.parseInt(xmlElement.getAttributeValue("Nivel")); // Si no existe instancia crea uan isntancia nueva de la fabrica. if (fabrica == null) fabrica = new FabricaDeEnemigos(cant_enemigos, num_nivel); else { // Si ya existe, le cmabio los valores iniciales a la fabrica. fabrica.Cantidad_Enemigos = cant_enemigos; fabrica.NumeroNivel = num_nivel; fabrica.intervalo_entre_salidas = 150 / num_nivel; } /* * En ambos casos, la cola de enemigos que viene con el constructor no * tiene los enemigos adecuados, por eso la borramos y colocamos los * enemigos del XML */ fabrica.ColaEnemigos.clear(); List Element_List = xmlElement.getChildren(); Iterator it = Element_List.iterator(); while (it.hasNext()) { Element aux = (Element) it.next(); if (aux.getName() == "Enemigo") { Enemigo enemigo = Enemigo.recuperar(aux); fabrica.ColaEnemigos.add(enemigo); } } Escenario escenario = Escenario.obtenerEscenario(); escenario.setCantBichos(fabrica.ColaEnemigos.size() + escenario.getCantBichos()); return fabrica; }
@Override protected void onManagedUpdate(float pSecondsElapsed) { super.onManagedUpdate(pSecondsElapsed); if (!juegoCorriendo) { return; } // Acumular tiempo tiempoEnemigos += pSecondsElapsed; if (tiempoEnemigos > LIMITE_TIEMPO) { // Se cumplió el tiempo tiempoEnemigos = 0; if (LIMITE_TIEMPO > 0.5f) { LIMITE_TIEMPO -= 0.15f; } Sprite spriteEnemigo = cargarSprite( ControlJuego.ANCHO_CAMARA + regionEnemigo.getWidth(), (float) (Math.random() * ControlJuego.ALTO_CAMARA - regionEnemigo.getHeight()) + regionEnemigo.getHeight(), regionEnemigo); Enemigo nuevoEnemigo = new Enemigo(spriteEnemigo); listaEnemigos.add(nuevoEnemigo); attachChild(nuevoEnemigo.getSprite()); Log.i("Tamaño", "Datos: " + listaEnemigos.size()); } // Actualizar cada uno de los listaEnemigos y ver si alguno ya salió de la pantalla for (int i = listaEnemigos.size() - 1; i >= 0; i--) { Enemigo enemigo = listaEnemigos.get(i); enemigo.mover(-10, 0); if (enemigo.getSprite().getX() < -enemigo.getSprite().getWidth()) { detachChild(enemigo.getSprite()); listaEnemigos.remove(enemigo); } // Revisa si choca el personaje con el enemigo if (spritePersonaje.collidesWith(enemigo.getSprite())) { detachChild(enemigo.getSprite()); listaEnemigos.remove(enemigo); energia -= 10; Log.i("ENERGIA", "Energia: " + energia); if (energia <= 0) { juegoCorriendo = false; // Agrega pantalla de fin Sprite spriteFin = new Sprite( ControlJuego.ANCHO_CAMARA / 2, ControlJuego.ALTO_CAMARA / 2, regionFin, actividadJuego.getVertexBufferObjectManager()) { @Override public boolean onAreaTouched( TouchEvent pSceneTouchEvent, float pTouchAreaLocalX, float pTouchAreaLocalY) { if (pSceneTouchEvent.isActionUp()) { onBackKeyPressed(); } return super.onAreaTouched(pSceneTouchEvent, pTouchAreaLocalX, pTouchAreaLocalY); } }; registerTouchArea(spriteFin); attachChild(spriteFin); } } } }