|
Häuser setzen wie in einem RTS
#215685
07/12/08 20:33
07/12/08 20:33
|
Joined: Apr 2007
Posts: 3,751 Canada
WretchedSid
OP
Expert
|
OP
Expert
Joined: Apr 2007
Posts: 3,751
Canada
|
Hallo,
ich bin gerade dabei den Bau Modus von meinem aktuellem Spiel Die Händler (ja, dass lebt noch und freut sich bester Gesundheit) komplett umzuschreiben. Bisher basierte das bauen auf dem platzieren von Gebäuden auf Bauplätzen. Davon will ich jetzt weg und etwas in der art RTS machen. Genau das hab ich auch vor dem wechsel zu Lite-C gehabt (A5) und damals war das auch kein Problem weil die Gebäude immer gleich groß waren. Also war damals das platzieren auf einem Raster kein Problem, mitlerweile müssten die Gebäude ab stark angepasst werden um auf einem Raster System zu funktioneren, das will ich also nicht.
Also habe ich mir gedacht das ich die Gebäude ja auch einfach so verschieben kann, ohne Raster. Funktionert auch super mit vec_for_screen und vec_set nur leider hab ich keine Ahnung wie ich überprüfen kann ob zwei Gebäude in einander sind. Ich hab es bereits mit c_scan probiert, aber leider funktioniert das nur wenn der scan bereich auf den Mittelpunkt den Modells trifft. Da die Gebäude halt unterschiedlich Groß sind, kann ich auch keine festen Werte nehmen da das ja nicht bei allen Gebäuden zu einem richtigen Ergebnis führt. Hat jemand von euch eine Idee wie ich das Problem lösen kann?
Shitlord by trade and passion. Graphics programmer at Laminar Research. I write blog posts at feresignum.com
|
|
|
Re: Häuser setzen wie in einem RTS
[Re: WretchedSid]
#215794
07/13/08 13:11
07/13/08 13:11
|
Joined: Jul 2008
Posts: 894
TechMuc
User
|
User
Joined: Jul 2008
Posts: 894
|
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.
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
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.
|
|
|
Re: Häuser setzen wie in einem RTS
[Re: TechMuc]
#219026
07/31/08 17:42
07/31/08 17:42
|
Joined: Apr 2007
Posts: 3,751 Canada
WretchedSid
OP
Expert
|
OP
Expert
Joined: Apr 2007
Posts: 3,751
Canada
|
So, sry das ich erst jetzt antworte, hab das Thema iwie total vergessen. Also doch, ich brauch ne Kollisionserkennung. Das ist ja gerade mein Problem Ich hab mich jetzt für die c_move Methode entschieden. Die ist schnell genug, da ich ja nur ein Gebäude bewegen muss. Beim erstellen des Gebäudes rufe ich einmal c_updatehull(my,1) auf. Klappt soweit perfekt! allerdings ist mein Problem das die Maus immer schneller ist als das Gebäude. Hier mal mein Script:
action Haus()
{
my.scale_x = 0.127;
my.scale_y = 0.127;
my.scale_z = 0.127;
c_updatehull(my, 1);
vecFrom.x = mouse_pos.x;
vecFrom.y = mouse_pos.y;
vecFrom.z = my.x + 20;
vec_for_screen(vecFrom,camera);
vecTo.x = mouse_pos.x;
vecTo.y = mouse_pos.y;
vecTo.z = my.x - 40;
vec_for_screen(vecTo,camera);
c_trace(vecTo.x, vecFrom.x, IGNORE_ME);
my.x = temp.x;
my.y = temp.y;
while(mouse_left != 1)
{
c_move(my,nullvector,vector(mickey.x,mickey.y * -1,0),GLIDE);
wait(1);
}
}
(Ich weiß, das setzen des Gebäudes per vec_to_screen lässt sich kürzen, ist aber eh nur ne Dummy funktion) Da das hier offenbar schon einige geschafft haben würde ich gerne wissen wie ihr das geschafft habt, mit mickey.x und .y ist c_move ja zu langsam
Shitlord by trade and passion. Graphics programmer at Laminar Research. I write blog posts at feresignum.com
|
|
|
|