Transparent Sprite

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

Transparent Sprite

Beitrag 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 :)
Bild
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Transparent Sprite

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

Re: Transparent Sprite

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

Re: Transparent Sprite

Beitrag 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
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: Transparent Sprite

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

Re: Transparent Sprite

Beitrag 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.
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: Transparent Sprite

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

Re: Transparent Sprite

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