2DDrawing: Alphaimage in PB4.51

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Häns
Beiträge: 47
Registriert: 27.10.2007 14:30
Wohnort: Kölle

2DDrawing: Alphaimage in PB4.51

Beitrag von Häns »

Hallo, nach langer Zeit melde ich mal wieder...

Ich sitze z.Zt. am Projekt "Zeitschiene", in der -ähnlich wie beim EPG (Electronic Programming Guide)- auf Zeitschlitzen Balken verschiedener Länge mit Informationen dargestellt werden. Sie sollen auch bei bestimmten Situationen ihre Transparenz ändern. Da ich absoluter Beginner in Sache 2DDrawing und Alphakanal bin, möchte ich euch um Verbesserungsvorschläge bitten:

Code: Alles auswählen

;Test mit Alphakanal unter PB4.51
;dient nur zur Veranschaulichung und zum Testen
;DrawLBText aus PureBasic-Forum von TomS

Procedure DrawLBText(width, text.s)
    line.s=""
    y=20
    x=15
   
    k = CountString(text," ")

    For loop = 1 To k
      
      If TextWidth(line + StringField(text,loop," "))<width       
        line = line + StringField(text,loop," ")+" "
      Else
        DrawText(x,y,line,$FFFFFF)
        y+20
        line=StringField(text,loop," ")+" "
      EndIf
    Next
    
    line = line + StringField(text,loop," ")+" "
    DrawText(x,y,line,$FFFFFF)
                
  EndProcedure
  

If OpenWindow(0, 0, 0, 800, 600, "2DDrawing Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

  
  If CreateImage(0, 800, 600) And StartDrawing(ImageOutput(0))
    Box(0, 0, 800, 600, RGB(255, 255, 255))
      
    For x = 10 To 760 Step 50
       Line(x, 20, 1, 550, RGB(200, 200, 200))
    Next
    StopDrawing()
            
    ImageGadget(0, 0, 0, 0,0, ImageID(0))
          
  EndIf 
  
    
  If CreateImage(1, 300, 120,32) And StartDrawing(ImageOutput(1))

      DrawingMode(#PB_2DDrawing_AlphaChannel)
      Box(0, 0, 300, 120, $000000)

      DrawingMode(#PB_2DDrawing_AlphaBlend)
      RoundBox(0, 0, 300, 120, 20, 20,RGBA(0, 0, 0, 155))
       
      DrawingMode(#PB_2DDrawing_Gradient)      
      BackColor($B7C4FE)
      FrontColor($1944FA)
      LinearGradient(90, 10, 90, 40)    
      RoundBox(0, 0, 300, 120, 20, 20)

;       DrawAlphaImage(ImageID(1), 0, 0)  ??
  
      DrawingMode(#PB_2DDrawing_Transparent)
      DrawLBText(220,"10:00 - 12:00 Uhr Irgendeine tolle Sendung Nummer auf Pro8 oder wo war das?")  

      StopDrawing()
      
      
      ImageGadget(1, 100, 130, 0,0, ImageID(1))
      
    EndIf 
    
    If CreateImage(2, 600, 100,32) And StartDrawing(ImageOutput(2))

      DrawingMode(#PB_2DDrawing_AlphaChannel)
      Box(0, 0, 600, 100, $000000)

      DrawingMode(#PB_2DDrawing_AlphaBlend)
      RoundBox(0, 0, 600, 100, 20, 20,RGBA(0, 0, 0, 128))
       
      DrawingMode(#PB_2DDrawing_Gradient)      
      BackColor($A1FE9B)
      FrontColor($00FF00)
      LinearGradient(90, 10, 90, 40)    
      RoundBox(0, 0, 600, 100, 20, 20)
      
;       DrawAlphaImage(ImageID(2), 0, 0)
      
      DrawingMode(#PB_2DDrawing_Transparent)
      DrawLBText(420,"14:00 - 18:00 Uhr Sendung xy-aufgeklärt nicht verpassen!")
      
      StopDrawing()
      
      
      ImageGadget(2, 100, 300, 100,100, ImageID(2))
      
    EndIf 
    
    
    If CreateImage(3, 200, 100,32) And StartDrawing(ImageOutput(3))

      DrawingMode(#PB_2DDrawing_AlphaChannel)
      Box(0, 0, 200, 100, $000000)

      DrawingMode(#PB_2DDrawing_AlphaBlend)
      RoundBox(0, 0, 200, 100, 20, 20,RGBA(0, 0, 0, 255))
       
      DrawingMode(#PB_2DDrawing_Gradient)      
      BackColor($FEACAC)
      FrontColor($FF0000)
      LinearGradient(90, 10, 90, 40)    
      RoundBox(0, 0, 200, 100, 20, 20)
      
;       DrawAlphaImage(ImageID(3), 0, 0)
      
      DrawingMode(#PB_2DDrawing_Transparent)
      DrawLBText(220,"20:00 - 20:15 Uhr Tagesschau gucken!")

      StopDrawing()
      
      
      ImageGadget(3, 100, 450, 100,100, ImageID(3))
      
    EndIf 
    
    
    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow

EndIf
Ist der Code einigermaßen "sauber" :mrgreen: , oder ist da irgendwo des Guten zu viel oder im Ansatz falsch verstanden/programmiert worden?

Dankesgruß
Häns
PB 5.6
Windows 7 Professional
Benutzeravatar
Darie
Beiträge: 204
Registriert: 14.09.2004 21:51

Re: 2DDrawing: Alphaimage in PB4.51

Beitrag von Darie »

Sieht doch gut aus ! :wink:
Repeat
PureBasic
ForEver
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: 2DDrawing: Alphaimage in PB4.51

Beitrag von STARGÅTE »

Kleiner Hinweis:
PureBasic Hilfe hat geschrieben:Der 'Tiefe'-Wert kann mit #PB_Image_Transparent kombiniert werden (mit dem bitweisen oder dem '|' Operator), um ein Bild zu erstellen, bei dem der Alpha-Kanal auf völlige Transparenz gesetzt ist.
Somit wird aus:

Code: Alles auswählen

  If CreateImage(1, 300, 120,32) And StartDrawing(ImageOutput(1))

      DrawingMode(#PB_2DDrawing_AlphaChannel)
      Box(0, 0, 300, 120, $000000)
vereinfacht das hier:

Code: Alles auswählen

  If CreateImage(1, 300, 120,32|#PB_Image_Transparent) And StartDrawing(ImageOutput(1))
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
Häns
Beiträge: 47
Registriert: 27.10.2007 14:30
Wohnort: Kölle

Re: 2DDrawing: Alphaimage in PB4.51

Beitrag von Häns »

Danke Darie fürs Reinschauen!

Und danke an StargÅte für den Tipp! Gerade diese Kombinationen haben mir Kopfschmerzen verursacht, als ich versucht habe, den Roundbox die Modi Gradient und Transparenz zu kombinieren, so wie in Hilfe beschrieben:
Um mehrere Modi auf einmal zu nutzen, müssen Sie den '|' (OR) Operator verwenden. Das folgende ist ein Beispiel für umrissene Flächen, die im XOR-Modus verschmolzen werden:
DrawingMode(#PB_2DDrawing_Outlined | #PB_2DDrawing_XOr)
Und ich versuchte:

Code: Alles auswählen

DrawingMode(#PB_2DDrawing_Gradient | #PB_2DDrawing_Transparent)   
      BackColor($A1FE9B)
      FrontColor($00FF00)
      LinearGradient(90, 10, 90, 40)   
      RoundBox(0, 0, 600, 100, 20, 20)
     
Es will einfach nicht funktionieren...

Gibt es da eine (elegante) Lösung, oder liege ich irgendwo mit meinen Gedanken falsch?

Häns
PB 5.6
Windows 7 Professional
Antworten