Voici donc la solution que j'ai appliquée :
adaptation d'une fonction de détection de collision (pixelPerfect) pour modifier le canal Alpha du sprite qui subit les dégâts à son intersection avec un sprite de destruction.
Je peux varier la profondeur des dégâts infligés à l'aide des paramètres
getX et
getY.
J'espère ne pas choquer l'éthique, en tout cas je suis satisfait du résultat.
Shared Function FToIRect
(fRect
As FloatRect
) As IntRect
Return New IntRect
(Int(fRect
.Left),
Int(fRect
.Top),
Int(fRect
.Width),
Int(fRect
.Height)) End Function '/////////////////////// ' fonction pixelPerfect détournée ' Effet de destruction par modification du canal Alpha ' Le spriteA qui subit les dégats devient transparent à l'intersection avec le spriteB (au pixel près) '////////////////////// Shared Sub makeDamage
(spriteA
As Sprite, SpriteB
As Sprite, getX
As Double, getY
As Double) Dim newColor
As New SFML
.Graphics.Color Dim imgA
As Image
= spriteA
.Texture.CopyToImage Dim imgB
As Image
= SpriteB
.Texture.CopyToImage Dim boundsA
As IntRect
= FToIRect
(spriteA
.GetGlobalBounds) Dim boundsB
As IntRect
= FToIRect
(SpriteB
.GetGlobalBounds) Dim intersection
As IntRect
newColor
.A = 0 ' place le sprite de destrution aux coordonnées demandées SpriteB
.Position = New SFML
.Window.Vector2f(getX, getY
) If boundsA
.Intersects(boundsB, intersection
) Then Dim inverseA
As Transform
= SpriteA
.InverseTransform Dim inverseB
As Transform
= SpriteB
.InverseTransform Dim sizeA
As SFML
.Window.Vector2u = imgA
.Size Dim sizeB
As SFML
.Window.Vector2u = imgB
.Size Dim pixA
As Array
= imgA
.Pixels Dim pixB
As Array
= imgB
.Pixels Dim vecA, vecB
As SFML
.Window.Vector2f Dim xMax
As Integer = intersection
.Left + intersection
.Width Dim ymax
As Integer = intersection
.Top + intersection
.Height Dim x, y
As Integer For x
= intersection
.Left To xMax
For y
= intersection
.Top To ymax
vecA
= inverseA
.TransformPoint(x, y
) vecB
= inverseB
.TransformPoint(x, y
) Dim idxA
As Integer = (((CType(vecA
.X,
Integer) + (CType(vecA
.Y,
Integer) * sizeA
.X)) * 4) + 3) Dim idxB
As Integer = (((CType(vecB
.X,
Integer) + (CType(vecB
.Y,
Integer) * sizeB
.X)) * 4) + 3) If ((vecA
.X >= 0) _
AndAlso ((vecA
.Y >= 0) _
AndAlso ((vecB
.X >= 0) _
AndAlso ((vecB
.Y >= 0) _
AndAlso ((vecA
.X < sizeA
.X) _
AndAlso ((vecA
.Y < sizeA
.Y) _
AndAlso ((vecB
.X < sizeB
.X) _
AndAlso ((vecB
.Y < sizeB
.Y) _
AndAlso ((pixA
(idxA
) > 0) _
AndAlso (pixB
(idxB
) > 0)))))))))) Then ' rendre le pixel transparent imgA
.SetPixel(vecA
.X, vecA
.Y, newColor
) End If Next Next End If spriteA
.Texture = New Texture
(imgA
) End Sub