[Grundfrage: Wie kann ich Catchsprite beschleunigen, oder
- wie kann ich ein sprite3D mit transparentem Text ohne catchsprite erzeugen]
Ich möchte einen Zeiger drehen und Winkelmaße darunter anzeigen. - mit sprite3d.
Dafür muss Text mit Alpha-channel gebaut werden. das geht nur über den catchsprite-Umweg..
sprich:
- CreateImage
- -> drauf gezeichnet ->
- Catchsprite
- createsprite3d
Manchmal braucht er einfach 15 ms. Immer wieder mal -> Zufällig.
Wie kann ich die Font-Texte jetzt schneller anzeigen?..
Startdrawing( screenoutput()) dauert noch viel länger.
Kann ich catchsprite() in einen thread auslagern, muss ich dann auf flipbuffers aufpassen, dass das nicht zwischenfunkt ??..

Sourcecode zu groß.. Teile:
Code: Alles auswählen
Structure gui_sprite
spriteID.i
sprite3d.i
spriteBuffer.i; falls es ein TEXT bild ist, hat es ein original-bild.
EndStructure
mein_text.gui_sprite = gui_createtext ( " Hallo Welt" , 100 , 20 ) ; einfach ein Sprite3d erstellen mit transparentem Text!..
Procedure gui_SaveImage32_ToMemory(imagenum) ; Adds alpha to Image
colorsize = ImageWidth(imagenum)*ImageHeight(imagenum)*SizeOf(RGBQUAD)
ImageSize = SizeOf(BITMAPFILEHEADER) + SizeOf(BITMAPINFOHEADER) + colorsize
*rawimage = AllocateMemory(ImageSize)
*fileheader.BITMAPFILEHEADER = *rawimage
*header.BITMAPINFOHEADER = *rawimage + SizeOf(BITMAPFILEHEADER)
With *fileheader
\bfType = 19778 ; word containing 2 bytes, 'BM' for 'BIT' 'MAP' ;)
\bfSize = ImageSize
\bfOffBits = SizeOf(BITMAPFILEHEADER) + SizeOf(BITMAPINFOHEADER)
EndWith
With *header
\biSize = SizeOf(BITMAPINFOHEADER)
\biWidth = ImageWidth(imagenum)
\biHeight = ImageHeight(imagenum)
\biPlanes = 1
\biBitCount = 32
EndWith
If StartDrawing(ImageOutput(imagenum))
CopyMemory (DrawingBuffer(), *rawimage + SizeOf(BITMAPFILEHEADER) + SizeOf(BITMAPINFOHEADER), colorsize)
StopDrawing()
EndIf
ProcedureReturn *rawimage
EndProcedure
Procedure gui_CreateText(gesamttext.s,width,height , color=#gui_menucolor, Ausrichtung = #gui_ausrichtung_zentriert, IsTransparent = 1) ; returns a gui_sprite-pointer!!
Protected ImageID , *gui_sprite.gui_sprite ,x,y, zeilenzahl , text.s , textheight
startzeit = ElapsedMilliseconds()
*gui_sprite = AllocateMemory( SizeOf( gui_sprite))
ImageID = CreateImage(#PB_Any , width , height ,32)
gesamttext + Chr(10) ; für stringfield.. damit er auch 1-zeilen-texte erkennt.!=)
zeilenzahl = CountString ( gesamttext , Chr(10))
;{ auf Bild zeichnen
If StartDrawing ( ImageOutput(ImageID ))
DrawingMode ( #PB_2DDrawing_AlphaChannel )
Box ( 0, 0, ImageWidth(ImageID), ImageHeight(ImageID),0)
DrawingMode ( #PB_2DDrawing_AlphaBlend|#PB_2DDrawing_Transparent)
DrawingFont ( FontID(gui_font ))
FrontColor ( RGB(255,104,37 ))
textheight = TextHeight ( gesamttext)
For n = 1 To zeilenzahl ; alle zeilen anzeigen (multizeilen support.)
text = StringField( gesamttext , n , Chr(10))
If Ausrichtung = #gui_ausrichtung_zentriert
x = width / 2 - TextWidth(text) / 2
EndIf
y = height / 2 - textheight *0.5 * zeilenzahl + textheight *(n-1)
DrawText(1+x,1+y,text ,#gui_menucolor_shadow) ; background des textes zum bessern Lesen.
DrawText( x, y,text ,color) ;RGBA(255,216,43,255))
Next
StopDrawing()
EndIf
;}
*imagemem = gui_SaveImage32_ToMemory(ImageID )
*gui_sprite\spriteBuffer = *imagemem
FreeImage ( ImageID )
*gui_sprite\spriteID = CatchSprite(#PB_Any , *imagemem ,#PB_Sprite_Texture|#PB_Sprite_AlphaBlending )
*gui_sprite\sprite3d = CreateSprite3D( #PB_Any , *gui_sprite\spriteID )
; FreeMemory ( *imagemem ) ; macht er unten
dauer = ElapsedMilliseconds() - startzeit
If dauer > 0
Debug "DAUER: " + Str(dauer ) + " " + gesamttext
EndIf
;
ProcedureReturn *gui_sprite
EndProcedure