Warning: ob_start(): function 'compress_handler' not found or invalid function name in /www/htdocs/xfmantis/core.php on line 18
0002103: WaitForWQeapObj funktioniert nicht immer - Mantis
Mantis - X-Force
Viewing Issue Advanced Details
2103 Allgemein minor always 21.05.09 15:32 22.06.09 03:00
Natter  
Natter  
normal  
closed V0.915a05  
fixed  
none    
none V0.915b01  
0002103: WaitForWQeapObj funktioniert nicht immer
Es gibt ein Problem mit TGameFigure.WaitForWeapObj (ist schon länger bekannt). Es kommt manchmal vor, das trotz Aufruf von Application.HandleMessage; die Projektile stehen bleiben. Das ist zwar momentan mit einer Abbruchbedingung abgefangen, allerdings ist es in einem solchen Fall nicht möglich, im Skript auf das Ergebnis des Schusses zu reagieren (da das Projektil beim weiterlaufen des Skriptes noch nicht zum Ziel geflogen ist).

Ich habe mich deswegen vorhin mal mit Christian unterhalten. Er hatte vermutet, dass eventuell der Container noch locked ist, wodurch TDXIsoEngine.PerformFrame nicht ausgeführt würde. Das stimmt so aber nicht ganz. Zwar ist der Container zwar locked, was auch das hängenbleiben der Maus erklärt, das eigentliche Problem konnte mit einem unlock aber nicht beseitigt werden. Trotzdem hat mich der Hinweis von Christian wohl auf die richtige Spur gebracht. Ich habe jetzt mal testweise in WaitForWeapObj die PerformFrame explizit aufgerufen, und mir das ganze mit Einzelschritt angeschaut. Dabei habe ich festgestellt, das bereits eine Instanz von PerformFrame läuft. Dies führt aber dazu, das ein erneuter Aufruf von PerformFrame ignoriert wird (if InPerform<>0 then exit;).

Ich hab das mal weiter verfolgt, und glaube die Ursache gefunden zu haben. Anscheinend wird OnSeeUnit ausgelöst, während in PerformFrame die Bewegung der Einheiten abgearbbeitet wird. Wenn man dann im Skript bei OnSeeUnit einen Schuss auslöst, kann dieser natürlich erst per PerformFrame ausgeführt werden, wenn die Skriptverarbeitung beendet, und damit die derzeit laufende Instanz von PerformFrame beendet werden kann.

Notes
(0003776)
Natter   
21.05.09 16:06   
Ich hab jetzt eine zusätzliche PerformWeapObjFrame-Funktion geschrieben. Wird diese aufgerufen, werden nur die Objekte abgearbeitet. Diese wird bei Bedarf in WaitForWeapObj aufgerufen.

Außerdem hab ich auch gleich in WaitForWeapObj eine Abfrage auf Pause eingebaut. Durch pasuieren konnte man bisher nämlich WaitForWeapObj auch austricksen (das Warten wurde dann immer durch die Abbruchbedingung vorzeitig beendet).