[gelöst] Bereich mit Muster füllen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag von hjbremer »

und hier das 13001. Posting, diesmal mit MaskBlt und ich glaube das kommt deinen Wünschen etwas näher.

Allerdings, warum man PATCOPY mit NOTSRCCOPY über das Macro ROP4 kombinieren muß und dabei dann $AACC0020 rauskommt, das kann ich nicht begreifen :roll: , aber so steht es bei MSDN und oh Wunder es funktioniert :mrgreen:

Code: Alles auswählen

;siehe auch: http://support.microsoft.com/kb/89375/de 

Enumeration 
  #TEXTUR 
  #MASKE 
  #MIXED 
  #image1
EndEnumeration 

UseJPEGImageDecoder() 
imageID1 = LoadImage(#image1, "C:\WINDOWS\Web\Wallpaper\Fischkarawane.jpg")

SourceID = LoadImage(#TEXTUR, #PB_Compiler_Home+"examples\sources\Data\clouds.jpg")
           ;oder
           ;LoadImage(#TEXTUR, "C:\WINDOWS\Web\Wallpaper\Stonehenge.jpg") 
;SourceID = ResizeImage(#TEXTUR,256,256)

LoadFont(0, "Arial", 64,#PB_Font_Bold) 

hwnd=OpenWindow(0, 0, 0, 900, 300, "ImageGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
  CreateGadgetList(hwnd) 
    
  ImageGadget(0, 10, 10, 256, 256, SourceID) 
  
  MaskID = CreateImage(#MASKE, 256, 256,1) 
           StartDrawing(ImageOutput(#MASKE)) 
           DrawingFont(FontID(0)) 
           DrawingMode(#PB_2DDrawing_Transparent)
           DrawText(20,99,"Hallo",#White) 
           StopDrawing() 
  
  ImageGadget(1, 286, 10, 256, 256, MaskID) 
  
  TargetID = CreateImage(#MIXED, 256, 256) 
  TargetDC = StartDrawing(ImageOutput(#MIXED)) 
              
              DrawImage(imageID1,0,0,256,256)

              dc = CreateCompatibleDC_(TargetDC) 
              SelectObject_(dc, SourceID) 
              MaskBlt_(TargetDC, 0, 0, 256, 256, dc, 0, 0, MaskID, 0, 0, $AACC0020) 
              DeleteDC_(dc) 
             
             StopDrawing() 
  
  ImageGadget(2, 586, 10, 256, 256, TargetID) 
  
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow 

End

 
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

scholly hat geschrieben:
Kaeru Gaman hat geschrieben:ich hatte irgendwo mal nen democode gepostet, wo buchstaben rumsausen,
Ich melde mich dann 2009 wieder, wenn ich alle Deine 13000 Postings durch habe :lol: :lol: :lol:
hab dir maln schnelles beispiel gemacht

Code: Alles auswählen

InitSprite()
OpenWindow(0,0,0, 400,200, "SpriteMask", #PB_Window_SystemMenu)
OpenWindowedScreen(WindowID(0),0,0,400,200,0,0,0)

; Maskensprite erzeugen
CreateSprite(0,64,64)
StartDrawing(SpriteOutput(0))
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawText(2, 4,"TextZeile",$FFFFFF)
  DrawText(2,24,"TextZeile",$FFFFFF)
  DrawText(2,44,"TextZeile",$FFFFFF)
StopDrawing()
; weiß auf schwarz, wir definieren weiß als transparent
TransparentSpriteColor(0,$FFFFFF)

; Farbensprite erzeugen
CreateSprite(1,128,64)
StartDrawing(SpriteOutput(1))
  For n=0 To 127
    Line(n,0,0,64,RGB(0,n,128+n))
  Next
StopDrawing()

; Zielsprite
CreateSprite(2,64,64)
TransparentSpriteColor(2,0)
; braucht nur erzeugt zu werden,
; wird on-the-fly gefüllt

stepA = 1

Repeat
  EvID = WaitWindowEvent(10)

; reihe verschieben für die Farbbewegung
  counterA + stepA
  If counterA > 63 Or counterA < 0
    stepA = -stepA
  EndIf

; aktuelles sprite erzeugen
  UseBuffer(2)  ; auf sprite2 ausgeben
    DisplaySprite(1,-counterA,0)    ; Farbsprite verschoben displayn
    DisplayTransparentSprite(0,0,0) ; Maske drüberlegen
  UseBuffer(-1) ; wieder auf screen ausgeben

  ClearScreen($804020)
    DisplayTransparentSprite(2, 150,50)
  FlipBuffers()
Until EvID = #PB_Event_CloseWindow
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag von scholly »

scholly hat geschrieben:Ich melde mich dann 2009 wieder, wenn ich alle Deine 13000 Postings durch habe :lol: :lol: :lol:
War'n in den 3 Foren nur 744, die sich auf *sprite* gemeldet haben und ich hoffe, daß ich das Richtige hier gefunden habe. sieht auf jeden Fall gut aus und morgen versuch ichs zu verstehen ;)

@hjbremer
auf so'n HIntergrundbild wie in Deinem "13001"er war ich aber nich aus,
den Rest guck ich mir auch morgen an.

@KG
aus Deinem "schnellen Beispiel" scheint der ganze transparent-Kram wohl interessant für mich zu werden.

:allright: :allright: :allright: für jeden von Euch Dreien ein Danke ;)
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

scholly hat geschrieben:... ich hoffe, daß ich das Richtige hier gefunden habe.
yo genau das ist es, erkenne ich an der DataSection.
war das einzige, wo ich meinen Namen als Data drin hatte.

ist ein ähnliches grundprinzip wie in meinem aktuellen beispiel, jedenfalls die arbeit mit den masken.
das siehst du an diesen vier zeilen:

Code: Alles auswählen

    UseBuffer(n+5)
      DisplaySprite(0,0,0)
      DisplayTransparentSprite(n,0,0)
    UseBuffer(-1)
ein hintergrundsprite und ein maskensprite auf ein aktuelles sprite anzeigen.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag von scholly »

@hjbremer:

Ich hab Deine Routine mal in einem weiteren Versuch benutzt und frage mich, warum einige Punkte und einige i-Punkte nicht gesetzt werden.

Magst Du mal 'reingucken, bitte ?

Code: Alles auswählen

InitSprite()
fontsize = 36
zeilenabstand = 8
LoadFont(0,"Verdana",fontsize,#PB_Font_Bold)
#window_height = 600
#window_width  = 900
#screen_height = 570
#screen_width  = 870

musterfile.s = #PB_Compiler_Home+"examples\sources\Data\clouds.jpg"
UseJPEGImageDecoder()

OpenWindow(0, #PB_Ignore, #PB_Ignore, #window_width, #window_height, "DisplaySprite3D", #PB_Window_SystemMenu|#PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
OpenWindowedScreen(WindowID(0),15,15,#screen_width,#screen_height,0,15,15)

If LoadImage(1, musterfile.s) 
;   ImageGadget(1,  10, 10, 256, 256, ImageID(1))
; ResizeImage(1, 512, 512)
Else
  Debug "error: LoadImage(0, musterfile.s)"
EndIf

; damit das Sprite und darin der Text zentriert werden können,
; müssen die Werte vorher berechnet werden.
; am besten alles in einer Struktur ablegen
Structure zeile
  text.s
  width.l
EndStructure

Global width_max.l  = 0

Global Dim itext.zeile(25)

Procedure move_texture_to_sprite(screen_height.l,screen_width.l)
; hjbremer http://www.purebasic.fr/german/viewtopic.php?t=15794&start=6

dc=StartDrawing(SpriteOutput(0))
   
  ID = CopyImage_(ImageID(1), #IMAGE_BITMAP, 140, 140, 0)
  brush = CreatePatternBrush_(ID)
  DeleteObject_(ID)

  For line = 1 To screen_height
    For column = 1 To screen_width
   
      mask_color = Point(column,line)     
   
      If mask_color = #Red ;nur dann brauchen wir das Muster
         
        SelectObject_(dc,brush)
       
        ExtFloodFill_(dc,column,line,#Red,#FLOODFILLSURFACE)
        Break
   
      EndIf
         
    Next column
  Next line

StopDrawing()
     
EndProcedure

Procedure fill_zeile(counter.l,textzeile.s)
    itext(counter)\text  = textzeile
    itext(counter)\width = TextWidth(textzeile)
    If itext(counter)\width  > width_max  : width_max  = itext(counter)\width  : EndIf
EndProcedure

CreateImage(0, 870, 570)
  StartDrawing(ImageOutput(0))
    DrawingFont(FontID(0))  
    fill_zeile(0,"Ich will ja nur mal testen")  
    fill_zeile(1,"ob ich das hinbekomme und")
    fill_zeile(2,"für Geschwindigkeit muß am")
    fill_zeile(3,"'Y-Wert' gedreht werden und") 
    fill_zeile(4,"als nächstes probier ich")
    fill_zeile(5,"dann endlosscrollen und dann")
    fill_zeile(6,"zu zentrieren und danach eine")
    fill_zeile(7,"Textur statt Textfarbe und")
    fill_zeile(8,"dann versuch ich, daß es oben")
    fill_zeile(9,"schmaler wird (STAR WARS)")
    fill_zeile(10,"und dann..............")      
  StopDrawing()
FreeImage(0)

sprite_height = 12*(fontsize+zeilenabstand)
sprite_width  = (Round(width_max/2,1)*2)

If sprite_width > #screen_width
  MessageRequester("Obacht", "Font zu groß oder Textzeile(n) zu lang für den Screen")
  End
EndIf

y_offset = 0

CreateSprite(0, sprite_width, sprite_height, #PB_Sprite_Texture)

StartDrawing(SpriteOutput(0))
   
    DrawingMode(1)
    FrontColor(#Red)
    DrawingFont(FontID(0))
    
    x_offset = (sprite_width - itext(0)\width)/2
    DrawText(x_offset,y_offset,itext(0)\text)
    
    x_offset = (sprite_width - itext(1)\width)/2
    y_offset + fontsize + zeilenabstand
    DrawText(x_offset,y_offset,itext(1)\text)
    
    x_offset = (sprite_width - itext(2)\width)/2
    y_offset + fontsize + zeilenabstand
    DrawText(x_offset,y_offset,itext(2)\text)
    
    x_offset = (sprite_width - itext(3)\width)/2
    y_offset + fontsize + zeilenabstand
    DrawText(x_offset,y_offset,itext(3)\text)
    
    x_offset = (sprite_width - itext(4)\width)/2
    y_offset + fontsize + zeilenabstand
    DrawText(x_offset,y_offset,itext(4)\text)
    
    x_offset = (sprite_width - itext(5)\width)/2
    y_offset + fontsize + zeilenabstand
    DrawText(x_offset,y_offset,itext(5)\text)
    
    x_offset = (sprite_width - itext(6)\width)/2
    y_offset + fontsize + zeilenabstand
    DrawText(x_offset,y_offset,itext(6)\text)
    
    x_offset = (sprite_width - itext(7)\width)/2
    y_offset + fontsize + zeilenabstand
    DrawText(x_offset,y_offset,itext(7)\text)
    
    x_offset = (sprite_width - itext(8)\width)/2
    y_offset + fontsize + zeilenabstand
    DrawText(x_offset,y_offset,itext(8)\text)
    
    x_offset = (sprite_width - itext(9)\width)/2
    y_offset + fontsize + zeilenabstand
    DrawText(x_offset,y_offset,itext(9)\text)
    
    x_offset = (sprite_width - itext(10)\width)/2
    y_offset + fontsize + zeilenabstand
    DrawText(x_offset,y_offset,itext(10)\text)
   
StopDrawing()

y = sprite_height

move_texture_to_sprite(#screen_height,#screen_width)

Repeat

  EventID = WindowEvent()

  ClearScreen(RGB(0, 0, 0))
 
  For spritecounter = 1 To (Round(#screen_height/sprite_height,1) + 1)
    DisplaySprite(0,(#screen_width - sprite_width)/2, (spritecounter -2) * sprite_height + y)
  Next spritecounter
     
  y - 1
  If y < 0
    y = sprite_height
  EndIf
 
  FlipBuffers()

Until EventID = #PB_Event_CloseWindow
mDv... scholly
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag von hjbremer »

sieht ja geil aus.

du mußt den Break rausnehmen.
bei
ExtFloodFill_(dc,column,line,#Red,#FLOODFILLSURFACE)
Break
war nur drinnen um das Ganze etwas zu beschleinigen.

und hier mal eine andere Methode zur Berechnung der Breite. Ist vom Code her erheblich kürzer und wohl auch einfacher.

Code: Alles auswählen

InitSprite() 
fontsize = 35 
zeilenabstand = 8 
LoadFont(0,"Verdana",fontsize,#PB_Font_Bold) 
#window_height = 600 
#window_width  = 900 
#screen_height = 570 
#screen_width  = 870 

#sprite=1   ;Konstanten für Images etc benutzen !!!

musterfile.s = #PB_Compiler_Home+"examples\sources\Data\clouds.jpg" 
UseJPEGImageDecoder() 

OpenWindow(0, #PB_Ignore, #PB_Ignore, #window_width, #window_height, "DisplaySprite3D", #PB_Window_SystemMenu|#PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0)) 
OpenWindowedScreen(WindowID(0),15,15,#screen_width,#screen_height,0,15,15) 

If LoadImage(1, musterfile.s) 
;   ImageGadget(1,  10, 10, 256, 256, ImageID(1)) 
; ResizeImage(1, 512, 512) 
Else 
  Debug "error: LoadImage(0, musterfile.s)" 
EndIf 


Procedure move_texture_to_sprite(screen_height.l,screen_width.l) 
; hjbremer http://www.purebasic.fr/german/viewtopic.php?t=15794&start=6 

dc=StartDrawing(SpriteOutput(#sprite)) 
    
  ID = CopyImage_(ImageID(1), #IMAGE_BITMAP, 140, 140, 0) 
  brush = CreatePatternBrush_(ID) 
  DeleteObject_(ID) 

  For line = 1 To screen_height 
    For column = 1 To screen_width 
    
      mask_color = Point(column,line)      
    
      If mask_color = #Red ;nur dann brauchen wir das Muster 
          
        SelectObject_(dc,brush) 
        
        ExtFloodFill_(dc,column,line,#Red,#FLOODFILLSURFACE) 
        
        ;Break ;hier break auskommentiert
    
      EndIf 
          
    Next column 
  Next line 

StopDrawing() 
      
EndProcedure 

;Berechnung und Ausgabe des Textes

;hier legst du die gewünschte Breite fest, wenn zu klein 
;und ein Wort paßt nicht in eine Zeile dann wird abgeschnitten
sprite_width  = 600   ;bei dieser Schriftgröße ist 400 wohl der kleinste Wert, 400 bis #screen_width
  
sprite_height = 1800  ;dieser Wert muß als Vorgabe so groß sein, das der ganze Text hineinpaßt

;eigentlich unnötig, denn die Breite legst du ja fest
If sprite_width > #screen_width 
  MessageRequester("Obacht", "Font zu groß oder Textzeile(n) zu lang für den Screen") 
  End 
EndIf 


CreateSprite(#sprite, sprite_width, sprite_height, #PB_Sprite_Texture) 
  dc=StartDrawing(SpriteOutput(#sprite)) 
    
    DrawingMode(1) 
    FrontColor(#Red) 
    DrawingFont(FontID(0)) 
    
    ;den Text kann man auch sonstwo einlesen, Hauptsache er befindet sich komplett in txt$
    ;habs mir einfach gemacht und als Data abgelegt
    Read lines
    For j=1 To lines: Read a$: txt$+a$:Next
    
    txt$+#CRLF$ ;sorgt für die Leerzeile am Ende
    
    SetTextAlign_(dc,#TA_TOP)                        ;ohne geht es nicht
    SetRect_(r.RECT,0,0,sprite_width,sprite_height)  ;Vorgabewerte für rect; left,top,right,bottom
    
    ;hier wird rect berechnet, weil flag #DT_CALCRECT gesetzt ist
    DrawText_(dc,txt$,-1,r.rect,#DT_CALCRECT|#DT_WORDBREAK) 
    
    ;und nun mit den neuen rect Werten ausgeben
    DrawText_(dc,txt$,-1,r.rect,#DT_CENTER|#DT_WORDBREAK)
           
  StopDrawing() 
  
  ;nun wird sprite_height auf den korrekten Wert gesetzt, 
  ;den Drawtext_ bei vorgegebener Breite errechnet hat 
  sprite_height=r\bottom   


y = sprite_height 

move_texture_to_sprite(sprite_height,sprite_width) ;hier sprite höhe+breite eingesetzt 

Repeat 

  EventID = WindowEvent() 

  ClearScreen(RGB(0, 0, 0)) 
  
  For spritecounter = 1 To (Round(#screen_height/sprite_height,1) + 1) 
    DisplaySprite(#sprite,(#screen_width - sprite_width)/2, (spritecounter -2) * sprite_height + y) 
  Next spritecounter 
      
  y - 1 
  If y < 0 
    y = sprite_height 
  EndIf 
  
  FlipBuffers() 

Until EventID = #PB_Event_CloseWindow 

End

DataSection
datatext1:
Data.l 4
Data.s "Ich will ja nur mal testen ob ich das hinbekomme und für Geschwindigkeit muß am "
Data.s "'Y-Wert' gedreht werden und als nächstes probier ich dann endlosscrollen und dann "
Data.s "zu zentrieren und danach eine Textur statt Textfarbe und dann versuch ich, daß es oben "
Data.s "schmaler wird (STAR WARS) und dann.............."

Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag von hjbremer »

PS: zum Füllen solltest du dir mal mein Beispiel zu MASKBLT ansehen. Ist erheblich schneller.
http://www.purebasic.fr/german/viewtopi ... highlight=
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag von scholly »

hjbremer hat geschrieben:sieht ja geil aus.
Kommt noch mehr, sind nur die ersten Schritte :D
hjbremer hat geschrieben: du mußt den Break rausnehmen.
bei
ExtFloodFill_(dc,column,line,#Red,#FLOODFILLSURFACE)
Break
war nur drinnen um das Ganze etwas zu beschleinigen.
Tja, so ist das nunmal, wenn ich einen Code(schnipsel) nicht (ganz) verstehe.
hjbremer hat geschrieben:und hier mal eine andere Methode zur Berechnung der Breite. Ist vom Code her erheblich kürzer und wohl auch einfacher.
Nehme grade "Krieg der Welten" auf und da das hier nur ein 1600er ist, geht surfen noch ohne daß es dropprd Frames gibt, aber kein kompilieren nebenbei.
hjbremer hat geschrieben:PS: zum Füllen solltest du dir mal mein Beispiel zu MASKBLT ansehen. Ist erheblich schneller.
http://www.purebasic.fr/german/viewtopi ... highlight=
Das MASKBLT versteh ich noch weniger :oops: , da hab ich ja AFAIR schon Code von Dir bekommen.
Bin (noch) GFX-/Sprite-/OldSkool-Dummy, aber es macht mir irgendwie Spaß, so ein "About-tro" zu basteln.
Geht halt nur nicht so schnell wie bei den jungen Hüpfern :lol: :lol:
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag von hjbremer »

:mrgreen: wenn du wüßtest wie alt ich bin :D würdest du sofort Rente beantragen :mrgreen:
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag von hjbremer »

Habe dir mal etwas Arbeit abgenommen :mrgreen:

Code: Alles auswählen

Declare myTexturTextImage(pbnr,br,hh,txt$,font)

#window_height = 600 
#window_width  = 900 
#screen_height = 570 
#screen_width  = 870 

Enumeration 
  #win_nr
  
  #textur1
  #textur2
  
  #hgimage1
  #hgimage2
  #screenhg

  #textur_img 
  #masken_img  
  
  #imagenr1
  
  #sprite1
  
  #dummy1
  #dummy2
  #dummy3
EndEnumeration

InitSprite() 

fontsize = 35 
fontidnr = FontID(LoadFont(#PB_Any,"Verdana",fontsize,#PB_Font_Bold))

UseJPEGImageDecoder() 
;Texturen zum füllen
LoadImage(#textur1, #PB_Compiler_Home+"examples\sources\Data\clouds.jpg") 
LoadImage(#textur2, "C:\WINDOWS\Web\Wallpaper\windkanal.jpg")

;Hintergrundbild
LoadImage(#hgimage1, "C:\WINDOWS\Web\Wallpaper\mondkrater.jpg")
LoadImage(#hgimage2, "C:\WINDOWS\Web\Wallpaper\mondaufgang.jpg")

hwnd = OpenWindow(#win_nr, #PB_Ignore, #PB_Ignore, #window_width, #window_height, "DisplaySprite3D", #PB_Window_SystemMenu|#PB_Window_ScreenCentered) 
       CreateGadgetList(hwnd) 
       
       OpenWindowedScreen(hwnd,15,15,#screen_width,#screen_height,0,15,15) 
       
       Restore datatext1
        Read lines: For j=1 To lines: Read a$: txt$+a$:Next: txt$+#CRLF$ ;#CRLF$=Leerzeile am Ende 
        
       myimageID = myTexturTextImage(#imagenr1,800,1000,txt$,fontidnr)
      
       ;=====================================================

       CreateSprite(#screenhg, #screen_width, #screen_height) 
       StartDrawing(SpriteOutput(#screenhg)) 
    
        DrawImage(ImageID(#hgimage1),0,0,#screen_width,#screen_height)
        ;DrawImage(ImageID(#hgimage2),0,0,#screen_width,#screen_height)
            
       StopDrawing() 
                    
       ;=====================================================
       
       sprite_width  = ImageWidth(#Imagenr1):  ;Debug sprite_width
       sprite_height = ImageHeight(#Imagenr1): ;Debug sprite_height
      
       flag=#PB_Sprite_Texture

       CreateSprite(#sprite1, sprite_width, sprite_height, flag) 
       StartDrawing(SpriteOutput(#sprite1)) 
    
        DrawImage(myimageID,0,0)
            
       StopDrawing() 
                    
      ;=======================================
  
y = sprite_height 

Repeat 

  EventID = WindowEvent() 

  ClearScreen(RGB(0, 0, 0)) 
  
  DisplaySprite(#screenhg,0,0)
  
  For spritecounter = 1 To (Round(#screen_height/sprite_height,1) + 1) 
    DisplayTransparentSprite(#sprite1,(#screen_width - sprite_width)/2, (spritecounter -2) * sprite_height + y) 
  Next spritecounter 
      
  y - 1 
  If y < 0 
    y = sprite_height 
  EndIf 
  
  FlipBuffers() 

Until EventID = #PB_Event_CloseWindow 

End 

Procedure myTexturTextImage(pbnr,br,hh,txt$,fontidnr)

  ;die br+hh gilt hier nur für die Maske, damit Text komplett hineinpaßt

  maskenID = CreateImage(#masken_img, br, hh,1) 
        dc = StartDrawing(ImageOutput(#masken_img)) 
                          
               ;Textfont
               SelectObject_(dc,FontIDnr)           ;oder DrawingFont(FontIDnr)
              
               ;Text
               SetBkMode_(dc,#TRANSPARENT)          ;oder DrawingMode()
               SetTextColor_(dc,#White)             ;#white = ganz wichtig               
               
               SetTextAlign_(dc,#TA_TOP)            ;ohne geht es nicht
               SetRect_(r.RECT,0,0,br,hh)           ;Basiswerte für rect; left,top,right,bottom
              
               ;berechne via Api die Größe von r.rect für den Text !!!
               DrawText_(dc,txt$,-1,r,#DT_CALCRECT|#DT_WORDBREAK)  
              
               ;zeichne Text
               DrawText_(dc,txt$,-1,r,#DT_CENTER|#DT_WORDBREAK)
           
             StopDrawing() 
  
  ;nur zur Demo wie Maske aussieht
  ;ImageGadget(#dummy1, 400, 10, 0, 0, maskenID) 
  
  ;=======================================
  
  ;Source(Quelle)=Textur braucht nur so groß sein wie der Text
  
  sourcebr = r\right    ;r wird bei Maske berechnet
  sourcehh = r\bottom   

  sourceID = CreateImage(#textur_img, sourcebr, sourcehh) 
        dc = StartDrawing(ImageOutput(#textur_img)) 
               
               ;Textur malen
               DrawImage(ImageID(#textur1),0,0,sourcebr,sourcehh)
               ;DrawImage(ImageID(#textur2),0,0,sourcebr,sourcehh)
               
             StopDrawing()   
  
  ;nur zur Demo wie Source aussieht
  ;ImageGadget(#dummy2, 400, 310, 0, 0, sourceID) 
  
  ;=======================================
  
  ;Target(Ziel)
  
  maskbltflag=$AACC0020    ;Billys Geheimnis, http://support.microsoft.com/kb/89375/de
  
  targetbr = r\right
  targethh = r\bottom
  
  target_img=pbnr      ;pbnr ist die Nummer des erstellten Images, zum weiterarbeiten damit
  
  targetID = CreateImage(target_img, targetbr, targethh) 
  targetDC = StartDrawing(ImageOutput(target_img)) 
              
               ;wir müssen eine Kopie anlegen, dieses dc dient als Source für MaskBlt
               dc = CreateCompatibleDC_(targetDC)   
               ;füllen Kopie mit Bild von source, also dem Farbverlauf oder was auch immer
               SelectObject_(dc, sourceID)          
               
               MaskBlt_(targetDC, 0, 0, br, hh, dc, 0, 0, maskenID, 0, 0, maskbltflag) 
                              
               ;Kopie löschen 
               DeleteDC_(dc)  
             
             StopDrawing() 
  
  ;nur zur Demo wie Source aussieht
  ;ImageGadget(#dummy3, 400, 610, 0, 0, targetID) 
  
  ProcedureReturn targetID

EndProcedure

DataSection 
datatext1: 
Data.l 4 
Data.s "Ich will ja nur mal testen ob ich das hinbekomme und für Geschwindigkeit muß am " 
Data.s "'Y-Wert' gedreht werden und als nächstes probier ich dann endlosscrollen und dann " 
Data.s "zu zentrieren und danach eine Textur statt Textfarbe und dann versuch ich, daß es oben " 
Data.s "schmaler wird (STAR WARS) und dann.............."  
PS: Fragen kostet nix
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Antworten