Seite 1 von 1

Transparent Sprite

Verfasst: 07.02.2021 15:44
von northstarex
Ich habe schon gesucht, probiert und nun muss ich doch mal fragen:

Ich hatte einen transparenten Sprite erstellt. Die Farbe 255,0,255 (rgb) soll transparent sein. Habe den Sprite als bmp oder png abgespeichert.

Sprite laden und anzeigen geht ja... nur die Farbe 255,0,255 (rgb) ist nicht transparent.

Kurzform Script:
LoadSprite(1,"spritebmp.bmp")
TransparentSpriteColor(1, RGB(255,0,255))
DisplayTransparentSprite(1,200,440)

So im großen und ganzen sollte der Scriptablauf richtig sein - denke ich mal.

Ich denke mal, dass liegt an der Grafik(sprite), dass ich diese nicht richtig abgespeichert habe. Welches Format soll der Sprite bekommen, welche Farbtiefe? Vielleicht liegt es ja daran.

Transparente PNGs gehen nicht reinzufällig? wenn ja, dann wie? Soll ja irgendwie gehen, aber nicht offiziell... hab ich gelesen :)

Wäre schön, wenn wer mal helfen könnte... thx :)

Re: Transparent Sprite

Verfasst: 07.02.2021 16:08
von Mijikai
Ich vermute das bei LoadSprite() nur #PB_Sprite_AlphaBlending fehlt.
PNGs funktionieren ohne Probleme man muss nur die PNG lib einbinden -> UsePNGImageDecoder().
Anmerkung: PureBasic ist eine Programmiersprache keine Scriptsprache!

Re: Transparent Sprite

Verfasst: 07.02.2021 23:07
von northstarex
irgendwie funktioniert das ganze nicht. In anderen Sprachen kenne ich das irgendwie anders.

Jetzt habe ich noch bemerkt das Sprite 1 sich anscheinend in den Hintergrund kopiert und dadurch einen unendlichen Schwanz hinter sich zieht, wenn er sich bewegt. Irgendwie bin ich da auf dem Holzweg... hatte ich so auch noch nicht.

Ich habe mal den Programmteil (sorry, ja, es ist in der Tat eine Programmiersprache ;) ) auf das anzeigen und bewegen von Sprite 1 reduziert. Auch da verhält sich Sprite 1 nicht so, wie man das so erwartet.

Code: Alles auswählen

If InitSprite() And InitKeyboard() = 0
    MessageRequester("Error", "Can't open screen & sprite environment!", 0)
    End
  EndIf
  
      OpenWindow(1, xborder, 0, 640, 480, "main", #PB_Window_BorderLess)
      OpenWindowedScreen(WindowID(1), 0, 0, 640, 480, #True, 0, 0, #PB_Screen_WaitSynchronization)
         UsePNGImageDecoder()
         LoadSprite(1,"scrollx.png", #PB_Sprite_AlphaBlending )
         
         TransparentSpriteColor(1, RGB(255,0,255))
         
         spx=641 
         Repeat
           ExamineKeyboard()
        
        taste$ = KeyboardInkey()
          
          If taste$="1" Or KeyboardPushed(#PB_Key_Escape)
            End
          EndIf
           
           spx=spx-2
         DisplaySprite (1,spx,400)
           FlipBuffers()
         ForEver

So sieht das ganze aus. In der Mitte ist der eigentliche Sprite und unter sieht man den Sprite, wenn er sich von rechts nach links bewegt
Bild

Fehlt da wieder was im PRG-Ablauf?

Ich hatte in älteren PB Projekten hier schon ab und zu transparente PNGs benutzt... meine ich mal :roll:

Re: Transparent Sprite

Verfasst: 08.02.2021 00:03
von STARGÅTE
Hallo northstarex,

dein Code ist so garnicht lauffähig, weil du zwar ein Fenster erstellst, aber keine Events des Fensters abfragst. Resultat ist, dass (zumindest bei mir) "keine Rückmeldung" kommt.
Das nächste ist, du brauchst ClearScreen() um den Bildschim nach dem Zeichnen eines Sprites wieder zu leeren.
Dann, damit deine transparente Farbe genutzt wird, musst du statt DisplaySprite, die Funktion DisplayTransparentSprite nutzen.

Code: Alles auswählen

If InitSprite() And InitKeyboard() = 0
	MessageRequester("Error", "Can't open screen & sprite environment!", 0)
	End
EndIf

OpenWindow(1, xborder, 0, 640, 480, "main", #PB_Window_BorderLess)
OpenWindowedScreen(WindowID(1), 0, 0, 640, 480, #True, 0, 0, #PB_Screen_WaitSynchronization)
UsePNGImageDecoder()
LoadSprite(1,"scrollx.png", #PB_Sprite_AlphaBlending )

TransparentSpriteColor(1, RGB(255,0,255))

spx=641
Repeat
	Repeat
		Select WindowEvent()
			Case #PB_Event_None
				Break
			Case #PB_Event_CloseWindow
				End
		EndSelect
	ForEver
	
	ExamineKeyboard()
	taste$ = KeyboardInkey()
	
	If taste$="1" Or KeyboardPushed(#PB_Key_Escape)
		End
	EndIf
	
	spx=spx-2
	ClearScreen(RGB(0,0,0))
	DisplayTransparentSprite(1,spx,400)
	FlipBuffers()
	
ForEver

Re: Transparent Sprite

Verfasst: 08.02.2021 02:50
von northstarex
ja... das hier ist nur ein mini Listing, da wo nur die von mir verwendete Sprite Befehle sehen kann. Laufen tut das Prg schon.

auch mit DisplayTransparentSprite hatte ich keinen transparenten Sprite.

Aber mit clearscreen lösche ich ja den ganzen Screen. Alles was vorher gezeichnet wurde ist ja denn weg.

Re: Transparent Sprite

Verfasst: 08.02.2021 05:37
von STARGÅTE
>> "auch mit DisplayTransparentSprite hatte ich keinen transparenten Sprite."
Bist du dir sicher dass dein Sprite wirklich die Farbe 255,0,255 hat?

>> "Aber mit clearscreen lösche ich ja den ganzen Screen. Alles was vorher gezeichnet wurde ist ja denn weg."
Ja natürlich. Mit jedem Aufruf von DisplayTransparentSprite wird etwas auf den Bildschrim gerendert, und das geht nicht automatisch weg, wenn du FlipBuffers() aufrufst, daher hättest du ohne ClearScreen() diese Schlieren.

Re: Transparent Sprite

Verfasst: 08.02.2021 12:16
von northstarex
ich habe zumindest das so im Photoshop stehen, die Farbe die Werte 255,0,255 hat. Ich muss das noch mal untersuchen, was da los ist. Ging ja bei anderen Projekten auch immer.

Also muss ich als Basic Anwender tatsächlich jedes mal den Hintergrund, da wo das Sprite grad ist, den Hintergrund grabben um den Sprite-Abdruck zu "löschen"?
Sorry, dass finde ich für Basic etwas befremdlich. Ich bin mal von ausgegangen, dass dieses automatisch geht. Ich progge gerne auf unterschiedlichen Sprachen, aber so was habe ich schon lange nicht mehr gesehen - jedenfalls nicht bewusst.


Edit:

also wenn ich den Screen einfach lösche, dann geht das jetzt mit dem transparenten Hintergrund bzw. Farbe.

Re: Transparent Sprite

Verfasst: 09.02.2021 01:11
von northstarex
Danke erstmal für die Infos und Hilfe :)

Vielleicht sollte ich mich doch mal auf eine Programmiersprache festlegen - nicht immer dieses mal hier mal da :wink: