a
Ich hab noch ne andere Lösung, die ich für mein aktuelles Spiel umgesetzt habe. Funzt auch ziemlich gut. Bietet ein paar Feature mehr als die Standartverfahren. Z.B. kann die Anzeigezeit für jeden Frame einzeln festgelegt werden.
PB 4.30 und 4.20
Der Code ist so nicht lauffähig, da fehlen noch einige Prozeduren, soll nur veranschaulichen, wie das bei mir funktioniert.
Ich habe eine globale Zeitvariable. Das heisst ich ermittle nur einmal, wieviel Zeit seid dem letzten Durchlauf der Schleife vergangen ist und nutze diesen Wert in allen Timebased-Angelegenheiten. Und das sind ne Menge bei dem Spiel. Hab alles timebased gemacht.
Der Zeitindex (TimeIndex), den die Prozedur erwartet ist einfach der Zeitindex der Animation also bei welcher Zeit die Animation gerade steht. Dafür nehme ich den aktuell hinterlegten Zeitindex der Animation, welcher dem der letzten Anzeige entspricht. Und rechne da meine Updatezeit drauf. Also die Zeit, die seid dem letzten Durchlauf der Gameloop vergangen ist. Der Zeitindex kann dabei auch größer sein als die Animation. Die Prozedur berechnet wie oft die Animation durchgelaufen wäre und korrigiert den Zeitindex entsprechend.
Ist vieleicht nicht ganz optimal, war das erste mal das ich timebased Animations programmiert hab. Aber ich halte es für sehr flexibel. Z.B. kann man damit ja auch eine Animation bei einem beliebigen Zeitindex starten. Kann ja sein man möchte eine Animation in der Mitte beginnen. Ausserdem wird so nicht zwingend jeder Frame angezeigt, nur wenn es die Performance zulässt. Sehr wichtig für Multiplayerspiele damit nicht der eine Client dem anderen hinterherhinkt.
PB 4.30 und 4.20
Code: Alles auswählen
Structure GfxRes
ResIndex.i
Sprite.i
Sprite3D.i
EndStructure
Structure Animation
RunTime.i
FrameCnt.i
FrameShowTime.LArray
FrameSprite.LArray
FrameSprite3D.LArray
EndStructure
Global Dim Animations.Animation(0)
Global AnimationsCnt.i = -1
;returns the sprite handle of the actual animation frame
;TimeIndex will be set to the new real time index
Procedure.i GfxGetAnimFrame(AnimIndex.i, *TimeIndex.Integer)
Define.i i, AnimTime, Rounds, CompRoundTime
While AnimTime + LA_Get(Animations(AnimIndex)\FrameShowTime, i) < *TimeIndex\i
AnimTime = AnimTime + LA_Get(Animations(AnimIndex)\FrameShowTime, i)
i + 1
If i = Animations(AnimIndex)\FrameCnt
i = 0
EndIf
Wend
Rounds = AnimTime / Animations(AnimIndex)\RunTime
CompRoundTime = Rounds * Animations(AnimIndex)\RunTime
*TimeIndex\i = *TimeIndex\i - CompRoundTime
ProcedureReturn LA_Get(Animations(AnimIndex)\FrameSprite3D, i)
EndProcedure
;creates a animation from sprites with fix show time for each sprite
;returns the animation index of the new animation
Procedure.i GfxCreateSmplAnim(Frames.GfxRes())
Define.i Result
AnimationsCnt + 1
ReDim Animations.Animation(AnimationsCnt)
FirstElement(Frames())
Animations(AnimationsCnt)\FrameCnt + 1
LA_Add(Animations(AnimationsCnt)\FrameShowTime, 100, 1)
LA_Add(Animations(AnimationsCnt)\FrameSprite,Frames()\Sprite, 1)
LA_Add(Animations(AnimationsCnt)\FrameSprite3D,Frames()\Sprite3D, 1)
Repeat
Result = NextElement(Frames())
If Result <> 0
Animations(AnimationsCnt)\FrameCnt + 1
LA_Add(Animations(AnimationsCnt)\FrameShowTime, 100, 1)
LA_Add(Animations(AnimationsCnt)\FrameSprite, Frames()\Sprite, 1)
LA_Add(Animations(AnimationsCnt)\FrameSprite3D, Frames()\Sprite3D, 1)
EndIf
Until Result = 0
Animations(AnimationsCnt)\RunTime = Animations(AnimationsCnt)\FrameCnt * 100
ProcedureReturn AnimationsCnt
EndProcedure
Ich habe eine globale Zeitvariable. Das heisst ich ermittle nur einmal, wieviel Zeit seid dem letzten Durchlauf der Schleife vergangen ist und nutze diesen Wert in allen Timebased-Angelegenheiten. Und das sind ne Menge bei dem Spiel. Hab alles timebased gemacht.
Der Zeitindex (TimeIndex), den die Prozedur erwartet ist einfach der Zeitindex der Animation also bei welcher Zeit die Animation gerade steht. Dafür nehme ich den aktuell hinterlegten Zeitindex der Animation, welcher dem der letzten Anzeige entspricht. Und rechne da meine Updatezeit drauf. Also die Zeit, die seid dem letzten Durchlauf der Gameloop vergangen ist. Der Zeitindex kann dabei auch größer sein als die Animation. Die Prozedur berechnet wie oft die Animation durchgelaufen wäre und korrigiert den Zeitindex entsprechend.
Ist vieleicht nicht ganz optimal, war das erste mal das ich timebased Animations programmiert hab. Aber ich halte es für sehr flexibel. Z.B. kann man damit ja auch eine Animation bei einem beliebigen Zeitindex starten. Kann ja sein man möchte eine Animation in der Mitte beginnen. Ausserdem wird so nicht zwingend jeder Frame angezeigt, nur wenn es die Performance zulässt. Sehr wichtig für Multiplayerspiele damit nicht der eine Client dem anderen hinterherhinkt.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.
Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke!
Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke!
