Il mio problema oggi è questo:
Ho molti civili in giro, sono classi immagazzinate da un arraylist.
L'idea è che quando vedranno un altro panico civile, inizieranno a prendere il panico e si diffonderà.
Per prima cosa chiamo ciascuna Step()
funzione delle classi eseguendo il ciclo attraverso un iteratore. Quindi nella Step()
funzione passa attraverso un altro iteratore civillian Mentre attraversa, cerca di rilevare se riesce a vedere l'altro civillian nell'iteratore, è qui che il tempo di esecuzione va da 0 a 50 Millisecondi per avere 100 Civillian.
Questo è il problema che devo risolvere, ho provato a fare un modo semplice per rilevare se vi sono oggetti nel punto da a a b.
Ecco il codice per la linea di vista:
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;
}
Se hai mal di testa i fondamenti sono:
Calcola 10 punti in mezzo e rileva se è 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;
}
}
La mia domanda è: esiste un modo più semplice per rilevare questa linea di vista che non influisce gravemente sulle mie prestazioni in gran numero? Qualche feedback?
LOS.txt
2. Non vogliamo vedere tutto il tuo codice. Fornire un SSCCE .