Seite 1 von 1

Ein paar Sprite-Fragen

Verfasst: 09.02.2021 01:51
von northstarex
Ich habe da noch mal ein paar Fragen über Sprites.

Wenn ich einen transparenten Sprite über einen anderen Sprite lege, dann ist der Sprite nicht mehr transparent. Wenn ich diesen dann noch bewegen lassen, dann zieht der obere, nicht mehr transparente Spite auch noch einen Schwanz hinter sich. Auf den Screen, ohne hinter-gelegten Sprite selber kappt alles - also mit der Transparenz und Bewegung.

ClearScreen(RGB(0,0,0))
DisplaySprite(2,0,0)
DisplayTransparentSprite(3,spx,440)

Ich denke da fehlt wieder mal ein Befehl oder was mache ich da falsch?


das nächste ist, wie ändere ich die Sprite Priorität, also ein in Vordergrund liegender Sprite in den Hintergrund legen?

Re: Ein paar Sprite-Fragen

Verfasst: 09.02.2021 10:56
von STARGÅTE
northstarex hat geschrieben:Wenn ich einen transparenten Sprite über einen anderen Sprite lege, dann ist der Sprite nicht mehr transparent. Wenn ich diesen dann noch bewegen lassen, dann zieht der obere, nicht mehr transparente Spite auch noch einen Schwanz hinter sich. Auf den Screen, ohne hinter-gelegten Sprite selber kappt alles - also mit der Transparenz und Bewegung.
Ich frage mich immer, was du da machst? Hier mal ein Beispiel was ohne Probleme funktioniert:

Code: Alles auswählen

Enumeration
	#Window
	#Sprite1
	#Sprite2
	#Sprite3
EndEnumeration


InitSprite()

OpenWindow(#Window, 0, 0, 960, 540, "Graphics", #PB_Window_ScreenCentered|#PB_Window_MinimizeGadget)
OpenWindowedScreen(WindowID(#Window), 0, 0, WindowWidth(#Window), WindowHeight(#Window))

CreateSprite(#Sprite1, 128, 128, #PB_Sprite_AlphaBlending)
If StartDrawing(SpriteOutput(#Sprite1))
	Box(0, 0, 128, 128, $FF00FF)
	Circle(64, 64, 64, $00FF00)
	StopDrawing()
EndIf

CreateSprite(#Sprite2, 128, 128, #PB_Sprite_AlphaBlending)
If StartDrawing(SpriteOutput(#Sprite2))
	Box(0, 0, 128, 128, $FF00FF)
	Circle(64, 64, 64, $0000FF)
	StopDrawing()
EndIf

CreateSprite(#Sprite3, 128, 128, #PB_Sprite_AlphaBlending)
If StartDrawing(SpriteOutput(#Sprite3))
	Box(0, 0, 128, 128, $FF00FF)
	Circle(64, 64, 64, $FF0000)
	StopDrawing()
EndIf

TransparentSpriteColor(#Sprite1, $FF00FF)
TransparentSpriteColor(#Sprite2, $FF00FF)
TransparentSpriteColor(#Sprite3, $FF00FF)

Repeat
	
	Repeat
		
		Select WindowEvent()
			Case #PB_Event_None
				Break
			Case #PB_Event_CloseWindow
				Break 2
		EndSelect
		
	ForEver
	
	ClearScreen($000000)
	
	DisplayTransparentSprite(#Sprite1, Cos(ElapsedMilliseconds()*0.001)*100+200, 100)
	DisplayTransparentSprite(#Sprite2, Sin(ElapsedMilliseconds()*0.001)*100+200, 150)
	DisplayTransparentSprite(#Sprite3, -Cos(ElapsedMilliseconds()*0.001)*100+200, 200)
	
	FlipBuffers()
	
ForEver

End
northstarex hat geschrieben:das nächste ist, wie ändere ich die Sprite Priorität, also ein in Vordergrund liegender Sprite in den Hintergrund legen?
Die "Priorität" wie du sie nennst, gibt es in PureBasic nicht, die Zeichenreihenfolge ist exakt die Reihenfolge der Aufrufe von DisplaySprite / DisplayTransparentSprite

Re: Ein paar Sprite-Fragen

Verfasst: 09.02.2021 14:01
von northstarex
Ich frage mich auch mittlerweile was ich hier mache :wink:

Nur zum Verständnis: Ich will für mich nur ein Tool zusammenschrauben, damit ich mal ohne große Neueinarbeitung unterschiedliche Routinen zu Hand habe. Alles andere hat soweit wunderbar geklappt, nur beim Thema Sprite bin ich hängengeblieben - was ich eigentlich dachte, dass dieses ganz easy ist.

Hier nun dein Script, mit einigen Änderungen von mir. Diese habe ich mit ";---------------" markiert.

Da wirst du sehen das es nun nicht mehr geht mit der Transparenz und Schmier-freien Bewegung.

Code: Alles auswählen


Enumeration
   #Window
   #Sprite1
   #Sprite2
   #Sprite3
   #Sprite4
EndEnumeration


InitSprite()

  UseJPEGImageDecoder()      ;<----------------------
  LoadImage(2,"pac2.jpg")    ;<---------------------- geht irgend ein jpg mit 960x540px

OpenWindow(#Window, 0, 0, 960, 540, "Graphics", #PB_Window_ScreenCentered|#PB_Window_MinimizeGadget)
OpenWindowedScreen(WindowID(#Window), 0, 0, WindowWidth(#Window), WindowHeight(#Window))

       StartDrawing(ScreenOutput()) ;<----------------------
       DrawImage(ImageID(2),0,0)    ;<----------------------
       StopDrawing()                ;<----------------------

CreateSprite(#Sprite1, 128, 128, #PB_Sprite_AlphaBlending)
If StartDrawing(SpriteOutput(#Sprite1))
   Box(0, 0, 128, 128, $FF00FF)
   Circle(64, 64, 64, $00FF00)
   StopDrawing()
EndIf

CreateSprite(#Sprite2, 128, 128, #PB_Sprite_AlphaBlending)
If StartDrawing(SpriteOutput(#Sprite2))
   Box(0, 0, 128, 128, $FF00FF)
   Circle(64, 64, 64, $0000FF)
   StopDrawing()
EndIf

CreateSprite(#Sprite3, 128, 128, #PB_Sprite_AlphaBlending)
If StartDrawing(SpriteOutput(#Sprite3))
   Box(0, 0, 128, 128, $FF00FF)
   Circle(64, 64, 64, $FF0000)
   StopDrawing()
EndIf

TransparentSpriteColor(#Sprite1, $FF00FF)
TransparentSpriteColor(#Sprite2, $FF00FF)
TransparentSpriteColor(#Sprite3, $FF00FF)

Repeat
   
   Repeat
      
      Select WindowEvent()
         Case #PB_Event_None
            Break
         Case #PB_Event_CloseWindow
            Break 2
      EndSelect
      
   ForEver
   
          GrabSprite(#Sprite4, 0,0,960, 540)                            ;<------------------------- oder gibt es was anderes um einen kompl. Screenshot zu erstellen?
          
          ClearScreen($000000)
          
          DisplaySprite(#Sprite4,0,0)                                   ;<-------------------------
   
   DisplayTransparentSprite(#Sprite1, Cos(ElapsedMilliseconds()*0.001)*100+200, 100)
   DisplayTransparentSprite(#Sprite2, Sin(ElapsedMilliseconds()*0.001)*100+200, 150)
   DisplayTransparentSprite(#Sprite3, -Cos(ElapsedMilliseconds()*0.001)*100+200, 200)
   
   FlipBuffers()
   
ForEver

End



Grabsprite benutze ich deswegen, weil sich der Hintergrund z.b. durch Texte ändert. Kann mir noch vorstellen, dass der erzeugte Sprite von Grabsprite zu groß ist. Aber ich habe alles es erst mal so gelassen. Bin gespannt.

Re: Ein paar Sprite-Fragen

Verfasst: 09.02.2021 14:40
von NicTheQuick
Wieso lädst du pac2.jpg als Image und malst es dann nur einmal auf den Screen? Wenn es nur einmal gezeichnet wird, dann wird es ja auch nie wieder aufgefrischt, nachdem du etwas neues darüber gezeichnet hast. Du solltest pac2.jpg als Sprite laden und ebenfalls immer wieder vor allen anderen Sprites zeichnen.

Außerdem ist das hier überflüssig:

Code: Alles auswählen

          GrabSprite(#Sprite4, 0,0,960, 540)                            ;<------------------------- oder gibt es was anderes um einen kompl. Screenshot zu erstellen?
         
          ClearScreen($000000)
         
          DisplaySprite(#Sprite4,0,0)                                   ;<-------------------------
Du speicherst das aktuelle Bild, löscht den Bildschirm, und schreibst es dann wieder. Dann kannst du die drei Zeilen ja gleich ganz weg lassen. :wink:

Re: Ein paar Sprite-Fragen

Verfasst: 09.02.2021 14:49
von northstarex
wie ich schon schrieb. im eigentlichen Programm verändert sich der Hintergrund immer wieder mal. Das ist erst mal egal wie der Hintergrund aufgebaut wird. Das Prg hier dient nur als Beispiel. Aber das ändert ja an dem Sprite Darstellungsproblem nichts.

Re: Ein paar Sprite-Fragen

Verfasst: 09.02.2021 16:47
von HeX0R
überleg doch mal:

Schleifestart
1 Du kopierst den ganzen Screen
2 löschst den ganzen Screen
3 Schreibst den vorher kopierten Screen zurück (ergo: Du bist im selben Zustand wie bei Schritt 1, daher völlig sinnlos)
4 malst drei Sprites auf den Screen
5 springst zum Schleifenstart, was passiert nun?
1 Du kopierst den ganzen Screen INKLUSIVE der drei vorher aufgemalten Sprites!

Also mit jeder weiteren Schleife siehst Du mehr von Deinen Sprites, die dann wie "Schlieren" dargestellt werden.

Re: Ein paar Sprite-Fragen

Verfasst: 09.02.2021 17:29
von northstarex
aaarrrrrrrrrr... das grabben muss vor dem Repeart.... ja klar.


manchmal wird man schon blind bei den einfachsten Abläufen. :shock:


Danke dir :allright: :allright: :allright: :allright: