sanfte/weiche Bewegung in Spiele
-
- Beiträge: 32
- Registriert: 14.06.2015 10:23
sanfte/weiche Bewegung in Spiele
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 ?
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
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
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)
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
Signatur und so
-
- Beiträge: 32
- Registriert: 14.06.2015 10:23
Re: sanfte/weiche Bewegung in Spiele
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?
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?
-
- Beiträge: 32
- Registriert: 14.06.2015 10:23
Re: sanfte/weiche Bewegung in Spiele
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.....
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
- NicTheQuick
- Ein Admin
- Beiträge: 8809
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Re: sanfte/weiche Bewegung in Spiele
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.

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
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.
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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
- NicTheQuick
- Ein Admin
- Beiträge: 8809
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Re: sanfte/weiche Bewegung in Spiele
Weiß jemand, warum da unter Linux einfach nur ein schwarzes Bild ist und rein gar nichts angezeigt wird? 

- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Re: sanfte/weiche Bewegung in Spiele
Dann stimmt mit Deiner Configuration was nicht! Wenn Du den Code von STARGÅTE meinst, der Funktioniert wunderbar.NicTheQuick hat geschrieben:Weiß jemand, warum da unter Linux einfach nur ein schwarzes Bild ist und rein gar nichts angezeigt wird?

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Re: sanfte/weiche Bewegung in Spiele
Linux halt. Mit Windows wär das nich passiert. Bei Windows läuft und funktioniert problemlos wie immer.NicTheQuick hat geschrieben:Weiß jemand, warum da unter Linux einfach nur ein schwarzes Bild ist und rein gar nichts angezeigt wird?
PB 5.41 x64