Scintillement de contrôles lors d'un déplacement

Résolu
djedjeska Messages postés 90 Date d'inscription mercredi 21 novembre 2007 Statut Membre Dernière intervention 25 mai 2013 - 18 août 2011 à 11:48
djedjeska Messages postés 90 Date d'inscription mercredi 21 novembre 2007 Statut Membre Dernière intervention 25 mai 2013 - 5 oct. 2011 à 01:51
Bonjour à tous,

J'ai déjà cherché dans d'autres post/forums la réponse à mon problème mais je ne la trouve pas, et ce, sûrement parce que j'utilise une version très ancienne de Visual Basic (je ne sais même pas son nom), c'est à dire Visual Basic pour PPT 97 (J'ai fait de nombreux jeux avec et je n'ai jamais voulu "évoluer"...).

Je demande quand même au cas où

J'ai créé un code dans lequel appuyer sur une touche fait se déplacer un contrôle (image ou label peu importe).

J'ai une image en arrière plan de mon "Userform" (je pense que ça s'appelle "Form" aujourd'hui) et aussi une en arrière plan de mon contrôle).

Lorsque le contrôle se déplace, j'ai un effet de scintillement... Comme si le rafraichissement était trop lent. J'ai vu que certaines méthodes existent, mais je ne crois pas que dans ma version ce soit possible...

Les idées sur le sujet sont les bienvenues... Merci

32 réponses

NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
20 août 2011 à 01:02
Bonjour,

Pour résumer ce sujet :
Aucunes solution pour éviter le scintillement sur VBA PowerPoint.
Pour des développements plus poussé, il est conseillé de prendre des langages adapté, faire de gros programmes en VBA est déconseillé (surtout si VBA n'a pas de plus pour l'usage que tu en fait, ici, d'après la description de ton pb, je suppose que faire du VB.NET serait nettement plus adapté).
Si tu veux rester en VB, il te faudra utiliser VisualBasic .NET (version gratuite sous le nom de "VisualBasic 2010 Express").

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
3
Utilisateur anonyme
18 août 2011 à 12:50
Salut dj,

Si tu passes à la dernière version VB tu as pas mal de boulot, mais à la fin tu ne regretteras pas.

Envoie nous la partie de code que t’utilises déjà...

A+


CF2i - Guadeloupe
Ingénierie Informatique
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
18 août 2011 à 14:18
Bonjour,

VBA (Tu es en VBA PPT) n'est pas spécialement conseillé pour les jeux
Je te conseil quand même de passer à plus récent, par exemple VB.NET, cela te permettra de faire les choses de manière plus contrôlées, mais il te faudra presque tout réapprendre.

---------------------------------------------------------------------
[list][*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu, pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
0
djedjeska Messages postés 90 Date d'inscription mercredi 21 novembre 2007 Statut Membre Dernière intervention 25 mai 2013
19 août 2011 à 20:20
Oui ça fait longtemps que j'envisage de passer à plus récent... Le gros problème c'est que ça signifierait pour moi abandonner tous les jeux et programmes que j'ai déjà fait jusque là, et puis ça demanderait effectivement un gros investissement de réapprentissage...

Bref, mon code est simple :
Private Sub UserForm_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

If KeyCode = vbKeyZ Then

For boucle = 0 To Controle.Controls.Count - 1
Controle.Controls(boucle).Top = Controle.Controls(boucle).Top + 10
Next

Else

If KeyCode = vbKeyS Then

For boucle = 0 To Controle.Controls.Count - 1
Controle.Controls(boucle).Top = Controle.Controls(boucle).Top - 10
Next

End If
End If

End Sub
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
19 août 2011 à 20:29
Re:
Alors dans vusual studio 2010 il existe un outil de conversion des anciennes versions de VB vers le 2010.
Tu risques d'avoir à rectifier quelques lignes mais c'est pas mal.

Dans ton cas précis as tu essaye d'introduire un DoEvents dans tes boucles? (juste pour voir)

A+


CF2i - Guadeloupe
Ingénierie Informatique
0
djedjeska Messages postés 90 Date d'inscription mercredi 21 novembre 2007 Statut Membre Dernière intervention 25 mai 2013
19 août 2011 à 21:04
Un outil de conversion ???? Incroyable !! J'ai demandé à plein de gens mais personne ne savait comment faire...

Ca me donne encore plus envie de me mettre à jour...

Oui j'ai essayé pour les DoEvents, mais ça n'avait pas été concluant... D'autant que lorsque mon code devient plus lourd, le DoEvents peut devenir particulièrement génant...
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
19 août 2011 à 21:21
Bonjour,

L'outil permet de convertir du VB6 en VB.NET, pas du VBA (PPT ici).
Il faudra tout recoder, mais en général, c'est pas plus mal au vu de la différence qu'il y a entre ces 2 langages.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
0
Utilisateur anonyme
19 août 2011 à 21:41
Il a raison Henry, c'est jamais trop tard pour refaire un projet à neuf, en plus tu reprends toute la structure (des trucs que t'avais oublié et que t'as du rajouter et que ça a compliqué etc.)

J'ai fait un logiciel pour une chaine de musées, je t'explique, j'ai commencé en 2003 et j'ai fini en 2008.
Je l'ai fait en vb6, vb2003 et vb2008 à chaque fois je le reprenais à zéro (bien sur tu reprends des bout de code déjà faits et tu rectifies les erreurs)
La patience, la patience...


CF2i - Guadeloupe
Ingénierie Informatique
0
djedjeska Messages postés 90 Date d'inscription mercredi 21 novembre 2007 Statut Membre Dernière intervention 25 mai 2013
19 août 2011 à 21:53
Je comprends... Mais j'ai quelques projets très très lourds... Peut être que je le recoderai quand je me serai familiarisé avec le nouveau langage.....
0
Utilisateur anonyme
20 août 2011 à 01:12
Oui tout à fait.
Ceci-dit je viens de trouver quelques fichiers faits par mon frère en vba sous excel avec des jeux très bien réussis comme tetris, bublecell etc.

CF2i - Guadeloupe
Ingénierie Informatique
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
20 août 2011 à 01:19
Bonjour,

Je n'ai pas dit que VBA n'était pas fonctionnel pour ce genre de programme, j'ai juste dit qu'il y a plus adapté, c'est tout.

Tu peux naviguer en plein océan sur un rondin de bois, mais c'est pas l'embarcation la plus adapté. (si tu me comprend)
Après, chacun ses choix et ses motivations.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
0
Utilisateur anonyme
20 août 2011 à 01:25
Oui c'est ce que je voulais dire aussi, désolé si j'ai du mal à m'exprimer en ce moment...

Pour le rondin de bois en plein océan et la motivation nécessaire... ça dépend s'il y a des requins... (je suis en Guadeloupe)

CF2i - Guadeloupe
Ingénierie Informatique
0
djedjeska Messages postés 90 Date d'inscription mercredi 21 novembre 2007 Statut Membre Dernière intervention 25 mai 2013
21 août 2011 à 08:07
J'ai pour ma part fait un Zelda qui ressemblent à ceux de Game Boy mais en mieux, ainsi qu'un petit jeu qu'on peut jouer en réseau local du style Age of Empires...

Donc c'est en effet assez lourd...
Et je commence à connaître tous les recoins de VBA, donc la programmation n'est pas si compliquée pour moi (du moins pour ce que j'en fait). Mais le scintillement est en effet un problème qui me donne envie de changer de cap...
0
Utilisateur anonyme
21 août 2011 à 13:08
Re:
Non mais tu gardes ceux la en vba et les prochains tu les fais en vb2010 (tu peux faire ça aussi)
Sur ce forum tu trouveras l'aide nécessaire pour débuter



CF2i - Guadeloupe
Ingénierie Informatique
0
djedjeska Messages postés 90 Date d'inscription mercredi 21 novembre 2007 Statut Membre Dernière intervention 25 mai 2013
21 août 2011 à 17:57
Merci pour tout :D
0
djedjeska Messages postés 90 Date d'inscription mercredi 21 novembre 2007 Statut Membre Dernière intervention 25 mai 2013
4 oct. 2011 à 19:59
Bonsoir ! Je réécris ici pour ne pas encombrer le forum, car ma question est liée à ce sujet.

Depuis quelques semaines, j'ai écouté votre conseil et je me suis mis à vb.net, ce qui a été tout-à-fait bénéfique pour moi, donc je vous remercie.

Au sujet des contrôles qui scintillent, je n'ai plus le problème :
Sans utiliser la propriété "DoubleBuffered" de mon Form, j'obtiens un résultat plutôt satisfaisant, je peux déplacer des contrôles (en utilisant leur propriété Left et Top) sans qu'ils ne scintillent à outrance. En utilisant la propriété "DoubleBuffered", ils ne scintillent plus du tout, et la vitesse des boucles et 3 ou 4 fois plus rapide (réaction à laquelle je ne m'attendais pas).

Par contre, j'ai un phénomène de ralentissements, et je n'arrive pas à comprendre la raison. Ce phénomène survient surtout lorsque je modifie le Left d'un contrôle (vers la droite ou la gauche, donc), et également lorsque je passe au dessus de certaines zones que je n'arrive pas à déterminer (lorsque des contrôles se superposent apparemment, mais ce n'est pas tout le temps vrai).

Je déplace mes contrôles à l'aide de l'événement KeyDown, et j'utilise des boucles. Je pense que c'est ma méthode qui est à revoir. Voici une partie du code :

Public Class Controle



    Private Sub Controle_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
        If e.KeyCode = ToucheAppuyée Then
            Exit Sub
        End If

        ToucheAppuyée = e.KeyCode

        If e.KeyCode = Keys.Z Then GoTo Haut Else 
        If e.KeyCode = Keys.S Then GoTo Bas Else 
        If e.KeyCode = Keys.Q Then GoTo Gauche Else 
        If e.KeyCode = Keys.D Then GoTo Droite Else 
        Exit Sub

Haut:
        'VERS LE HAUT
        Do While ToucheAppuyée = Keys.Z
            My.Application.DoEvents()
            For Each Control In Me.Controls
                If Control IsNot Boule Then
                    Control.Location = New Point(Control.left, Control.top + 1)
                    'Control.Top += 1
                End If
            Next
        Loop

Bas:
        'VERS LE BAS
        Do While ToucheAppuyée = Keys.S
            My.Application.DoEvents()
            For Each Control In Me.Controls
                If Control IsNot Boule Then
                    Control.Location = New Point(Control.left, Control.top - 1)
                    'Control.Top -= 1
                End If
            Next
        Loop

Gauche:
        'VERS LA GAUCHE
        Do While ToucheAppuyée = Keys.Q
            My.Application.DoEvents()
            For Each Control In Me.Controls
                If Control IsNot Boule Then
                    Control.Location = New Point(Control.left + 1, Control.top)
                    'Control.left += 1
                End If
            Next
        Loop

Droite:
        'VERS LA DROITE
        Do While ToucheAppuyée = Keys.D
            My.Application.DoEvents()
            For Each Control In Me.Controls
                If Control IsNot Boule Then
                    Control.Location = New Point(Control.left - 1, Control.top)
                    'Control.left -= 1
                End If
            Next
        Loop

Suite:

        If AnciennePlateforme.Tag = "Gauche" And AnciennePlateforme.Left > -100 Then
            Plateformes()
        Else
            If AnciennePlateforme.Tag = "Droite" And AnciennePlateforme.Left < 100 Then
                Plateformes()
            Else
                If AnciennePlateforme.Tag = "Haut" And AnciennePlateforme.Top > -20 Then
                    Plateformes()
                End If
            End If
        End If

        Me.Text = Me.Controls.Count

    End Sub


    Private Sub Controle_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyUp
        ToucheAppuyée = Keys.NumPad0
    End Sub


End Class






Merci d'avance pour vos réponses.
0
djedjeska Messages postés 90 Date d'inscription mercredi 21 novembre 2007 Statut Membre Dernière intervention 25 mai 2013
4 oct. 2011 à 20:06
Quelques précisions supplémentaires :

J'ai oublié de finir ma phrase : j'ai un ralentissement surtout quand je modifie le "left"... mais beaucoup moins quand je modifie le "top" ! Ce que je trouve assez bizarre... (le contrôle se déplace très très vite en haut ou en bas, mais très lentement à gauche ou à droite).

Pour vous éclairer, il s'agit d'un jeu un peu comme "Ballance", une boule sur des plateformes. Ce sont en fait les plateformes qui se déplacent et ma boule reste statique, d'où ma boucle :
           For Each Control In Me.Controls
                If Control IsNot Boule Then
                    Control.Location = New Point(Control.left - 1, Control.top)
                    'Control.left -= 1
                End If
            Next
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
4 oct. 2011 à 20:36
Bonjour,

If e.KeyCode = Keys.Z Then GoTo Haut Else 
If e.KeyCode = Keys.S Then GoTo Bas Else 
If e.KeyCode = Keys.Q Then GoTo Gauche Else 
If e.KeyCode = Keys.D Then GoTo Droite Else 


Pas de GOTO injustifiés dans le code.
Dans ton cas, une structure :
If ... Then
ElseIf ... Then
Else
End If
Est largement préférable.

En VB.NET, quand on utilise GOTO, c'est que l'on a mal réfléchis à son code.

Sinon, il est peut-être préférable d'utiliser le Graphics de la form pour dessiner dessus au lieu d'utiliser des contrôles.

Sinon, je n'ai jamais eu ce problème, je n'ai jamais fais d'utilisation de ce genre aussi.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
0
Utilisateur anonyme
4 oct. 2011 à 20:58
Bonsoir,

Ce sont en fait les plateformes qui se déplacent et ma boule reste statique

Au lieu de faire bouger tous tes contrôles indépendamment, pourquoi ne pas intégrer tes plateformes dans un Container (panel par exemple :propriété Parent), d'intégrer ce panel dans un picturebox statique (le cadre du jeu).
Il ne te restera plus qu'à faire juste bouger la coordonnée de ton panel (coordonnées négatives possible pour Top et Left).
Ceci donnera l'impression d'un mouvement de l'ensemble.

Bonne prog.
0
Utilisateur anonyme
4 oct. 2011 à 21:11
Salut,

Ou sinon un truc du genre:
  Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
        For Each Control In Me.Controls
            If e.KeyCode Keys.Q Then Control.Location New Point(Control.left - 2, Control.top)
            If e.KeyCode Keys.D Then Control.Location New Point(Control.left + 2, Control.top)
            If e.KeyCode Keys.Z Then Control.Location New Point(Control.left, Control.top - 2)
            If e.KeyCode Keys.S Then Control.Location New Point(Control.left, Control.top + 2)
        Next
    End Sub


(Sans se compliquer la vie... :)
CF2i - Guadeloupe
Ingénierie Informatique
0
Rejoignez-nous