Ich male das Bild/Character erst auf ein Image (mit Alpha-Channel). Dann wird es als transparentes PNG gespeichert und als Sprite eingeladen (nervig, ich weiss). Daher auch die leichten Verzögerungen zwischen den Slides.

Oh je, ich verstehe. Ich finds auch etwas schade das SpriteOutput() nicht auch alles das kann was ImageOutput kann.
Da ich damals selber auch nicht jedes Image immer erst auf die HDD schreiben wollte und sowohl das Image als auch das Sprite ja 32Bit-Format haben, habe ich n Procedure geschrieben (PB-Only) die Image zu Sprite macht.
Code: Alles auswählen
Procedure ImageToSprite(Sprite, Image, Mode=#False)
Protected Row
Protected ImageHeight = ImageHeight(Image)
Protected ImageWidth = ImageWidth(Image)
Protected *ReadBuffer, ReadPitch, ReadFormat
Protected *WriteBuffer, WritePitch, WriteFormat
StartDrawing(ImageOutput(Image))
*ReadBuffer = DrawingBuffer()
ReadPitch = DrawingBufferPitch()
ReadFormat = DrawingBufferPixelFormat()
StopDrawing()
If Sprite = #PB_Any
Sprite = CreateSprite(#PB_Any, ImageWidth, ImageHeight, Mode)
Else
CreateSprite(Sprite, ImageWidth, ImageHeight, Mode)
EndIf
StartDrawing(SpriteOutput(Sprite))
*WriteBuffer = DrawingBuffer()
WritePitch = DrawingBufferPitch()
WriteFormat = DrawingBufferPixelFormat()
If ReadFormat & #PB_PixelFormat_ReversedY XOr WriteFormat & #PB_PixelFormat_ReversedY
For Row = 0 To ImageHeight-1
CopyMemory(*ReadBuffer+(ImageHeight-1-Row)*ReadPitch, *WriteBuffer+Row*WritePitch, ImageWidth*SizeOf(Long))
Next
Else
For Row = 0 To ImageHeight-1
CopyMemory(*ReadBuffer+Row*ReadPitch, *WriteBuffer+Row*WritePitch, ImageWidth*SizeOf(Long))
Next
EndIf
StopDrawing()
ProcedureReturn Sprite
EndProcedure
Das funktioniert dnan so:
Code: Alles auswählen
InitSprite()
InitSprite3D()
CreateImage(1, 128,128,32|#PB_Image_Transparent)
StartDrawing(ImageOutput(1))
DrawingMode(#PB_2DDrawing_Transparent|#PB_2DDrawing_AlphaBlend)
Box(0,0,64,64,$80FFFFFF)
Box(64,0,64,64,$8000FF00)
Box(0,64,64,64,$80FF00FF)
StopDrawing()
OpenWindow(0, 0, 0, 800, 600, "Screen", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, WindowWidth(0), WindowHeight(0), 0, 0, 0)
ImageToSprite(1, 1, #PB_Sprite_Texture|#PB_Sprite_AlphaBlending)
CreateSprite3D(1,1)
Repeat
ClearScreen(0)
Start3D()
DisplaySprite3D(1, 100,100)
DisplaySprite3D(1, 150,150)
Stop3D()
FlipBuffers()
Until WindowEvent() = #PB_Event_CloseWindow
Funktioniert jedoch nur für Sprites die mit #PB_Sprite_Texture|#PB_Sprite_AlphaBlending und Images die 32Bit haben,
Aber genau das hast du ja ...