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? :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.

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

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.