sanfte/weiche Bewegung in Spiele

Anfängerfragen zum Programmieren mit PureBasic.
SilverSurfer
Beiträge: 32
Registriert: 14.06.2015 10:23

sanfte/weiche Bewegung in Spiele

Beitrag 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 ?
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: sanfte/weiche Bewegung in Spiele

Beitrag von RSBasic »

Benutzt du zufällig eine Ganzzahl-Variable für die Bewegungsposition? Versuche mal mit Float und addiere beispielsweise 0.10.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

Re: sanfte/weiche Bewegung in Spiele

Beitrag 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
Signatur und so
SilverSurfer
Beiträge: 32
Registriert: 14.06.2015 10:23

Re: sanfte/weiche Bewegung in Spiele

Beitrag 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?
SilverSurfer
Beiträge: 32
Registriert: 14.06.2015 10:23

Re: sanfte/weiche Bewegung in Spiele

Beitrag 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
Benutzeravatar
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

Beitrag von NicTheQuick »

Rasterstrahl? :lol:
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.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: sanfte/weiche Bewegung in Spiele

Beitrag 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
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
Benutzeravatar
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

Beitrag von NicTheQuick »

Weiß jemand, warum da unter Linux einfach nur ein schwarzes Bild ist und rein gar nichts angezeigt wird? :?
Benutzeravatar
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

Beitrag 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.
Bild

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.
Bild
Benutzeravatar
Tommy
Spassvogel
Beiträge: 319
Registriert: 17.10.2013 14:36

Re: sanfte/weiche Bewegung in Spiele

Beitrag 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.
PB 5.41 x64
Antworten