1 registered members (7th_zorro),
1,300
guests, and 3
spiders. |
Key:
Admin,
Global Mod,
Mod
|
|
|
physX_open
#349477
12/07/10 23:03
12/07/10 23:03
|
Joined: Sep 2003
Posts: 6,861 Kiel (Germany)
Superku
OP
Senior Expert
|
OP
Senior Expert
Joined: Sep 2003
Posts: 6,861
Kiel (Germany)
|
Ich weiß nicht, ob es Absicht ist, aber der Algorithmus im Manual unter physX_open ist ein anderer als der, der tatsächlich implementiert ist. Manual:
function physX_level_load()
{
if (level_ent)
pXent_settype(level_ent,PH_STATIC,PH_POLY);
for (you = ent_next(NULL); you; you = ent_next(you))
{
if (you.emask&DYNAMIC) continue; // only register static ents
if (you.flags&PASSABLE) continue; var type = ent_type(you);
if (type >= 2 && type <= 5) // blocks, models, or terrain
pXent_settype(you,PH_STATIC,PH_POLY);
}
}
function physX_ent_remove(ENTITY* ent)
{
if (ent.body) // unregister entity before removal
pXent_settype(ent,0,0);
}
function physX_open()
{
physX_load();
pX_setsteprate(60,8,0);
pX_setunit(1/40);
on_exit = physX_destroy;
on_level_load = physX_level_load;
on_ent_remove = physX_ent_remove;
while(1) {
physX_run(time_step/16);
wait(1);
}
}
In ackphysX.h:
function physX_level_load()
{
if (!NxPhysicsSDK) return;
if (level_ent)
pXent_settype(level_ent,PH_STATIC,PH_POLY);
for (you = ent_next(NULL); you; you = ent_next(you))
{
if (you.flags & PASSABLE) continue;
var type = ent_type(you);
if (type == 5 && (you.emask & DYNAMIC)) continue; // only register static models
if (type < 2 && type > 5) continue; // blocks, models, or terrain only
pXent_settype(you,PH_STATIC,PH_POLY);
}
on_level_load_px();
}
function physX_ent_remove(ENTITY* ent)
{
if (!NxPhysicsSDK) return;
if (ent.body)
pXent_settype(ent,0,0);
on_ent_remove_px(ent);
}
function physX_open()
{
if (NxPhysicsSDK) return; // already initialized
if (version < 8) {
error("PhysX only supported in A8!");
return;
}
if (level_ent) // level already loaded?
error("Open PhysX before loading level!");
NxPhysicsSDK = physX_load();
NxScene = physX_run(0);
pX_setsteprate(60,8,0);
pX_setunit(1/40);
on_exit_px = on_exit; // store previous on_exit function
on_exit = physX_close;
on_level_load_px = on_level_load;
on_level_load = physX_level_load;
on_ent_remove_px = on_ent_remove;
on_ent_remove = physX_ent_remove;
while(NxPhysicsSDK) {
#ifdef FIXED_TIME
//This for-loop fixes the physX framerate to 60 when the frame rate is below 60 fps
int loc_n = integer(time_step * 60 / 16) + 1;
int loc_i = 0;
if (freeze_mode <= 0)
for (; loc_i < loc_n; loc_i++)
physX_run(0);
#else
if (freeze_mode <= 0)
physX_run(time_step/16);
#endif
wait(1);
}
}
Was das ausmacht? Ich habe, da ich meine physX_level_load-Funktion anpassen musste, natürlich das Code-Beispiel aus dem Manual genommen und mich gewundert, warum das Spiel bei manchen Level-Wechseln abstürzte. EDIT: Wenn ich in meinem Level PH_CHAR-Entities (BOX oder CAPSULE) registriere, erhalte ich einen invalid pointer/ handle im eigentlichen physX_open (oder meiner eigenen Funktion), wenn ich sie wieder aus der Physik-Registrierung löschen möchte (ganz mit settype(0,0) oder temporär mit enable(0)). PH_CAR-Entities bekommen keinen entity.body-Physik-Pointer zugewiesen, korrekt?
Last edited by Superku; 12/09/10 18:05.
"Falls das Resultat nicht einfach nur dermassen gut aussieht, sollten Sie nochmal von vorn anfangen..." - Manual Check out my new game: Pogostuck: Rage With Your Friends
|
|
|
Re: physX_open
[Re: jcl]
#349633
12/09/10 18:05
12/09/10 18:05
|
Joined: Sep 2003
Posts: 6,861 Kiel (Germany)
Superku
OP
Senior Expert
|
OP
Senior Expert
Joined: Sep 2003
Posts: 6,861
Kiel (Germany)
|
Ok, ich bumpe hiermit, damit Sie auf die Änderung aufmerksam werden.
EDIT: Funktioniert EVENT_FRICTION mit physX? Bei mir scheint kein Event ausgelöst zu werden.
Last edited by Superku; 12/09/10 18:15.
"Falls das Resultat nicht einfach nur dermassen gut aussieht, sollten Sie nochmal von vorn anfangen..." - Manual Check out my new game: Pogostuck: Rage With Your Friends
|
|
|
Re: physX_open
[Re: jcl]
#349691
12/10/10 12:56
12/10/10 12:56
|
Joined: Sep 2003
Posts: 6,861 Kiel (Germany)
Superku
OP
Senior Expert
|
OP
Senior Expert
Joined: Sep 2003
Posts: 6,861
Kiel (Germany)
|
"z.B. im Earthball sample." Hat mir geholfen und funktioniert jetzt, danke. Nur scheint der you-Pointer nicht in der event-Funktion gesetzt zu werden, wenn (event_type == EVENT_FRICTION) gilt. Das Problem wurde bereits im Mai von Uhrwerk angemerkt: It would be nice if the you pointer was set to the entity the entity receiving EVENT_FRICTION collided with, respectively to NULL when a collision with level geometry occurs. The you pointer is set in a friction event AFAIK, although this is not explicitly mentioned in the manual. Ich kann, wie bereits gesagt, jedoch nicht bestätigen, dass der Pointer beim Auslösen des Events gesetzt wird (Entity-Entity-Kollision, per pXent_setcollisionflag(ent1,ent2,NX_NOTIFY_ON_TOUCH) gesetzt). Um noch einmal auf das Manual zurückzukommen: Unter dem Eintrag "PhysX Fragen" gibt es folgenden Punkt: F: Wie kann ich die Bewegung auf zwei Dimensionen beschränken? A: Sie können entweder zwei unsichtbare Hindernisebenen verwenden und so die Bewegungsmöglichkeit in der dritten Dimension vermeiden. Oder aber Sie messen die Position eines Objektes in der dritten Dimension und bringen proportional zur Ablenkung von der gewünschten Ebene eine kleine Kraft an. Beim raschen Durchsehen der ackphysX.h ist mir folgendes Flag aufgefallen: pXent_setbodyflag(entity, NX_BF_FROZEN_POS_Y,1); Da es bei mir sehr gut zu funktionieren scheint, wäre es meiner Meinung nach angebracht, diese einfache, aber versteckte Möglichkeit im Manual zu erwähnen. EDIT: Setze ich im SED mittels [STRG]+[0..9] eine Marke, was um einiges komfortabler ist als die gewöhnlichen "Bookmarks", so werden diese leider beim Verlassen des Skriptes nicht gespeichert.
Last edited by Superku; 12/10/10 13:45.
"Falls das Resultat nicht einfach nur dermassen gut aussieht, sollten Sie nochmal von vorn anfangen..." - Manual Check out my new game: Pogostuck: Rage With Your Friends
|
|
|
|