Problème de transparence et déplacements d'image

Résolu
Abyss24 Messages postés 3 Date d'inscription dimanche 10 décembre 2006 Statut Membre Dernière intervention 24 mars 2007 - 24 mars 2007 à 14:03
Abyss24 Messages postés 3 Date d'inscription dimanche 10 décembre 2006 Statut Membre Dernière intervention 24 mars 2007 - 24 mars 2007 à 16:00
Bonjour à tous, je suis débutant en VB.net.
Dans le cadre de mes étude, je réalise un programme : une petite tortue se déplaçant dans un environement graphique ( une picture box dans une aire de jeu ).
Un problème est survenu, j'ai essayé avec une image de tortue .png et .gif et c'est le même constat. Dans les propriété de la picture box, j'ai choisi un fond transparent : cela ne pose pas de problème lorsque que l'image est statique. Cependant des qu'elle commence à se déplacer ( j'utilise les coordonnées de l'image pour la faire déplacer, monimage.Left x, monimage.Top y ), l'image disparait progressivement ( comme si la picture box se déplacée sans l'image ) et ne réapparait qu'un fois le trajet terminé.
Quelqu'un aurait-il une idée d'ou cela peut venir, et sinon est-ce que je pourrais utulisé d'auters fonctionnalités pour manipuler les images et qui me permette de faire ce que je désire ?

Maxime

3 réponses

Abyss24 Messages postés 3 Date d'inscription dimanche 10 décembre 2006 Statut Membre Dernière intervention 24 mars 2007
24 mars 2007 à 16:00
Mon problème est en partie résolu, ( en partie seulement ) il suffisait de mettre :
latortue.Left = avancex
latortue.Top = avancey
Application.DoEvents()

DoEvents permet de stopper l'éxécution de l'algorithme tant que tout les Threads ( ce sont les processus qui s'éxécutent en parallèle de l'algorithme tel que l'affichage, j'explique avec mes mot, je ne suis que débutant ^^ ) n'ont pas terminé leur éxécution.

Un problème réside, ma tortue se déplace dans un objet de type Panel ( constituant mon aire de jeu ) dans lequel j'ai inséré une image de décoration.
 
L'image de décoration semble ralentir l'éxecution de mon programme, on le vois car la tortue se déplace très lentement.

Ma question est quel est le format d'image le plus léger à traité sachant que l'image de fond peut être de n'importe quel format, l'image de tortue peut-être .gif ou .png ( format acceptant les effets de transparence ) ?
 
Y'a-t-il aussi une autre fonction que DoEvents que je puisse mettre en oeuvre afin d'accélérer mes traitements ?
3
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
24 mars 2007 à 14:38
D'où celà vient ?

Mais...
On le saura peut-être en voyant ton code (pour l'instant totalement invisible) et ses explications (commentaires).
0
Abyss24 Messages postés 3 Date d'inscription dimanche 10 décembre 2006 Statut Membre Dernière intervention 24 mars 2007
24 mars 2007 à 15:32
Voici le code de ma procédure de déplacement. Je donne tout car je ne savais pas quoi selectionner.

Private Sub depart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles depart.Click

'Vitesse de déplacement de la tortue
Const rafraichissement = 1

Dim i As Integer
Dim rayon As Single
Dim anglerad2 As Single
Dim avancex As Integer
Dim avancey As Integer
Dim distanceX As Integer
Dim distanceY As Integer
Dim a As Single
Dim b As Single

'Masque le bouton durant toute la durée des déplacements
depart.Visible = False

'Permet d'attendre que le bouton se masque avant de continuer à éxécuter le code
'C'est à dire que le code précédent le doevents doit être éxécuté avant de continuer le code
Application.DoEvents()

For i = 1 To trajet
'Calcul du coefficient entre le point de départ du premier trajet de la tortue et son point d'arrivée
If lescoordonnee(i).x - lescoordonnee(i - 1).x <> 0 Then
a = (lescoordonnee(i).y - lescoordonnee(i - 1).y) / ((lescoordonnee(i).x - lescoordonnee(i - 1).x))
b = lescoordonnee(i).y - a * lescoordonnee(i).x
Else
'Cas ou le coefficiant directeur n'est pas calculable
a = 0
b = lescoordonnee(i).y
End If

'Calcul de la distance entre les 2 points ( point de départ et d'arrivée ) rac(x² + y²)
rayon = ((lescoordonnee(i).x - lescoordonnee(i - 1).x) ^ 2 + (lescoordonnee(i).y - lescoordonnee(i - 1).y) ^ 2) ^ (1 / 2)

'DistanceX représente l'absisse du point d'arrivée moins celle du point de départ
distanceX = lescoordonnee(i).x - lescoordonnee(i - 1).x

'DistanceX représente l'ordonnée du point d'arrivée moins celle du point de départ
distanceY = lescoordonnee(i).y - lescoordonnee(i - 1).y

If distanceX > 0 Then 'Si il y a un déplacement vers la droite
anglerad2 = Atan(distanceY / distanceX)
Else
If distanceX < 0 Then 'Si il y a un déplacement vers la gauche
anglerad2 = Atan(distanceY / distanceX)
anglerad2 = anglerad2 + PI
Else
If distanceY > 0 Then 'Si il y a un déplacement vers le bas
anglerad2 = PI / 2
Else
If distanceY < 0 Then 'Si il y a un déplacement vers le haut
anglerad2 = -PI / 2
Else
'Débogage
MsgBox("Erreur. Le point n'a pas bougé /!")
End If
End If
End If
End If

'Initialisation de avanceX et avanceY ( valeur ne faussant pas les calculs suivants )
'/!\ Ne pas enlever cette initialisation
avancex = 0
avancey = 0

'Les trajets de la tortue sont décomposées en 4 sortes de déplacement suivant des angles ( tout les PI/4 )

'Le principe est de calculer y par la fonction a chaque itération de la boucle ( on utilise x pour incrémenter) ou inversement
'On a x on calcule y, on ajoute +1 à x et on calcule à nouveau y et ainsi de suite
'Tout cela permet de fluidifier les mouvements de la tortue ( la tortue fait un trajet vertical par exemple, cela ne servirait à rien de faire varier x ),
'C'est pourquoi les trajets sont décomposés en 4 traitements
If (anglerad2 Mod 2 * PI) >= ((-PI / 4) Mod 2 * PI) And (anglerad2 Mod 2 * PI) < ((PI / 4) Mod 2 * PI) Then
avancex = lescoordonnee(i - 1).x
Do
'x<-- x + 1 signifie que la tortue avance vers la droite
avancex = avancex + 1
avancey = CInt(a * avancex + b)
'Permet de positionner la tortue en fonction de x et y sur l'aire de jeu
latortue.Left = avancex
latortue.Top = avancey
System.Threading.Thread.Sleep(rafraichissement)
Loop Until avancex = lescoordonnee(i).x
Else
If (anglerad2 Mod 2 * PI) >= ((PI / 4) Mod 2 * PI) And (anglerad2 Mod 2 * PI) < ((3 * PI / 4) Mod 2 * PI) Then
avancey = lescoordonnee(i - 1).y
Do
'y<-- y + 1 signifie que la tortue avance vers le bas
avancey = avancey + 1
If a <> 0 Then
avancex = CInt((avancey - b) / a)
Else
'Cas particulier où le trajet est strictement vertical ( vers le bas )
avancex = lescoordonnee(i).x
End If
latortue.Left = avancex
latortue.Top = avancey
System.Threading.Thread.Sleep(rafraichissement)
Loop Until avancey = lescoordonnee(i).y
Else
If (anglerad2 Mod 2 * PI) >= ((3 * PI / 4) Mod 2 * PI) And (anglerad2 Mod 2 * PI) < ((5 * PI / 4) Mod 2 * PI) Then
avancex = lescoordonnee(i - 1).x
Do
'x<-- x + 1 signifie que la tortue avance vers la gauche
avancex = avancex - 1
avancey = CInt(a * avancex + b)
latortue.Left = avancex
latortue.Top = avancey
System.Threading.Thread.Sleep(rafraichissement)
Loop Until avancex = lescoordonnee(i).x
'anglerad2 >= (-3 * PI / 4) and anglerad2 < (-PI / 4 )
Else
avancey = lescoordonnee(i - 1).y
Do
'y<-- y - 1 signifie que la tortue avance vers le haut
avancey = avancey - 1
If a <> 0 Then
avancex = CInt((avancey - b) / a)
Else
'Cas particulier où le trajet est strictement vertical ( vers le haut )
avancex = lescoordonnee(i).x
End If
latortue.Left = avancex
latortue.Top = avancey
System.Threading.Thread.Sleep(rafraichissement)
Loop Until avancey = lescoordonnee(i).y
End If
End If
End If
Next

'Le bouton se réaffiche
depart.Visible = True
End Sub
0
Rejoignez-nous