Problème lors du déplacement d'une image

Signaler
Messages postés
54
Date d'inscription
lundi 2 novembre 2009
Statut
Membre
Dernière intervention
7 août 2012
-
 Utilisateur anonyme -
Bonsoir, je vous explique mon problème, je veux faire déplacer une image, contenue dans une PictureBox aléatoirement dans ma fenêtre. J'y suis arrivé, cependant mon image étant une GIF, son fond est transparent, et lorsqu'elle se déplace, pendant quelques secondes elle garde le fond de l'image de fond de ma Form de là où elle se trouvée avant.
On m'a parlé du double buffering pour la redessiner correctement, mais je ne m'en suis jamais servi, alors je voudrais savoir si quelqu'un peut m'aider, lien, tuto, doc, technique d'approche ?

Voici mon code pour que vous voyez un peu mieux quel est mon problème:

Public Class Form1
    Dim Déplacement As Integer = 10
    Dim NewPosLeft, NewPosTop As Integer

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        PictureBox1.Left = 0
        PictureBox1.Top = 0
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        'Timer1.Enabled = False
        Dim Rand As New Random
        NewPosLeft = Rand.Next(Me.Width - PictureBox1.Width)
        NewPosTop = Rand.Next(Me.Height - PictureBox1.Height)
        NewPosLeft = (Int(NewPosLeft / Déplacement)) * Déplacement
        NewPosTop = (Int(NewPosTop / Déplacement)) * Déplacement
        Do
            Application.DoEvents()
            System.Threading.Thread.Sleep(20)
            If PictureBox1.Top < NewPosTop Then
                PictureBox1.Top += Déplacement
            ElseIf PictureBox1.Top > NewPosTop Then
                PictureBox1.Top -= Déplacement
            End If
            If PictureBox1.Left < NewPosLeft Then
                PictureBox1.Left += Déplacement
            ElseIf PictureBox1.Left > NewPosLeft Then
                PictureBox1.Left -= Déplacement
            End If
        Loop Until PictureBox1.Left NewPosLeft And PictureBox1.Top NewPosTop
    End Sub
End Class

13 réponses

Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
a coup de Sleep et de DoEvents...
moyen, ca.

vitesse non constante, en plus...
donc en fonction du processeur, de la charge du pc, etc. ton image ira plus ou moins vite...

il faut ajouter un ratio, fonction du temps écoulé entre deux frames

pour que cela ne clignotte pas, tu peux tenter un SuspendLayout ResumeLayout pour inhiber les séquences de dessin intermediaires.

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Messages postés
54
Date d'inscription
lundi 2 novembre 2009
Statut
Membre
Dernière intervention
7 août 2012

Bonjour, merci de m'avoir répondu.
On m'a déjà parlé de tout ça, mais mon problème n'est pas le clignotement, juste que lors de son déplacement le fond de mon image garde temporairement le fond de l'endroit où elle se trouvait avant sur la Form.

Bonsoir,

juste que lors de son déplacement le fond de mon image garde temporairement le fond de l'endroit où elle se trouvait avant sur la Form

Une petite astuce consiste à rendre invisible le picturebox (picturebox.visible = false) avant le déplacement. Puis de le rendre visible à nouveau après le déplacement.
Messages postés
54
Date d'inscription
lundi 2 novembre 2009
Statut
Membre
Dernière intervention
7 août 2012

Non, faire ça est tout ce que je cherche à éviter, je ne veux pas une téléportation de l'image, mais un vrai déplacement réel.

Salut gege,

Ucfoutu voulait t'aider dans ton problème dans une discussion précédente, pourquoi t'as abandonné?

Tu devrais t'intéresser à ControlStyles et DoubleBuffer regarde un peu ce qu'ils disent chez MSDN :

http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=FR-FR&k=k%28SYSTEM.WINDOWS.FORMS.CONTROLSTYLES.DOUBLEBUFFER%29;k%28TargetFrameworkMoniker-%22.NETFRAMEWORK%2cVERSION%3dV4.0%22%29;k%28DevLang-VB%29&rd=true

Bonnes fêtes



CF2i - Guadeloupe
Ingénierie Informatique
Messages postés
54
Date d'inscription
lundi 2 novembre 2009
Statut
Membre
Dernière intervention
7 août 2012

Bonjour, et merci d'avoir répondu.

J'ai arrêté l'autre topic, parce que c'était un autre problème et parce que Ucfoutu était tétu (c'est tout a son honneur ) et ne voulait pas réellement comprendre mon problème, d'ailleurs vous vous trompez vous aussi. Je n'ai pas réellement un problème de scintillement et j'ai déjà essayé le double buffer.

J'ai posté mon code exprès pour que tout le monde puisse comprendre et m'aider, mais personne n'a l'air décidé à copier/coller ce bout de code

Vas y envoie ton code et ton gif aussi:
carlos_gwada@hotmail.fr

Je vais tester pour voir, mais je pense un peu au caractère transparent de ton gif.




CF2i - Guadeloupe
Ingénierie Informatique
Messages postés
54
Date d'inscription
lundi 2 novembre 2009
Statut
Membre
Dernière intervention
7 août 2012

GIF ou PNG c'est pareil, tu as raison la faute vient de mes pixels transparents :(
Et mon code est celui du 1er poste de ce sujet, c'est le code de toute ma Form, tu ajoute un Timer, et une PictureBox, c'est tout

On avait essayé avec un jpeg normal ça fonctionnait bien, maintenant j'avais pas un gif ou png transparent sous la main.

Essaye avec un autre PNG pour voir ce que ça donne...




CF2i - Guadeloupe
Ingénierie Informatique
Messages postés
54
Date d'inscription
lundi 2 novembre 2009
Statut
Membre
Dernière intervention
7 août 2012

Si il n'y a pas de fond transparent sur l'image contenue dans ma PictureBox ça marche, c'est évident puisque ce qui bug c'est le fond transparent.

Envoie moi juste ton PNG on va tester..


CF2i - Guadeloupe
Ingénierie Informatique
Messages postés
54
Date d'inscription
lundi 2 novembre 2009
Statut
Membre
Dernière intervention
7 août 2012

Je t'ai envoyé tout mon projet donc avec le fond et le GIF, sur l'adresse hotmail que tu m'as passé juste avant.
Merci de t’intéresser autant à mon cas.
Bonne fêtes.

Bien reçu, je jette un oeuil...



CF2i - Guadeloupe
Ingénierie Informatique