a

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
DenKle
Beiträge: 16
Registriert: 30.10.2008 20:30

a

Beitrag von DenKle »

a
Zuletzt geändert von DenKle am 18.03.2010 15:18, insgesamt 4-mal geändert.
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Beitrag von Thorium »

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

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
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.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Antworten