Némileg viszontagságos a címben szereplő témakör implementálása mivel számos helyen egybefonódnak a problémák.
1. probléma
A triggerelésnél azt szeretnénk, hogy a triggerrel kapcsolatba szereplőt / szereplőket regisztráljuk. A probléma onnan ered, hogy a PhysX shape-re lebontva hívja meg a triggerelés eseményt vagyis ha egy szereplő több shape-ből áll akkor a triggerelés annyiszor fog meghívódni ahány shape-t tartalmaz az actor. Mi pedig azt szeretnénk, hogy egy frame-ben csak egyszer történjen egy trigger - szereplő kölcsönhatás.
Mondhatnánk azt, hogy ha egy triggert már aktiváltunk az adott frame-ben akkor többet nem lehet. Ezt kizárja azonban a 2. probléma.
2.probléma
Ez már nem kapcsolódik a PhysX-hez ez már a játék engine-ből következik. Ez pedig nem más, hogy egy frame-ben több szereplő is hathat a triggerre.
Emiatt regisztrálnunk kell minden egyedi szereplő - trigger kapcsolatot. Azonban ha ennél még árnyaltabb triggerelést szeretnénk - nevezetesen regisztrálni a szereplő ki-, belépését és ott tartozkódását akkor találkozunk a 3. problémával ( a belépést és ott tartózkodást már most is tudnánk kezelni azonban a kilépést nem hiszen ekkor már nincs szereplő - trigger kapcsolat).
3. probléma
Bár a PhysX képes ezt a 3 állapotot közölni velünk az 1. probléma miatt nem célszerű használni (másrészről ez a tulajdonság így nem lesz fizikai engine függő!).
Ahhoz, hogy a trigger - szereplő kapcsolat ezt a 3 állapotát tudjuk kezelni szükségünk van arra, hogy ezen kapcsolatok
- létrejöttét / létrejöttének idejét tároljuk - ez lesz a belépés esemény
- ha a kapcsolat nem az adott frame-ben jött létre akkor figyelni, hogy az adott frame-ben is született volna-e egy ilyen
- ha igen, akkor csak frissítjük ezt a kapcsolatot - ez az ott tartózkodás esemény
- ha nem, akkor a szereplő kilépett a triggerből vagyis ez az kilépés esemény és ilyenkor törölni lehet a kapcsolatot.
Van azonban egy 4. probléma is...
4. probléma
Előfordulhat olyan eset, amikor még létezik egy olyan trigger - szereplő kapcsolat, amelyben a szereplő már a jelenetből törölve lett. Ezt bonyolultabb módon referenciákkal vagy egyszerűbben késleltett törléssel küszöbölhető ki (hiszen max. egy frame-mel ezelőtti keletkezett kapcsolat esetén fordulhat elő ez).
Ezt a 4 problémát megoldva kapunk egy a játékokban látott triggerelési rendszert - lehetséges, hogy van több probléma is, de azokkal egyelőre nem szembesültem :]