Seite 1 von 3
sanfte/weiche Bewegung in Spiele
Verfasst: 14.06.2015 10:31
von SilverSurfer
Hallo Leute...
Ich Frage mich wie man eine gaaanz langsame Bewegung hin bekommt, ohne das es ruckelig wirkt. In vielen Spielen sehe ich das und wundere mich, wie das funktioniert.
Wenn ich ein Objekt mit 25 FPS bewege, ist es ja noch ziemlich schnell. Wie kann ich es ganz langsam, sagen wir mal wie in Zeitlupe, über den Bildschirm bewegen? Gibt es da einen Trick ?
Re: sanfte/weiche Bewegung in Spiele
Verfasst: 14.06.2015 12:09
von RSBasic
Benutzt du zufällig eine Ganzzahl-Variable für die Bewegungsposition? Versuche mal mit Float und addiere beispielsweise 0.10.
Re: sanfte/weiche Bewegung in Spiele
Verfasst: 14.06.2015 12:33
von Derren
Dann bewegt er sich zwar langsam, aber es ruckelt trotzdem noch von Pixel zu Pixel und ist keine flüssige Bewegung.
Sowas müsste man dann mit Antialiasing machen. Eine Funktion gibt es dafür meines Wissens nach nicht. Zumindest nicht in der 2D-Ebene.
Hier mal kurz das Beispiel aus der Hilfe mit angepasst. Das ist kein echtes Antialiasing aber könnte in die richtige Richtung gehen (wenn man das Geflacker wegen der Intensität in den Griff bekommt)
Code: Alles auswählen
Define x.i
Define int.i
If InitSprite() = 0
MessageRequester("Error", "Can't open screen & sprite environment!", 0)
End
EndIf
If OpenWindow(0, 0, 0, 320, 200, "A screen in a window...", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_ScreenCentered)
CreateStatusBar(0, WindowID(0))
AddStatusBarField(320)
StatusBarText(0, 0, "Automatically zoomed screen area when changing window size...")
If OpenWindowedScreen(WindowID(0), 0, 0, 320, 200, #True, 0, 20)
;- Erstelle Sprite mit Alphablending
CreateSprite(0, 50, 50,#PB_Sprite_AlphaBlending ) ; Create an empty sprite, will be whole black
Repeat
; It's very important to process all the events remaining in the queue at each frame
;
Repeat
Event = WaitWindowEvent(10)
If Event = #PB_Event_CloseWindow
End
EndIf
Until Event = 0
FlipBuffers()
ClearScreen($FFEEEE)
;- Zeige Sprite 2 mal an (Position x und x+1) mit gegenläufiger Intensität (Transparenz)
DisplayTransparentSprite(0, x, 100, 255-int)
DisplayTransparentSprite(0, x+1, 100, int)
int+5 ;-Erhöhe Intensität langsam, bei Erreichen von Max (=255) wird x um 1 erhöht.
If int>=255 ; Somit "sollte" eine langsame und flüssige Bewegung entstehen
int=0
x+1
EndIf
ForEver
Else
MessageRequester("Error", "Can't open windowed screen!", 0)
EndIf
EndIf
Re: sanfte/weiche Bewegung in Spiele
Verfasst: 14.06.2015 12:54
von SilverSurfer
Ja Derren, so ungefähr. Ich wüsste aber keine Lösung für das Flackern.
Keine Ahnung ob der Ansatz richtig wäre, oder meine Idee, ist es möglich den Rasterstrahl zu beeinflussen?
Wäre es auf diesem Weg Möglich?
Re: sanfte/weiche Bewegung in Spiele
Verfasst: 14.06.2015 15:04
von SilverSurfer
Bei diesem Beispiel sieht man es nicht mehr. Ich jedenfalls. Aber ob ich das auch auf einen Ball oder so anwenden kann?
Wohl kaum.....

Und wie sollte das in verschiedenen Richtungen zu lösen sein ?
Fragen über Fragen.....
Code: Alles auswählen
Define x.f
Define int.f
If InitSprite() = 0
MessageRequester("Error", "Can't open screen & sprite environment!", 0)
End
EndIf
If OpenWindow(0, 0, 0, 320, 200, "A screen in a window...", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_ScreenCentered)
CreateStatusBar(0, WindowID(0))
AddStatusBarField(320)
StatusBarText(0, 0, "Automatically zoomed screen area when changing window size...")
If OpenWindowedScreen(WindowID(0), 0, 0, 320, 200, #True, 0, 20)
;- Erstelle Sprite mit Alphablending
CreateSprite(0, 48, 50,#PB_Sprite_AlphaBlending ) ; Create an empty sprite, will be whole black
CreateSprite(1,1,50,#PB_Sprite_AlphaBlending )
Repeat
; It's very important to process all the events remaining in the queue at each frame
;
Repeat
Event = WaitWindowEvent(10)
If Event = #PB_Event_CloseWindow
End
EndIf
Until Event = 0
FlipBuffers()
ClearScreen($FFEEEE)
;- Zeige Sprite 2 mal an (Position x und x+1) mit gegenläufiger Intensität (Transparenz)
DisplayTransparentSprite(1, x, 100, 255-int)
DisplayTransparentSprite(0, x+1, 100, 255)
DisplayTransparentSprite(1, x+49, 100, int)
int+5 ;-Erhöhe Intensität langsam, bei Erreichen von Max (=255) wird x um 1 erhöht.
If int>=255 ; Somit "sollte" eine langsame und flüssige Bewegung entstehen
int=0
x+1
EndIf
ForEver
Else
MessageRequester("Error", "Can't open windowed screen!", 0)
EndIf
EndIf
Re: sanfte/weiche Bewegung in Spiele
Verfasst: 14.06.2015 18:14
von NicTheQuick
Rasterstrahl?
Sowas gibt es heute nicht mehr. Selbst mit einem Röhrenbildschirm kannst du den Rasterstrahl nicht mehr beeinflussen, wenn du eine aktuelle Grafikkarte nutzt.
Versuch lieber mal 3D Sprites zu benutzen und TransformSprite. Hab leider kein Purebasic zur Hand.
Re: sanfte/weiche Bewegung in Spiele
Verfasst: 14.06.2015 20:41
von STARGÅTE
Hier ist ein Beispielcode von mir, wie man "weiche" Pixelbewegungen realisieren kann (oben ohne, und unten mit).
Natürlich auf Kosten einer gewissen Unschärfe, die man jedoch nicht ganz verhindern kann, da es nun mal keine Subpixel gibt.
Code: Alles auswählen
InitSprite()
UsePNGImageDecoder()
Enumeration
#Window
#Sprite
EndEnumeration
OpenWindow(#Window, 0, 0, 300, 300, "Sprite", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(#Window), 0, 0, WindowWidth(#Window), WindowHeight(#Window), 0, 0, 0)
SpriteQuality(#PB_Sprite_BilinearFiltering)
CreateSprite(#Sprite, 32, 32)
StartDrawing(SpriteOutput(#Sprite))
Box(10, 1, 2, 30, $FF8080)
Box(16, 1, 2, 30, $80FF80)
Box(22, 1, 2, 30, $8080FF)
Line(1, 16, 30, 1, $FFFFFF)
StopDrawing()
Define Start = ElapsedMilliseconds()
Define X.f
Repeat
Repeat
Select WindowEvent()
Case #PB_Event_CloseWindow
End
Case #Null
Break
EndSelect
ForEver
ClearScreen(0)
X = 50+(ElapsedMilliseconds()-Start)/1000
ZoomSprite(#Sprite, 32, 32)
DisplaySprite(#Sprite, X, X)
TransformSprite(#Sprite, X, X+50, X+SpriteWidth(#Sprite), X+50, X+SpriteWidth(#Sprite), X+50+SpriteHeight(#Sprite), X, X+50+SpriteHeight(#Sprite))
DisplaySprite(#Sprite, 0, 0)
FlipBuffers()
ForEver
Re: sanfte/weiche Bewegung in Spiele
Verfasst: 15.06.2015 12:36
von NicTheQuick
Weiß jemand, warum da unter Linux einfach nur ein schwarzes Bild ist und rein gar nichts angezeigt wird?

Re: sanfte/weiche Bewegung in Spiele
Verfasst: 15.06.2015 13:16
von ts-soft
NicTheQuick hat geschrieben:Weiß jemand, warum da unter Linux einfach nur ein schwarzes Bild ist und rein gar nichts angezeigt wird?

Dann stimmt mit Deiner Configuration was nicht! Wenn Du den Code von STARGÅTE meinst, der Funktioniert wunderbar.
Gruß
Thomas
Re: sanfte/weiche Bewegung in Spiele
Verfasst: 15.06.2015 13:53
von Tommy
NicTheQuick hat geschrieben:Weiß jemand, warum da unter Linux einfach nur ein schwarzes Bild ist und rein gar nichts angezeigt wird?

Linux halt. Mit Windows wär das nich passiert. Bei Windows läuft und funktioniert problemlos wie immer.