3D Kollision ohne Kollision?

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

Megamag

Betreff: 3D Kollision ohne Kollision?

BeitragFr, Aug 21, 2009 13:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Titel ist nicht so recht aussagekräftig, ich weiß...
Man kennt es aus vielen Spielen, meistens sind es RPGs. Man tritt auf ein bestimmtes Tile und es passiert etwas. Soetwas ähnliches möchte ich auch in 3D haben. Nehmen wir an, wir gehen durch einen Tunnel, und wenn wir die Hälfte des Tunnels passiert haben, soll sich eine Tür hinter uns schließen. Ich habe mir gedacht, man könnte vielleicht einfach soetwas wie einen großen, unsichtbaren block (bzw. Wand) dort in den Weg stellen, und sobald der Spieler diesen berührt, wird das Event ausgelöst. Jedoch funktioniert das nicht über Kollisionen, denn wenn man dieser "Zone" eine Kollision zuweist, wird der SPieler daran stehen bleiben, und sie nicht mehr passieren können. Mit MeshesIntersect funktioniert es auch nicht, da so ein Blitzeigener Block glaube ich nicht als Mesh angesehen wird. Wie könnte man das nun lösen?

Mr.Keks

BeitragFr, Aug 21, 2009 14:13
Antworten mit Zitat
Benutzer-Profile anzeigen
klassischerweise machst du das so, dass du einfach bereiche (im simpelsten fall kreise/tiles) definierst, bei deren betreten ein event ausgelöst wird:
Code:
t.Trigger = New Trigger
t\piv = CreatePivot()
PositionEntity t\piv in der mitte des tunnels
t\radius = 200 oder so
t\active = True

...
If t\active
   If Abs(EntityX(player)-EntityX(t\piv)) < t\radius And Abs(EntityZ(player)-EntityZ(t\piv)) < t\radius Then
      If EntityDistance(player,t\piv) < t\radius Then
          LoeseEventAus()
          t\active = False
      EndIf
   EndIf
EndIf
MrKeks.net

Megamag

BeitragFr, Aug 21, 2009 14:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke! Dann sind es aber immer Kreise, die man definiert oder?
Und wozu ist das
Code:
 If Abs(EntityX(player)-EntityX(t\piv)) < t\radius And Abs(EntityZ(player)-EntityZ(t\piv)) < t\radius Then

gut? Ist das nicht genau das selbe, wie
Code:
    If EntityDistance(player,t\piv) < t\radius Then

Goodjee

BeitragFr, Aug 21, 2009 14:24
Antworten mit Zitat
Benutzer-Profile anzeigen
ich vermute rechenleistung sparen, indem man erst guckt ob es in dem nach oben unendlich großen quader kollidiert und dann erst das teure entitydistance aufruft
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/

Mr.Keks

BeitragFr, Aug 21, 2009 15:08
Antworten mit Zitat
Benutzer-Profile anzeigen
ja, sorry, war vielleicht etwas umständlich gecodet. wenn du viele triggerrelevante einheiten hast, ist das ein erster schritt, um ein paar millisekunden zu sparen, da entitydistance ein halbwegs rechenintensiver befehl ist.. für wirklich große welten muss da aber noch mehr trickserei ran.

wie gesagt, du kannst auch gaaanz andere formen definieren. klassischerweise sind kreise für fast alles perfekt.
MrKeks.net
 

FreizeitCoder

BeitragFr, Aug 21, 2009 21:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich stehe gerade vor dem gleichen Problem. Ganz nachvollziehen kann ich es nicht, warum die einfache Melde-Funktion nicht in die Kollisionsabfrage eingebaut wurde!?!

Ich habe eben mit einem anderen Lösungsansatz rumprobiert. Den Meldekörper sofort mit hideentity ausblenden. Dann die Türe bewegen (oder was auch immer), und am Anfang des nächsten Durchlaufes alle Meldekörper pauschal wieder einblenden.

Ist zwar einfach, hat aber einige Nachteile, wie ich gerade feststellen mußte:
-Wenn Bots oder andere Mitspieler mit dir gemeinsam an der Türe stehen kommt es zu fehlern.
-Der Code muß auseinander gerissen und an verschiedenen Stellen der Schleife platziert werden.(Fehleranfällig)

Fazit:
Ich probiere lieber mal mit der Variante von Mr. Keks rum.

Gruß

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group