Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: [Résolu] Simulation de destruction - Utiliser les intRect ou canal alpha ?  (Lu 2740 fois)

0 Membres et 1 Invité sur ce sujet

r3dh4

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
    • E-mail
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 ?
« Modifié: Juillet 11, 2013, 04:53:17 pm par r3dh4 »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Combiner les intRect
« Réponse #1 le: Juillet 11, 2013, 09:10:25 am »
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.
Laurent Gomila - SFML developer

r3dh4

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
    • E-mail
Re : Combiner les intRect
« Réponse #2 le: Juillet 11, 2013, 12:05:41 pm »
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. :)

r3dh4

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
    • E-mail
Re : Combiner les intRect
« Réponse #3 le: Juillet 11, 2013, 03:03:41 pm »
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

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Simulation de destruction - Combiner les intRect
« Réponse #4 le: Juillet 11, 2013, 03:08:42 pm »
Impec :)
Laurent Gomila - SFML developer

r3dh4

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
    • E-mail
Re : Simulation de destruction - Combiner les intRect
« Réponse #5 le: Juillet 11, 2013, 04:51:57 pm »
Merci beaucoup, je passe en résolu.

 

anything