Gamestudio Links
Zorro Links
Newest Posts
Help with plotting multiple ZigZag
by degenerate_762. 04/30/24 23:23
M1 Oversampling
by 11honza11. 04/30/24 08:16
Trading Journey
by howardR. 04/28/24 09:55
Zorro Trader GPT
by TipmyPip. 04/27/24 13:50
Data from CSV not parsed correctly
by jcl. 04/26/24 11:18
Why Zorro supports up to 72 cores?
by jcl. 04/26/24 11:09
Eigenwerbung
by jcl. 04/26/24 11:08
AUM Magazine
Latest Screens
The Bible Game
A psychological thriller game
SHADOW (2014)
DEAD TASTE
Who's Online Now
2 registered members (degenerate_762, AndrewAMD), 877 guests, and 5 spiders.
Key: Admin, Global Mod, Mod
Newest Members
wandaluciaia, Mega_Rod, EternallyCurious, howardR, 11honza11
19049 Registered Users
Previous Thread
Next Thread
Print Thread
Rate Thread
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 Offline OP
Expert
WretchedSid  Offline 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
T
TechMuc Offline
User
TechMuc  Offline
User
T

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.

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.
Re: Häuser setzen wie in einem RTS [Re: TechMuc] #215797
07/13/08 13:31
07/13/08 13:31
Joined: Dec 2005
Posts: 490
Germany/Berlin-Velten
kasimir Offline
Senior Member
kasimir  Offline
Senior Member

Joined: Dec 2005
Posts: 490
Germany/Berlin-Velten
hmmm nochmal eine andere Idee, wenn du die Gebäude setzt/positionierst muss du sie ja auf dem Boden setzten -> dafür benötigst du ein Trace!

Ich würde die geklickte Position ermitteln (vec_for_screen), das Gebäude in einer bestimmten Höhe darüber erstellen und mit c_trace und/oder USE_BOX gucken ob es passt! (vergleich USE_BOX mit dünnem trace_strahl)

anders würde das aussehen wenn du z.B. das Gebäude in der Gebäudeauswahlleiste anwählst und es solange mit der Maus mitbegegt wird, wie nicht geklickt wird! Vieleicht könnte man dort ein c_move anwenden!

Dies soll aber nur eine Anregung sein!

Re: Häuser setzen wie in einem RTS [Re: kasimir] #215802
07/13/08 13:45
07/13/08 13:45
Joined: Mar 2007
Posts: 75
Hamburg, Ger
Altimeter Offline
Junior Member
Altimeter  Offline
Junior Member

Joined: Mar 2007
Posts: 75
Hamburg, Ger
Ich hab sowas ähnliches gemacht mit c_move.
Gebäude erstellen an freier Stelle. Von dort nach vec_for_screen eine Kraft in die richtige Richtung erzeugen und dann mit c_move mehrere Frames lang in diese Richtung schieben lassen. Wenn deine models USE_BOX an haben, wird c_move merken, wenn sie sich berühren.

Re: Häuser setzen wie in einem RTS [Re: Altimeter] #215861
07/13/08 18:54
07/13/08 18:54
Joined: Jul 2008
Posts: 894
T
TechMuc Offline
User
TechMuc  Offline
User
T

Joined: Jul 2008
Posts: 894
Problematisch ist, dass c_move und c_trace unnötig langsam sind, bzw. c_move eig. am Ziel vorbei geht, da du ja vermutlich keine Kollisionserkennung brauchst.

PS: von direkt überhalb (nur z achse verschoben) mit der kollisionsbox von dem gebäude zu tracen (wie kasimir gesagt hat) ist genauer als den weg den ich oben beschrieben habe, aber langsamer. Was du brauchst musst du wissen.

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 Offline OP
Expert
WretchedSid  Offline 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 wink 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:
Code:
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 confused


Shitlord by trade and passion. Graphics programmer at Laminar Research.
I write blog posts at feresignum.com

Moderated by  HeelX, Lukas, rayp, Rei_Ayanami, Superku, Tobias, TWO, VeT 

Gamestudio download | chip programmers | Zorro platform | shop | Data Protection Policy

oP group Germany GmbH | Birkenstr. 25-27 | 63549 Ronneburg / Germany | info (at) opgroup.de

Powered by UBB.threads™ PHP Forum Software 7.7.1