/** * Este método calcula la distancia manhattan de la pos de este agente y de otro agente pasandolo * como Csight * * @param position * @param sight * @return */ protected double distanciaManhattan(Vector3D position, CSight sight) { // la clase CSight tiene un método getDistance(), preguntar que distancia es esa? double distancia = Math.abs(position.x - sight.getPosition().x) + Math.abs(position.y - sight.getPosition().y) + Math.abs(position.z - sight.getPosition().z); return distancia; }
protected CSight GetAgenteAliadoASeguir() { CSight compi = null; if (!m_FOVObjects.isEmpty()) { Iterator it = m_FOVObjects.iterator(); while (it.hasNext()) { CSight s = (CSight) it.next(); if (m_eTeam == s.getTeam()) { compi = s; } } } return compi; }
/** * Calculates if there is an enemy at sight. * * <p>This method scans the list <tt> m_FOVObjects</tt> (objects in the Field Of View of the * agent) looking for an enemy. If an enemy agent is found, a value of <tt> TRUE</tt> is returned * and variable <tt> m_AimedAgent</tt> is updated. Note that there is no criterion (proximity, * etc.) for the enemy found. Otherwise, the return value is <tt> FALSE</tt>. * * <p><em> It's very useful to overload this method. </em> * * @return <tt> TRUE</tt>: enemy found / <tt> FALSE</tt> enemy not found */ protected boolean GetAgentToAim() { if (m_FOVObjects.isEmpty()) { m_AimedAgent = null; return false; } Iterator it = m_FOVObjects.iterator(); while (it.hasNext()) { CSight s = (CSight) it.next(); if (s.getType() >= CPack.PACK_NONE) { continue; } int eTeam = s.getTeam(); if (m_eTeam == eTeam) continue; m_AimedAgent = s; return true; } m_AimedAgent = null; return false; }
/** * Este metodo inserta en una lista los enemigos a la vista y asigna a m_AimedAgent aquel q está * tiene menos vida, en el caso que tenga amigos a la vista, calcula la diferencia entre el ángulo * del m_AimedAgent y el amigo si es <=1, no dispara * * @return En el caso que hayan enemigos a la vista devuelve true y sino false. */ protected boolean GetAgentToAim_EnemigoMenosVida() { m_AimedAgent = null; // si no tengo ningún agente en el campo de visión devuelvo false if (m_FOVObjects.isEmpty()) { return false; } ArrayList<CSight> enemigos = new ArrayList<CSight>(); ArrayList<CSight> amigos = new ArrayList<CSight>(); boolean bfuegoAmigo = false; @SuppressWarnings("unchecked") Iterator<?> it = m_FOVObjects.iterator(); int iMenorVida = Integer.MAX_VALUE; int iVida = 0; CSight enemigoMenorVida = null; double distanciaAmigo = 0f; double distanciaEnemigo = 0f; while (it.hasNext()) { CSight s = (CSight) it.next(); if (s.getType() >= CPack.PACK_NONE) { continue; } int eTeam = s.getTeam(); if (m_eTeam != eTeam) // si se trata de un enemigo, se añade a la lista de enemigos. { enemigos.add(s); } else // si es amigo { amigos.add(s); } } if (!enemigos.isEmpty()) { for (int i = 0; i <= enemigos.size() - 1; i++) { iVida = enemigos.get(i).getHealth(); if (iVida < iMenorVida) { enemigoMenorVida = enemigos.get(i); iMenorVida = iVida; } } if (!amigos.isEmpty()) { for (int j = 0; j <= amigos.size() - 1; j++) { if (Math.abs(amigos.get(j).getAngle() - enemigoMenorVida.getAngle()) <= 1) // si estan en el mismo ángulo de tiro o con un grado de diferencia // No se dispara por peligro de fuego amigo { distanciaAmigo = this.distanciaManhattan(this.m_Movement.getPosition(), amigos.get(j)); distanciaEnemigo = this.distanciaManhattan(this.m_Movement.getPosition(), enemigoMenorVida); if (distanciaAmigo <= distanciaEnemigo) { bfuegoAmigo = true; } } } if (!bfuegoAmigo) // si no hay ningún amigo en mismo o +1 ángulo se dispara { m_AimedAgent = enemigoMenorVida; } } else // si no tengo amigos en el campo de visión se dispara. { m_AimedAgent = enemigoMenorVida; } } if (m_AimedAgent != null) { return true; } else { return false; } }
/** * Este metodo inserta en una lista los enemigos a la vista y asigna a m_AimedAgent aquel q está * más cercano,en el caso que tenga amigos a la vista, calcula la diferencia entre el ángulo del * m_AimedAgent y el amigo si es <=1, no dispara En el caso que hayan enemigos a la vista devuelve * true y sino false. * * @return */ protected boolean GetAgentToAim_EnemigoMasCercano() { m_AimedAgent = null; boolean bfuegoAmigo = false; // si no tengo ningún agente en el campo de visión devuelvo false if (m_FOVObjects.isEmpty()) { return false; } ArrayList<CSight> enemigos = new ArrayList<CSight>(); ArrayList<CSight> amigos = new ArrayList<CSight>(); @SuppressWarnings("unchecked") Iterator<?> it = m_FOVObjects.iterator(); double distanciaMenor = Double.MAX_VALUE; double distancia = 0f; CSight enemigoMascercano = null; while (it.hasNext()) { CSight s = (CSight) it.next(); if (s.getType() >= CPack.PACK_NONE) { continue; } int eTeam = s.getTeam(); if (m_eTeam != eTeam) // si se trata de un enemigo, se añade a la lista de enemigos. { enemigos.add(s); } else // si es amigo { amigos.add(s); } } if (!enemigos.isEmpty()) { for (int i = 0; i <= enemigos.size() - 1; i++) { distancia = this.distanciaManhattan(this.m_Movement.getPosition(), enemigos.get(i)); if (distancia < distanciaMenor) { enemigoMascercano = enemigos.get(i); distanciaMenor = distancia; } } if (!amigos.isEmpty()) { for (int j = 0; j <= amigos.size() - 1; j++) { if (Math.abs(amigos.get(j).getAngle() - enemigoMascercano.getAngle()) <= 1) // si estan en el mismo ángulo de tiro o con un grado de diferencia { if (this.distanciaManhattan(this.m_Movement.getPosition(), amigos.get(j)) <= distanciaMenor) // y ademas está a una distancia menor que el agente enmigo // No se dispara por peligro de fuego amigo bfuegoAmigo = true; } } if (!bfuegoAmigo) // si no hay ningún amigo en mismo o +1 ángulo y más cerca que el enemigo // se dispara { m_AimedAgent = enemigoMascercano; } } else // si no tengo amigos en el campo de visión se dispara. { m_AimedAgent = enemigoMascercano; } } if (m_AimedAgent != null) { return true; } else { return false; } }