Mi problema hoy es este:
Tengo muchos civiles dando vueltas, son clases almacenadas por un arraylist.
La idea es que cuando vean otro pánico civil, comenzarán a entrar en pánico y se extenderá.
Primero llamo a cada Step()
función de clases haciendo un bucle a través de un iterador. Luego, en la Step()
función, pasa por otro iterador civillian. A medida que avanza, intenta detectar si puede ver al otro civillian en el iterador, aquí es donde el tiempo de rendimiento va de 0 a 50 milisegundos por tener 100 Civillians.
Este es el problema que necesito solucionar, traté de hacer una manera fácil de detectar si algún objeto está en el camino del punto a al punto b.
Aquí está el código para la línea de visión:
public static Object LOS(int x, int y, int x2, int y2, String Scan, Object Me, Object You) {
DirectionX = (x-x2)/Quality;
DirectionY = (y-y2)/Quality;
CurrentX = x;
CurrentY = y;
String[] ScanArray = Scan.split(":");
for(int I=0;I<=Quality;I++) {
for(String Type: ScanArray) {
if(Type.equals("Boxs")) {
Iterator it=Level.Boxs.iterator();
while(it.hasNext()) {
Box Box = (Box)it.next();
if(Me!=Box&&You!=Box) {
//Collision = Tools.Collision((int)(CurrentX-(Width/2)), (int)(CurrentY-(Width/2)), Width, Width, Box.GetX(), Box.GetY(), Box.GetWidth(), Box.GetHeight(), 1);
boolean Col = Tools.BasicCollision((int)(CurrentX-(Width/2)), (int)(CurrentY-(Width/2)), Width, Width, Box.GetX(), Box.GetY(), Box.GetWidth(), Box.GetHeight());
}
}
}
}
CurrentX-=DirectionX;
CurrentY-=DirectionY;
}
return null;
}
Si le duele la cabeza, los fundamentos son:
Calcula 10 puntos intermedios y detecta si está dentro, usando BasicCollision
:
public static boolean BasicCollision(int x, int y, int width, int height, int x2, int y2, int width2, int height2) {
if(x<x2+width&&x+width>x2&&y<y2+height&&y+height>y2) {
return true;
} else {
return false;
}
}
Mi pregunta es: ¿hay una manera más fácil de detectar esta línea de visión que no afecte gravemente mi rendimiento en grandes cantidades? ¿Cualquier retroalimentación?
LOS.txt
2. No queremos ver todo su código. Proporcionar un SSCCE .