Transparentes Sprite ist nicht transparent

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Sven
Beiträge: 374
Registriert: 23.09.2004 12:01

Transparentes Sprite ist nicht transparent

Beitrag von Sven »

Laute PB-Hilfe wird standardmäßig Schwarz (0) als transparente Farbe genommen.
DisplayTransparentSprite(#Sprite, x, y [, Intensität [, Farbe]])
... Standardmäßig wird die Farbe 0 (schwarz) als transparente Farbe betrachtet (diese Farbe wird nicht angezeigt).


Allerdings hab ich mir heute ein Loch in den Bauch gewundert, warum mein Code nicht funktioniert, und das dann darauf eingrenzen können, daß man Schwarz explizit mit TransparentSpriteColor() als transparent setzen muß.

Ist die Hilfe hier falsch oder veraltet? Hab ich einen Verständnisfehler? Oder sollte das eigentlich anders sein.

Code: Alles auswählen

If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
  MessageRequester("Error", "Can't open the sprite system", 0)
  End
EndIf

If OpenWindow(0, 0, 0, 420, 420, "Gadget and sprites!", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_ScreenCentered)
  If OpenWindowedScreen(WindowID(0), 10, 10, 400, 400, 0, 0, 0)
    CreateSprite(0, 400, 400, #PB_Sprite_AlphaBlending)
    CreateSprite(1, 350, 20, #PB_Sprite_AlphaBlending)
    
    If StartDrawing(SpriteOutput(0))
      Box(0, 0, 400, 400, RGB(0, 0, 0))
      For k.l = 0 To 400 Step 5
        LineXY(0, 0, 400, k, Random($FFFFFF))
        LineXY(0, 0, k, 400, Random($FFFFFF))
      Next
      StopDrawing()
    EndIf
        
    If StartDrawing(SpriteOutput(1))
      Box(0, 0, 350, 20, RGB(0, 0, 0))
      DrawingMode(#PB_2DDrawing_Transparent)
      DrawText(10, 2, "ABCDEF ABCDEF ABCDEF ABCDEF ABCDEF", RGB(255, 255, 255))
      StopDrawing()
    EndIf
    
;    TransparentSpriteColor(1, RGB(0, 0, 0))
    
    DisplayTransparentSprite(0, 0, 0, 255)
    For k.l = 0 To 15
      DisplayTransparentSprite(1, 25, k * 22 + 10, k * 16)
    Next
        
    FlipBuffers()
    
    Repeat
      Event = WaitWindowEvent()
      Select Event
        Case #PB_Event_CloseWindow
          Quit = 1
      EndSelect
    Until Quit
  Else
    MessageRequester("Error", "Can't open windowed screen!", 0)
  EndIf
EndIf
Sven
Beiträge: 374
Registriert: 23.09.2004 12:01

Re: Transparentes Sprite ist nicht transparent

Beitrag von Sven »

Ich hab jetzt festgestellt, daß mir TransparentSpriteColor() mein Sprite komplett zerschießt, wenn ich es mehrfach benutze. Also ich zeichne Text auf das Sprite, lösche den mit einer Box, zeichne erneut Text, und nutze das Sprite zwischendurch immer wieder auf einem Screen. Vor der Anzeige muß ich jedesmal TransparentSpriteColor() mit 0 für Schwarz aufrufen.

Ab dem zweiten Aufruf stimmt mein Sprite in der Größe nicht mehr und es werden Stellen des alten Textes, der eigentlich durch die Box gelöscht werden sollte, mit dem neuen Text verknüpft. Irgendwas läuft da ziemlich schief.

Ärgerlich halt, weil das schonmal funktionierte. Denn der Code ist eine Überarbeitung aus einem alten Code für PB4.x wo ich das mit Sprite3D bzw. Sprite2D schonmal realisiert habe, damals mit DisplaySprite3D() bzw. DisplayTranslucentSprite().

Einzige Lösung, die ich sehe: Das Sprite jedesmal neu erzeugen. Wollte ich aus Performancegründen vermeiden, denn so muß jedesmal wieder neu Speicher zugewiesen werden. Oder fällt das nicht ins Gewicht?
Benutzeravatar
Bisonte
Beiträge: 2430
Registriert: 01.04.2007 20:18

Re: Transparentes Sprite ist nicht transparent

Beitrag von Bisonte »

Selbst wenn ich den StartDrawingBlock mit Sprite 1 per Schleife mehrmals neu zeichnen lasse, sehe ich nichts "zerstörtes".
Nach dem letzten Zeichnen auf dem Sprite muss man TransparentSpriteColor() aufrufen, nicht vor jedem anzeigen.

Aber sollte dich da irgendetwas stören...

Sprite freigeben und ein neues erstellen dauert nicht lange... kommt allerdings auf den Verwendungszweck und die Menge an.
Bei 2 Sprites ist es nicht zu bemerken.... ;)
PureBasic 6.10 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Sven
Beiträge: 374
Registriert: 23.09.2004 12:01

Re: Transparentes Sprite ist nicht transparent

Beitrag von Sven »

Bisonte hat geschrieben:Selbst wenn ich den StartDrawingBlock mit Sprite 1 per Schleife mehrmals neu zeichnen lasse, sehe ich nichts "zerstörtes".
Dazu muss der Text verändert sein, leider habe ich meine Testroutine gelöscht.

Ich erstelle jetzt das Sprite jedes Mal neu und zeichne statt des Outline-Textes eine semitransparente Box unter den Text. Sieht auch gut aus und ist zuverlässig.
Antworten