Frames-Ruckel-Problem

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Swordfish

Betreff: Frames-Ruckel-Problem

BeitragDi, März 29, 2005 21:56
Antworten mit Zitat
Benutzer-Profile anzeigen
So ich bin schon eine ganze Weile an meinem ersten Spiel (natürlich ein Space-Shooter) am basteln, aber ich scheitere kläglich an meinem Frames Problem:
Durch "Flip" habe ich natürlich immer genau soviele FPS im Spiel wie Hz des Monitors. Leider ist das absolut unschön für mein Spiel, da das Spiel dann auf unterschiedlichen PCs unterschiedlich schnell läuft, zB. die Geschwindigkeit, mit der die Sterne runterscrollen (1pixel pro frame).
Meine unschöne Lösung dazu sieht so aus:
BlitzBasic: [AUSKLAPPEN]
 ;*** Framessperre ***
If fps>87 Then maxfps = 12
ms=MilliSecs()
If ms-timer>=maxfps Then
timer=ms
Cls
;***spielcode usw. ***
EndIf

Leider gibt das unschöne Ruckler zwischendurch, und das sieht ganz schön dämlich aus. Das Spiel wird unspielbar.
Gebt mir ein Tipp was ich hier machen kann.

Zudem würde ich gerne wissen wie diese Framesperre hier funktioniert, entnommen aus dem Blitz2D Sample "insectoids.bb":
BlitzBasic: [AUSKLAPPEN]
While Not KeyHit(1)
n_time=MilliSecs()
elapsed=n_time-time´
If elapsed>25 ;slowing down! - clamp update to 40 FPS (1000/40=25 millisecs)
cnt=elapsed/25

For k=1 To cnt
UpdateGame()
Next
time=time+cnt*25
Else ;leave frame synced...
UpdateGame()
time=n_time
EndIf
RenderGame()
Flip
Wend


Ich bendanke mich.
 

Dreamora

BeitragDi, März 29, 2005 22:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Als Anfänger könntest du immerhin versuchen "Suchen" zu nutzen oder in die FAQ & Tutorial Sektion zu schauen ...

Die ganzen User hier schreiben die Tutorials nämlich nicht aus reiner Langeweile:

https://www.blitzforum.de/viewtopic.php?t=3065
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Hubsi

BeitragDi, März 29, 2005 22:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Kompliziertere, aber recht elegante Lösung ist das ganze frameunabhängig zu programmieren, Suco-X hat dazu mal ein Tut geschrieben, wenn ich nicht irre. Zweite Möglichkeit wäre Flip 0 und Waittimer zu verwenden. Mehr fällt mir spontan nicht ein, rate Dir aber zur ersten Lösung Very Happy

Edit: Zu spät und dann auch noch den Author verdreht Very Happy IonPainter hat das Tut gemacht Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...
  • Zuletzt bearbeitet von Hubsi am Di, März 29, 2005 22:08, insgesamt einmal bearbeitet
 

konstantin

BeitragDi, März 29, 2005 22:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Schau in der Onlinehilfe mal nach WaitTimer und CreateTimer.
Es gibt ähnliche Codes wie Dein Sample, die findest du schnell mit der Suche.

Swordfish

BeitragDi, März 29, 2005 22:11
Antworten mit Zitat
Benutzer-Profile anzeigen
@ Dreamora
Nun ich habe mir schon einige Tuts durchgelesen, aber auch bei dem verlinkten Tutorial steht nicht, wie mach das ganze ohne Delay bzw ohne Ruckeln im Spiel hinbekommt. Trozdem danke.
 

Dreamora

BeitragDi, März 29, 2005 22:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Problem ist, du versuchst tweening nachzubauen (der zweite Source den du hast), was eine der zwei Möglichkeiten für frameunabhängige Programmierung ist.

Nur hast du leider nicht verstanden wie er funktioniert, weswegen er bei dir nicht "fliessend" läuft sondern durch die Ifs Zeitsprünge drin hat. Das ist allerdings nicht schlimm, denke damit haben noch so einige Probleme (ich habe den Sinn darin bis heute nicht so wirklich erkannt. Vielleicht bei 3D mit animierten Objekten, aber ansonsten net).


Die andere Variante ist alle deine Bewegungswerte ( oder veränderungswerte im allgemeinen ) einfach durch FPS zu teilen bevor du sie zuweist und Flip 0 benutzen. Dadurch gibt es einen konstanten Wert der pro Sekunde genommen wird welcher für jedes System gleich ist.

Dann sollte das eigentlich klappen.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Suco-X

Betreff: ......

BeitragDi, März 29, 2005 22:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Das oben ist zwar eine Lösung, aber wegen den Stufungen ist das schlechter Übergang. Ruckel Ruckel. Habe mal ein Beispiel mit der anderen Möglichkeit gemacht, das mir persönlich am besten liegt.
Code: [AUSKLAPPEN]

Graphics 1024,768,16,1
SetBuffer BackBuffer()



Type TStar
   Field x#, y#
   Field Speed#
End Type


Function CreateStar(x#,y#,Speed#)
   Local TempStar.TStar = New TStar
   TempStar\x = x
   TempStar\y = y
   TempStar\Speed = Speed
End Function


Function RenderAndUpdateStars()
   For TempStar.TStar = Each TStar

      
      TempStar\x = TempStar\x-(GameSpeed*TempStar\Speed)
      Plot TempStar\x, TempStar\y
      
      
      If TempStar\x<0
         Delete TempStar
      EndIf
      
      
   
   Next
End Function



Global LoopStart = MilliSecs()
Global GameSpeed# = 0.0
Global WunschFPS = 60




Local FPS, TFPS,FpsStart

Local StarTimer = MilliSecs()

Repeat
Cls

GameSpeed = MilliSecs()-LoopStart
GameSPeed = (GameSpeed/1000.0)*WunschFPS
LoopStart = MilliSecs()



If MilliSecs()-StarTimer=>50
   CreateStar(GraphicsWidth(),Rnd(0,GraphicsHeight()),2.0+Rnd(0.1,7.0))
   StarTimer = MilliSecs()
EndIf


TFPS = TFPS+1

If MilliSecs()-FpsStart>1000
   FPS = TFPS
   TFPS = 0
   FpsStart = MilliSecs()
EndIf



RenderAndUpdateStars()


Text 0,0,"FPS: "+FPS

Flip 0
Until KeyHit(1)


Wichtig hierbei ist natürlich das die Bewegungen mit Floats berechnet werden. Zu jeder Bewegung im Game wird GameSpeed Multipliziert und gut ist. Nur mal als schubs in eine Richtung.
Ah, Sorry wegen Plot. Wollte aber nicht durch komplexere Sachen wie WritePixelFast vom eigentlichen Sinn des Sources ablenken
Mfg Suco
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB

Swordfish

BeitragMi, März 30, 2005 16:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Wohhooo! Danke - so klappts wie ich mir das vorgestellt habe ! Very Happy

Suco-X

Betreff: ........

BeitragDo, März 31, 2005 15:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Np. Falls du noch fragen dazu hast, fragen.
Mfg Suco
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group