Ein paar Sprite-Fragen

Anfängerfragen zum Programmieren mit PureBasic.
northstarex
Beiträge: 103
Registriert: 25.08.2013 18:04
Computerausstattung: alles mögliche^^
Wohnort: Schöppenstedt
Kontaktdaten:

Ein paar Sprite-Fragen

Beitrag 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?
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Ein paar Sprite-Fragen

Beitrag 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
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
northstarex
Beiträge: 103
Registriert: 25.08.2013 18:04
Computerausstattung: alles mögliche^^
Wohnort: Schöppenstedt
Kontaktdaten:

Re: Ein paar Sprite-Fragen

Beitrag 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.
Zuletzt geändert von northstarex am 09.02.2021 14:51, insgesamt 1-mal geändert.
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8679
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Ein paar Sprite-Fragen

Beitrag 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:
Bild
northstarex
Beiträge: 103
Registriert: 25.08.2013 18:04
Computerausstattung: alles mögliche^^
Wohnort: Schöppenstedt
Kontaktdaten:

Re: Ein paar Sprite-Fragen

Beitrag 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.
Bild
Benutzeravatar
HeX0R
Beiträge: 2959
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: Ein paar Sprite-Fragen

Beitrag 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.
northstarex
Beiträge: 103
Registriert: 25.08.2013 18:04
Computerausstattung: alles mögliche^^
Wohnort: Schöppenstedt
Kontaktdaten:

Re: Ein paar Sprite-Fragen

Beitrag 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:
Bild
Antworten