Forum de la communauté SFML
Aide => Graphique => Discussion démarrée par: r3dh4 le Juillet 11, 2013, 02:28:55 am
-
Bonjour,
Tout d'abord, comme je ne l'ai pas encore fait dans ce forum, je me permets de saluer le travail remarquable fourni par Laurent Gomila qui apporte tant à la communauté des développeurs. Le dernier a m'avoir procuré ce sentiment de totale admiration dans le même registre est Oleg Kolbaski le développeur de LiteCad pour ceux qui connaissent.
Ceci étant dit, j'ai incontestablement besoin de votre aide car je cherche à simuler un effet de destruction par transformation du sprite qui subit les dégats sans avoir recours à l'utilisation de textures dédiées.
Le processus de destruction est simple, le sprite se désagrège (s'émiette) sans effets particuliers (voir fichier joint).
Je pensais donc à redéfinir la zone d'emprise par soustraction d'intRect correspondant à la zone touchée à l'intrect du batiment, je suis pas certain que ce soit possible.
Autre solution envisagée : modifier la texture correspondant au sprite par suppression de pixels dans la zone touchée, pas sûr que ce soit optimal en terme de performances.
Y-a-t-il des méthodes conseillées ?
-
Merci pour ces compliments :D
Si ce genre de modification n'est pas trop fréquente, tu peux mettre à jour le canal alpha de la texture. Ca ne devrait pas impacter les performances et ça reste la solution la plus simple.
Sinon il y a des solutions plus feintues, mais essaye déjà ça.
-
Ok, merci pour le conseil, je vais m'orienter vers la mise à jour du canal alpha.
Je présenterai le résultat obtenu avant de passer en résolu, j'espère y parvenir sans venir t'embêter. :)
-
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
-
Impec :)
-
Merci beaucoup, je passe en résolu.