
Ich könnte wie viele ander hier die Echtzeitmanipulation der Alphakanäle von Sprites durchaus gebrauchen.

OK, nach einigen Stunden rummprobieren muss ich leider sagen das es so aussieht als würde PB den Alphakanal zerstören.dllfreak2001 hat geschrieben:Dann Beispiel her....![]()
Ich könnte wie viele ander hier die Echtzeitmanipulation der Alphakanäle von Sprites durchaus gebrauchen.
Code: Alles auswählen
EnableExplicit
Structure Pixel_BGRA
Blue.b
Green.b
Red.b
Alpha.b
EndStructure
Define.i BgSprite, Sprite, BgSprite3D, Sprite3D, Exit, Time, Frames, FpsStartTime, FpsTime, Buffer, Pitch, PixelFormat, Width, Height, X, Y, Alpha, Direction
Define.f Fps
Define *Pixel.Pixel_BGRA
InitKeyboard()
InitSprite()
InitSprite3D()
UsePNGImageDecoder()
OpenScreen(1024, 768, 32, "Test")
BgSprite = LoadSprite(#PB_Any, "d:\Bgtest.png", #PB_Sprite_Texture | #PB_Sprite_AlphaBlending)
BgSprite3D = CreateSprite3D(#PB_Any, BgSprite)
Sprite = LoadSprite(#PB_Any, "d:\test.png", #PB_Sprite_Texture | #PB_Sprite_AlphaBlending)
Sprite3D = CreateSprite3D(#PB_Any, Sprite)
Alpha = 1
Direction = 1
Repeat
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Escape) <> 0
Exit = #True
EndIf
;-----------------------------
;manipulation of alpha channel
;-----------------------------
StartDrawing(SpriteOutput(Sprite))
Buffer = DrawingBuffer()
Pitch = DrawingBufferPitch()
PixelFormat = DrawingBufferPixelFormat()
Width = SpriteWidth(Sprite) - 1
Height = SpriteHeight(Sprite) - 1
If PixelFormat <> #PB_PixelFormat_32Bits_BGR
Debug "wrong pixel format"
End
EndIf
Alpha + Direction
If Alpha = 127
Direction = -1
ElseIf Alpha = 1
Direction = 1
EndIf
For Y = 0 To Height
*Pixel = Buffer + (Pitch * Y)
For X = 0 To Width
*Pixel\Alpha = Alpha
*Pixel + 4
Next
Next
StopDrawing()
;-----------------------------
Frames + 1
Time = ElapsedMilliseconds()
FpsTime = Time - FpsStartTime
If FpsTime > 100
Fps = Frames / FpsTime * 1000
FpsStartTime = Time
Frames = 0
EndIf
ClearScreen($00000000)
Start3D()
DisplaySprite3D(BgSprite3D, 1, 1)
DisplaySprite3D(Sprite3D, 100, 100)
Stop3D()
StartDrawing(ScreenOutput())
DrawText(1,1,"FPS : " + StrF(Fps, 2), $00FF0000)
StopDrawing()
FlipBuffers(#PB_Screen_NoSynchronization)
Until Exit = #True
Code: Alles auswählen
EnableExplicit
Structure Pixel_BGRA
Blue.b
Green.b
Red.b
Alpha.b
EndStructure
Procedure.i doEffect(Sprite.i, Angle.d, Transparency.i)
Define.i Width, Height, HalfWidth, HalfHeight, X, Y, Buffer, Pitch, PixelFormat, Line, XPos, YPos
Define.d PixelAngle
Define *Pixel.Pixel_BGRA
If IsSprite(Sprite) = 0
ProcedureReturn 0
EndIf
Angle = (Angle * #PI) / 180.0
StartDrawing(SpriteOutput(Sprite))
Width = SpriteWidth(Sprite)
Height = SpriteHeight(Sprite)
HalfWidth = Width >> 1
HalfHeight = Height >> 1
Buffer = DrawingBuffer()
Pitch = DrawingBufferPitch()
PixelFormat = DrawingBufferPixelFormat()
If PixelFormat = #PB_PixelFormat_32Bits_BGR Or PixelFormat = #PB_PixelFormat_32Bits_RGB
For X = -HalfWidth To HalfWidth - 1
For Y = -HalfHeight To HalfHeight - 1
PixelAngle = ACos(Y / Sqr(X * X + Y * Y))
If Angle < #PI And X > 0
If PixelAngle < Angle
XPos = X + HalfWidth
YPos = Height - (Y + HalfHeight) - 1
*Pixel = Buffer + Pitch * YPos + 4 * XPos
*Pixel\Alpha = Transparency
Else
XPos = X + HalfWidth
YPos = Height - (Y + HalfHeight) - 1
*Pixel = Buffer + Pitch * YPos + 4 * XPos
*Pixel\Alpha = 0
EndIf
Else
If X > 0
XPos = X + HalfWidth
YPos = Height - (Y + HalfHeight) - 1
*Pixel = Buffer + Pitch * YPos + 4 * XPos
*Pixel\Alpha = Transparency
ElseIf PixelAngle < Angle - #PI
XPos = X + HalfWidth
YPos = Y + HalfHeight
*Pixel = Buffer + Pitch * YPos + 4 * XPos
*Pixel\Alpha = Transparency
Else
XPos = X + HalfWidth
YPos = Y + HalfHeight
*Pixel = Buffer + Pitch * YPos + 4 * XPos
*Pixel\Alpha = 0
EndIf
EndIf
Next Y
Next X
Else
StopDrawing()
ProcedureReturn 0
EndIf
StopDrawing()
ProcedureReturn 1
EndProcedure
Define.i Sprite, EffectSprite, Sprite3D, EffectSprite3D, Exit, Time, Frames, FpsStartTime, FpsTime, LastTime, CurrentTime
Define.f Fps
Define.d Angle
Define *Pixel.Pixel_BGRA
InitKeyboard()
InitSprite()
InitSprite3D()
UsePNGImageDecoder()
OpenScreen(1024, 768, 32, "Test")
Sprite = LoadSprite(#PB_Any, "d:\test.png", #PB_Sprite_Texture | #PB_Sprite_AlphaBlending)
Sprite3D = CreateSprite3D(#PB_Any, Sprite)
EffectSprite = LoadSprite(#PB_Any, "d:\test2.png", #PB_Sprite_Texture | #PB_Sprite_AlphaBlending)
EffectSprite3D = CreateSprite3D(#PB_Any, EffectSprite)
Angle = 0.0
LastTime = ElapsedMilliseconds()
Repeat
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Escape) <> 0
Exit = #True
EndIf
CurrentTime = ElapsedMilliseconds()
Angle + (CurrentTime - LastTime) * 0.1
LastTime = CurrentTime
While Angle > 360.0
Angle - 360.0
Wend
doEffect(EffectSprite, Angle, 100)
Frames + 1
Time = ElapsedMilliseconds()
FpsTime = Time - FpsStartTime
If FpsTime > 100
Fps = Frames / FpsTime * 1000
FpsStartTime = Time
Frames = 0
EndIf
ClearScreen($00000000)
Start3D()
DisplaySprite3D(Sprite3D, 100, 100)
DisplaySprite3D(EffectSprite3D, 100, 100)
Stop3D()
StartDrawing(ScreenOutput())
DrawText(1,1,"FPS : " + StrF(Fps, 2), $00FF0000)
StopDrawing()
FlipBuffers(#PB_Screen_NoSynchronization)
Until Exit = #True
http://www.purebasic.fr/english/viewtopic.php?t=38479Thorium hat geschrieben:Ich glaube das is ein Bug.![]()