View previous topic :: View next topic |
Author |
Message |
D.Cent Forum-Nutzer
Joined: 05 Mar 2006 Posts: 507
Location: Stuttgart
|
Posted: 04.06.2007, 17:04 Post subject: [SDK] Spieler in anderen Raum setzen |
|
|
Wir entwickeln gerade einen Mod und haben eine Frage:
In dem Mod soll ein Spieler unter bestimmten Bedingungen in seinen eigenen Goalroom zurückgesetzt werden. Wie wir diesen Goalroom erkennen, wissen wir schon, aber wir haben keine Ahnung, wie wir den Spieler in einen anderen Raum setzen. Die Variable roomnum zu verändern bringt leider nur Fehler.
Hat jemand eine Idee?
Greetz, Lo und Cent
|
|
Back to top |
|
|
Dark Forum-Nutzer
Joined: 15 Nov 2001 Posts: 1244
Location: Berlin
|
Posted: 04.06.2007, 19:03 Post subject: |
|
|
Ist ja eigentlich nichts anderes als nen spieler zu teleportieren - so wie ich es auch in anderen multileveln schon gesehen habe.
Anleitung dazu gibts - glaube ich - bei Fischlein.
Beim teleportieren wird der spieler allerdings nicht zu einem raum teleportiert, sondern zu einem unsichtbaren objekt.
Also ein Invisible in dem gewünschten raum positionieren und nen eindeutigen namen vergeben.
Beim eintreten der gewünschten bedingung dann den spieler zu diesem objekt teleportieren.
So oder so ähnlich sollte es funktionieren. Denkt da mal ein bischen drauf herum.
PS:
Das Invisible muss man übrigends noch ghosten damit man im spiel an dieser stelle nicht einen
rätselhaften fleck sieht.
_________________ Dark
wo alle das selbe denken, wird nicht viel gedacht
Es kommt meistens anders wenn man denkt! |
|
Back to top |
|
|
Fischlein Co-Admin
Joined: 06 Feb 2001 Posts: 933
Location: Piesau
|
Posted: 04.06.2007, 19:23 Post subject: |
|
|
Ja genau und hier gleich der Link dazu
Teleporter
Ist schon cool was man alles damit machen kann
Fischlein
|
|
Back to top |
|
|
Floyd Forum-Orakel
Joined: 20 Mar 2001 Posts: 2912
Location: Dresden, Germany
|
Posted: 04.06.2007, 22:40 Post subject: |
|
|
"DLLObjSetPos" evtl.? (gamedll_header.h)
|
|
Back to top |
|
|
D.Cent Forum-Nutzer
Joined: 05 Mar 2006 Posts: 507
Location: Stuttgart
|
Posted: 05.06.2007, 14:24 Post subject: |
|
|
Danke für die schnellen Antworten
Leider kann man mit Linux weder D3Edit noch den Dallas-Script-Editor benutzen. Wisst ihr zufällig, wie die benötigte Funktion heißt?
@Floyd: Hatten wir auch schon versucht, aber das Problem ist leider das gleiche, als wenn man die room-num des Spielers ändert: ein verschwommener Bildschirm.
Die Definition ist
typedef void (*ObjSetPos_fp)(object *obj,vector *pos,int roomnum,matrix *orient,bool f_update_attached_children);
Leider weiß ich weder, woher ich die Daten für pos nehmen soll, noch welche Daten orient braucht (vector braucht 3 Daten für 3 Dimensionen und matrix 3 Vektoren...). Ich habe einfach mal überall 0 eingesetzt, was aber zum oben genannten Resultat führt. Wenn man für matrix oder vector NULL übergibt kommt ein Speicherzugriffsfehler...
|
|
Back to top |
|
|
Munk Forum-Nutzer
Joined: 30 Jun 2001 Posts: 2140
Location: Herzogenrath
|
Posted: 05.06.2007, 15:22 Post subject: |
|
|
D.Cent wrote: | Die Definition ist
typedef void (*ObjSetPos_fp)(object *obj,vector *pos,int roomnum,matrix *orient,bool f_update_attached_children);
Leider weiß ich weder, woher ich die Daten für pos nehmen soll, noch welche Daten orient braucht (vector braucht 3 Daten für 3 Dimensionen und matrix 3 Vektoren...). Ich habe einfach mal überall 0 eingesetzt, was aber zum oben genannten Resultat führt. Wenn man für matrix oder vector NULL übergibt kommt ein Speicherzugriffsfehler... :( |
pos und orient gibt dir halt die absolute Position und die absolute Orientierung innerhalb des Levels an.
Am einfachsten ist es, wie Dark schon sagt, im Leveleditor an die gewünschte Stelle ein Dummy-Objekt hinzusetzen, und dann im Skript dessen Position, Orientierung, und Raumnummer zu kopieren.
Ansonsten kannst Du auch versuchen, die Geometrie (also Größe und Form) des Raumes (die Raumnummer kennst Du ja) auszulesen, um dann eine zufällige Position innerhalb der Mitte zu finden (Entropy positioniert so die Viren in den Laboren)
Jetzt weiß ich aber nicht, ob Descent nur konvexe Räume haben darf. Falls es auch nicht-konvexe Räume gibt, ist die Raummitte nicht unbedingt Teil des Raumes selbst.
Als Orientierungsmatrix kannst Du in jedem Fall die Einheitsmatrix benutzen, dann bekommst Du halt eine Orientierung entlang der Koordinatenachsen.
|
|
Back to top |
|
|
D.Cent Forum-Nutzer
Joined: 05 Mar 2006 Posts: 507
Location: Stuttgart
|
Posted: 05.06.2007, 16:06 Post subject: |
|
|
Ah, wir habens dann doch gepackt:
Code: |
for(int i=0; i<RoomCount; i++)
if(dRooms[i].flags & RF_GOAL2)
{
vector player_pos = { 0,0,0 };
DLLComputeRoomCenter(&player_pos,&dRooms[i]);
DLLObjSetPos(obj,&player_pos,i, NULL, true);
}
|
|
|
Back to top |
|
|
Munk Forum-Nutzer
Joined: 30 Jun 2001 Posts: 2140
Location: Herzogenrath
|
Posted: 05.06.2007, 16:12 Post subject: |
|
|
Nach DLLObjSetPos() willst Du sicherlich ein return oder break machen, ansonsten springt dir der Spieler in jeden Raum mit RF_GOAL2 nacheinander.
|
|
Back to top |
|
|
Floyd Forum-Orakel
Joined: 20 Mar 2001 Posts: 2912
Location: Dresden, Germany
|
Posted: 05.06.2007, 18:25 Post subject: |
|
|
die orientmatrix würde ich evtl. nicht null setzen bzw. willst du ja auch dass der spieler in eine bestimmte richtung schaut. wenn man müll in die matrix schreibt, werden objekte verzerrt dargestellt. wenn die orientierungsmatrix für die kamera müll enthält, kann ich mir gut vorstellen, dass alles verzerrt dargestellt wird.
zum erstellen einer orientierungsmatrix gibt es diverse funktionen. man bestimmt den vektor, wo die richtung "vorwärts" hinzeigen soll. aus diesem vektor kann man dann eine matrix generieren lassen.
das sieht ungefähr so aus:
Code: | DLLvm_VectorToMatrix(&orient_matrix, NULL, vorwaerts_vektor, NULL);
|
|
|
Back to top |
|
|
King Lo Forum-Nutzer
Joined: 14 Mar 2006 Posts: 320
Location: Stuttgart, BW
|
Posted: 05.06.2007, 19:26 Post subject: |
|
|
Danke Floyd, wir werden es mal ausprobieren (aber eigtl. können wir die Richtung nicht mal genau angeben, da wir den Level ja nicht kennen...)
Munk wrote: | Nach DLLObjSetPos() willst Du sicherlich ein return oder break machen, ansonsten springt dir der Spieler in jeden Raum mit RF_GOAL2 nacheinander. |
Das ist ein Problem... Ich dachte es gibt immer nur EINEN Goalroom pro Team? Kann es wirklich Level mit mehreren geben? o_O
|
|
Back to top |
|
|
Munk Forum-Nutzer
Joined: 30 Jun 2001 Posts: 2140
Location: Herzogenrath
|
Posted: 05.06.2007, 20:03 Post subject: |
|
|
Bleib auf der sicheren Seite und mach sowenig Annahmen wie möglich über dein Umfeld.
Selbst wenn es nur einen Raum mit dem Flag gibt, beschleunigt ein break dein Programm, weil es dann nicht in den anderen Räumen weitersucht.
|
|
Back to top |
|
|
Floyd Forum-Orakel
Joined: 20 Mar 2001 Posts: 2912
Location: Dresden, Germany
|
Posted: 05.06.2007, 20:09 Post subject: |
|
|
King Lo wrote: | (aber eigtl. können wir die Richtung nicht mal genau angeben, da wir den Level ja nicht kennen...)
|
dann übergebt die alte orient-matrix, oder erstellt eine zufällige.
|
|
Back to top |
|
|
King Lo Forum-Nutzer
Joined: 14 Mar 2006 Posts: 320
Location: Stuttgart, BW
|
Posted: 05.06.2007, 20:14 Post subject: |
|
|
NULL reicht auch
|
|
Back to top |
|
|
King Lo Forum-Nutzer
Joined: 14 Mar 2006 Posts: 320
Location: Stuttgart, BW
|
Posted: 21.06.2007, 17:51 Post subject: |
|
|
Eine Frage noch: Warum wird für die Orientierung des Objekts eine Matrix genommen? Würde ein Vektor nicht auch reichen?
|
|
Back to top |
|
|
Floyd Forum-Orakel
Joined: 20 Mar 2001 Posts: 2912
Location: Dresden, Germany
|
Posted: 21.06.2007, 17:53 Post subject: |
|
|
einen vektor kannst du noch um seine eigene achse drehen. allerdings würden zwei vektoren genügen.
|
|
Back to top |
|
|
Munk Forum-Nutzer
Joined: 30 Jun 2001 Posts: 2140
Location: Herzogenrath
|
Posted: 21.06.2007, 19:26 Post subject: |
|
|
Eigentlich reichen auch 3 Winkel.
|
|
Back to top |
|
|
VEX-Eagle Falschparker
Joined: 04 Feb 2003 Posts: 807
Location: Stelle (Hamburg)
|
Posted: 21.06.2007, 19:56 Post subject: |
|
|
in der Matrix sind die X-, Y- und Z-Achse des Objekts gespeichert
Meiner Meinung nach die nützlichste Variante
|
|
Back to top |
|
|
Munk Forum-Nutzer
Joined: 30 Jun 2001 Posts: 2140
Location: Herzogenrath
|
Posted: 21.06.2007, 21:35 Post subject: |
|
|
VEX-Eagle wrote: | in der Matrix sind die X-, Y- und Z-Achse des Objekts gespeichert
Meiner Meinung nach die nützlichste Variante |
Ja, so werden Drehmatrizen im allgemeinen beschrieben.
Weil sich die "Länge" der drei Achsen bei ner Drehung nicht ändert, und paarweise alle 3 Winkel zwischen den Achsen auch nicht, läßt sich die Matrix (hat ja 9 Komponenten) auf 3 unabhängige Komponenten reduzieren.
Diese drei übrigen Komponenten kann man zu nem Vektor zusammenfassen, der dann die Drehachse vorgibt. Die Länge des Vektors ist dann der Drehwinkel um diese Achse.
Man kann für die drei übrigen Komponenten aber auch drei Winkel angeben, die jeweils die Drehung um die z/y/z-Achse beschreibt.
|
|
Back to top |
|
|
|