Seite 1 von 1

Transparentes Sprite ist nicht transparent

Verfasst: 05.08.2015 00:46
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

Re: Transparentes Sprite ist nicht transparent

Verfasst: 06.08.2015 00:36
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?

Re: Transparentes Sprite ist nicht transparent

Verfasst: 06.08.2015 07:35
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.... ;)

Re: Transparentes Sprite ist nicht transparent

Verfasst: 10.08.2015 01:00
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.