Description |
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. |