Deplacement d'une image

lordfinalff Messages postés 84 Date d'inscription vendredi 2 septembre 2005 Statut Membre Dernière intervention 14 décembre 2009 - 19 juil. 2006 à 13:53
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 - 19 juil. 2006 à 15:10
Je suis en train de faire un jeu, ou on deplace l'image grace au fleche directionel, pour cela, j'utilise la fonction keydown, mais, etais donné que le personnage vol, j'aimerai un déplacement plus fluide, j'aimerai aussi pouvoir combiné plusieur touches, par exemple, lorsqu'on appui sur la flèche gauche, et la flèche haut,  j'aimerai que le personnage monte en diagonale vers la gauche.

Voici a quoi ressemble mon code

je vous previens que je débute !

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
    Select Case KeyCode
        Case Is = vbKeyLeft ' je demande cherche qu'elle touche a été pressé 
             If Perso.Left = 0 Then ' je surveille que le personnage ne puisse pas sortir de l'écran
            Else
            Perso.Picture = Trunks_g_2.Picture ' si tout est bon, je met l'image du perso qui regarde vers la gauche
            Perso.Left = Perso.Left - 500 ' je le fais bouger
            direction = "gauche" ' je met dans une variable dans quel sans il est, utile pour quand il attaquera,
             End If  ' et je clos le tout
        Case Is = vbKeyRight
             If Perso.Left = 7000 Then
            Else
            Perso.Picture = Trunks_d_2.Picture
            Perso.Left = Perso.Left + 500
            direction = "droite"
             End If

le probleme, c'est que le personnage se deplace par acoup, et si lorsqu'il va vers la gauche, j'appuis sur la touche haut, il prendra en compte la derniere touche préssé, et montera, mais n'ira pas vers la gauche ne meme temps !!
LORDFINALFF

8 réponses

jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
19 juil. 2006 à 14:16
Salut,

Essaie un truc de ce style
'Variable privee du Form
Private BLeft As Boolean 
Private BRight As Boolean 
Private BUp As Boolean 
Private BDown As Boolean 

Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer) 
Select Case KeyCode 
    Case vbKeyUp: BUp = False 
    Case vbKeyDown: BDown = False 
    Case vbKeyLeft: BLeft = False 
    Case vbKeyRight: BRight = False 
End Select 
End Sub 

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) 

    Dim x As Long 
    Dim y As Long 

    x = Perso.Left 
    y = Perso.Top 

    Select Case KeyCode 
        Case vbKeyUp: BUp = True 
        Case vbKeyDown: BDown = True 
        Case vbKeyLeft: BLeft = True 
        Case vbKeyRight: BRight = True 
    End Select 

    If BLeft Then 
        x = x - 500  'déplacement vers la gauche
    ElseIf BRight Then 
        x = x + 500  'déplacement vers la droite
    End If 

    If BUp Then 
        y = y - 500  'déplacement vers le haut
    ElseIf BDown Then 
        y = y + 500  'déplacement vers le bas
    End If 

    Call Perso.Move(x, y) 
End Sub 
 

<small> Coloration syntaxique automatique [AFCK]</small>
       

Mais il y a peu etre plus optimiser et plus jolie avec les API <gras>GetKeyboardState et/ou GetKeyState</gras>

 

@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée, Règlement/FONT>
0
lordfinalff Messages postés 84 Date d'inscription vendredi 2 septembre 2005 Statut Membre Dernière intervention 14 décembre 2009
19 juil. 2006 à 14:19
ok, je vais essayer, mais je comprend pas a la fin, pourquoi ya marquer " call  Perso.move(x, y) ???

LORDFINALFF
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
19 juil. 2006 à 14:33
Salut,

Perso est le nom de mon objet Image.

Cet objet possède la procédure .Move qui permet de placer l'objet

En fait

call  Perso.move(x, y) est équivalent à

Perso.Left = x
Perso.Top= Y

@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée, Règlement/FONT>
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
19 juil. 2006 à 14:33
Le call Perso.move revient à tes :
Perso.Left = ...
Perso.Top = ...

Si tu veux un affichage plus fluide, diminue l'incrément, et utilise un timer pour le déplacer, exemple :
Timer1_Timer
Perso.Left = Perso.Left + 100
Perso.Top = Perso.Top + 100

avec un timer à 100 ms, l'affichage sera plus fluide qu'en faisant un simple :
Perso.Left = Perso.Left + 500

Perso.Top = Perso.Top + 500
toutes les 500 ms !
0

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

Posez votre question
lordfinalff Messages postés 84 Date d'inscription vendredi 2 septembre 2005 Statut Membre Dernière intervention 14 décembre 2009
19 juil. 2006 à 14:34
ok, pourrai tu stp, mettre a coté de ton code, des explications, pour expliquer chaque étape, car j'aimerai bien comprendre ! Merci !
LORDFINALFF
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
19 juil. 2006 à 14:41
SAlut,

Je pensais que le code était pourtant assez simple.

'Variable privee du Form
Private BLeft As Boolean 'Flag permettant de mémoriser si la touche Fleche Gauche a ete appuyée
Private BRight As Boolean 'Flag permettant de mémoriser si la touche Fleche Droite a ete appuyée 
Private BUp As Boolean  'Flag permettant de mémoriser si la touche Fleche Haut a ete appuyée
Private BDown As Boolean 'Flag permettant de mémoriser si la touche Fleche Bas a ete appuyée

Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer) 
'Survient lorsque une touche est relachée
Select
 Case KeyCode 
   'Si c'est la touche Fleche Haut qui est relachée reinitialise le Flag
    Case vbKeyUp: BUp = False 
   'Si c'est la touche Fleche Bas qui est relachée reinitialise le Flag
    Case vbKeyDown: BDown = False 
   'Si c'est la touche Fleche Gauche qui est relachée reinitialise le Flag
    Case vbKeyLeft: BLeft = False 
   'Si c'est la touche Fleche Droite qui est relachée reinitialise le Flag
    Case vbKeyRight: BRight = False 
End Select 
End Sub

Pour le reste je pense que c'est assez simple.

Suivant les flag memorise, on joue avec les propriétés Top est Left de l'image

Les cas qui sont pénibles sont les cas  Haut + Bas et Gauche + Droite. a toi de voir ce que tu privilégie.
@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée, Règlement
/FONT>
0
lordfinalff Messages postés 84 Date d'inscription vendredi 2 septembre 2005 Statut Membre Dernière intervention 14 décembre 2009
19 juil. 2006 à 14:49
meric jrivet, mais ton code, comme tu me la dit, correspond au mien, mais en plus court, mais cela ne permet toujours pas un deplacemnt plus fluide, en fait, ce que je voudrais surtout, c'est que l'ont puisse par exemple, en appuyant sur gauche et haut, que le personnage s'oriente vers la gauche tout en montant, faire une diagonale quoi !

LORDFINALFF
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
19 juil. 2006 à 15:10
salut,

tu as toutes les pistes....
plus fluide : timer à intervalle plus court
peut-être aussi bien vérifier tes propriétés autoredraw.. certaines sont peut-être inutiles

diagonales : API. revoir fin du message de JRivet.
++
<hr size="2" width="100%" />Prenez un instant pour répondre à ce sondage svp
0
Rejoignez-nous