Kann sein, dass ich sehr einfache Wege übersehe aber ich versuch es mal:

1) Ich würde auf jeden Fall eine Liste/Array aller erstellten Gebäude führen. Das solltest du so und so machen (nicht nur für die Kollisionserkennungsprobleme).

2) Wenn du eine Liste aller Gebäude hast gehts dann eig.
Du musst überprüfen ob die Boundingbox irgendeines Gebäudes sich mit der des zu setztenden Gebäudes überlagert.

Code:

function checkx(obj1,obj2)
{
  if(obj1.x < obj2.x)
  {
    if(obj1.x + obj1.max_x < obj1.x - abs(obj1.min_x))
    {
       return 0; //keine überschneidung
    }
    else
    {
       return 1;
    }
  }
  else
  {
     if(obj1.x - abs(obj1.min_x) > obj1.x + obj1.max_x)
     {
       return 0; 
     }
     else
     {
       return 1;
     }
   }
}//für x,y,z durchziehen

c_setminmax(obj1); //gebäude1
c_setminmax(obj2); //gebäude2

if(checkx() == 0 && checky() == 0 && checkz() == 0)
{

 // KEINE ÜBERSCHNEIDUNG
}
else
{
  //SIE TREFFEN SICH
}



Das jetzt mit allen (nötigen) Objekten durchführen (also Gebäude1 (zu überprüfen) mit Gebäude2, Gebäude1 mit Gebäude3 usw.).
Bin mir nicht ganz sicher ob der Code jetzt so stimmt, aber von der Idee her überprüft er einfach nur ob die Boundingboxen der beiden Objekte/Geäbude sich überschneiden.


Ist so natürlich keine Polygongenaue überprüfung, da ein Objekt in die Bounding BOX einer anderen eindringen kann ohne auch nur ein Polygon zu berühren, ist aber bei gebäuden weit und vollkommen ausreichend.

PS: Die Funktion lässt sich auch abkürzen, habs der verständniss halt halber aber nicht gemacht

Code:
function checkx(obj1,obj2) { if(obj1.x < obj2.x) { return ((obj1.x + obj1.max_x < obj1.x - abs(obj1.min_x) == 0); } else { return((obj1.x - abs(obj1.min_x) > obj1.x + obj1.max_x) == 0); } }


Last edited by TechMuc; 07/13/08 13:24.