Bouger 2 images avec le clavier

Résolu
ManuAntibes Messages postés 491 Date d'inscription mardi 24 octobre 2000 Statut Membre Dernière intervention 18 novembre 2021 - 30 oct. 2015 à 00:57
ManuAntibes Messages postés 491 Date d'inscription mardi 24 octobre 2000 Statut Membre Dernière intervention 18 novembre 2021 - 3 nov. 2015 à 14:12
Bonjour,

j'ai fais un petit jeu pour mes enfants.
et il y a deux personnes qu'il faut faire boucher avec les touches du clavier.
Sauf que les deux bougent, mais pas ensemble juste l'un après l'autre.
comme faire pour qu'ils puissent bouger ensemble et jouer fluidement.

voici mon code:
 

    Public ToucheDLili As Keys = Keys.R
    Public ToucheGLili As Keys = Keys.E
    Public ToucheBLili As Keys = Keys.Q
    Public ToucheHLili As Keys = Keys.A

    Public ToucheDJuju As Keys = Keys.Right
    Public ToucheGJuju As Keys = Keys.Left
    Public ToucheBJuju As Keys = Keys.Down
    Public ToucheHJuju As Keys = Keys.Up

    Private Sub Form_Magasin_KeyDown(sender As System.Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
        JUJU.Sortir()
        LILI.Sortir()

        Select Case e.KeyCode
            Case ToucheDJuju 'va à Droite
                JUJU.Aller_Droite()
            Case ToucheGJuju 'va à gauche
                JUJU.Aller_Gauche()
            Case ToucheHJuju 'va à Haut
                JUJU.Aller_Haut()
            Case ToucheBJuju 'va à Bas
                JUJU.Aller_Bas()
        End Select

        Select Case e.KeyCode
            Case ToucheDLili 'va à Droite
                LILI.Aller_Droite()
            Case ToucheGLili 'va à gauche
                LILI.Aller_Gauche()
            Case ToucheHLili 'va à Haut
                LILI.Aller_Haut()
            Case ToucheBLili 'va à Bas
                LILI.Aller_Bas()
        End Select

    End Sub



j'ai pas su chercher sur Google, il me trouve que bouger 1 image.

merci par avance

15 réponses

Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
2 nov. 2015 à 22:03
Bonsoir,

les types structure en VB.Net sont transmis par valeur (c'est une copie des valeurs de chaque membre qui sont envoyée dans la fonction) donc la variable le_jeu dans la fonction est indépendante de celle en dehors.

Essaye de faire une classe à la place d'une structure.

1
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 3/11/2015 à 06:09
Sous VB6, le mécanisme de passage des paramètres est par défaut par référence (ByRef), alors qu'il est par valeur (ByVal) sous VB.Net.
Or, qu'est une structure, sinon une variable d'un type personnalisé ? ==>> une variable est une variable ...
Il devrait donc suffire de transformer :
Private Sub etat_jeux(le_jeu As jeu, cle As Integer, etat As Boolean)

en
Private Sub etat_jeux(ByRef le_jeu As jeu, cle As Integer, etat As Boolean)

ou encore (pour tout définir explicitement)
Private Sub etat_jeux(ByRef le_jeu As jeu, ByVal cle As Integer, ByVal etat As Boolean)



EDIT : et je vois dans la foulée (mais rien à voir avec cette mésaventure) qu'il est possible de mieux condenser encore la procédure concernée ===>>
Private Sub etat_jeux(ByRef le_jeu As jeu, ByVal cle As Integer, ByVal etat As Boolean)
With le_jeu
Select Case cle
Case 68, 39: .av = etat
Case 71, 37: .ar = etat
Case 72, 38: .h = etat
Case 66, 40: .b = etat
End Select
End With
End Sub

________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
1
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
3 nov. 2015 à 06:36
Bonjour Uc, c'est exact ça doit marcher aussi.
Cependant, il est plus dans la "philosophie" de .Net d'utiliser une classe qu'une structure.
0
ManuAntibes Messages postés 491 Date d'inscription mardi 24 octobre 2000 Statut Membre Dernière intervention 18 novembre 2021 5
3 nov. 2015 à 06:54
oui en effet le fait de rajouter byRef et ByVal, ça à marcher
cool.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211 > ManuAntibes Messages postés 491 Date d'inscription mardi 24 octobre 2000 Statut Membre Dernière intervention 18 novembre 2021
3 nov. 2015 à 08:45
Bon ...
Voilà au moins déjà une solution qui marche. Content pour toi.
Tu as remarqué, je pense, qu'un joueur peut ainsi aller aussi en diagonale (en appuyant à la fois sur une touche pour aller horizontalement et une touche pour aller verticalement.
Amuse toi bien avec tes enfants.

PS : à ta place, je brancherais un clavier/pavé numérique usb de plus et j'y utiliserais, pour l'un des joueurs, les touches 4,5,6,1,2 et 3 (sur lesquelles je mettrais des étiquettes de flèches). Ce sera plus confortable pour lui.
Les signaux de ce pavé seront reconnus également spontanément.(sans modifier le code).
0
ManuAntibes Messages postés 491 Date d'inscription mardi 24 octobre 2000 Statut Membre Dernière intervention 18 novembre 2021 5
3 nov. 2015 à 14:12
en fait depuis le début soit le vendredi 30 oct, mes filles y jouent 1 avec le clavier et l'autre avec une manette.

Mais ça m'énervé de ne pas y arrivé à avec 2 joueurs pas clavier.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
30 oct. 2015 à 08:05
Bonjour,
Déjà : select case concerne l'examen d'une hypothèse concernant UN élément.
Deux fois cet examen (avec tes 2 Select Case e.KeyCode) est plutôt surprenant.
0
ManuAntibes Messages postés 491 Date d'inscription mardi 24 octobre 2000 Statut Membre Dernière intervention 18 novembre 2021 5
30 oct. 2015 à 09:22
Salut

as tu un lien vers une solution pour faire bouger les 2 images?
merci
0

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

Posez votre question
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
30 oct. 2015 à 09:27
Bonjour,

je n'ai jamais essayé, mais à brule pourpoint, je dirais qu'il faudrait un thread par personnage.

Ainsi chacun est indépendant et peut bouger en même temps.

0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
30 oct. 2015 à 09:29
Un "lien vers une solution" ? Je n'en ai aucun et ne fonctionne d'ailleurs pas ainsi ! (il faudrait un lien pour chaque cas ?).
Je procède personnellement- toujours autrement : j'analyse et choisis une stratégie personnelle en fonction du résultat exact à atteindre.
On ne connait à ce propos par le tien, de but exact ... ni tous les tenants et aboutissants.
- Dans quelle circonstance exacte deux touches seraient pressées exactement au même moment ? A partir d'un seul ou de 2 claviers ?
- Quelles sont les procédures appelées (JUJU.Aller_Droite, etc ....) ? Utilisent-elles un timer ?
- etc ...
0
ManuAntibes Messages postés 491 Date d'inscription mardi 24 octobre 2000 Statut Membre Dernière intervention 18 novembre 2021 5
30 oct. 2015 à 09:32
je crois que le problème aussi est que je passe par le "Me.KeyDown"
ne peut on pas faire bouger par autre chose que par "me.KeyDown".

je vais testé le thread.
0
ManuAntibes Messages postés 491 Date d'inscription mardi 24 octobre 2000 Statut Membre Dernière intervention 18 novembre 2021 5
30 oct. 2015 à 10:11
Le jeu est normalement simple, 2 personnages (soit 2 picturebox, Lili et Juju), doivent se déplacer dans l'écran pour prendre des objets et éviter les monstres.

Il y a 1 pc avec un écran et un clavier.
1 joueur utilise les touches AQER et un autre joueur les flèches du clavier.
0
ManuAntibes Messages postés 491 Date d'inscription mardi 24 octobre 2000 Statut Membre Dernière intervention 18 novembre 2021 5
30 oct. 2015 à 10:17
j'ai mis une picturebox dans un thread.

 Private Sub Form_Magasin_KeyDown(sender As System.Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown

        Dim Threading1 As New Thread(Sub() Mouvement_Juju(e))
        Threading1.IsBackground = True
        Threading1.Start()

        LILI.Sortir()
        Select Case e.KeyCode
            Case ToucheDLili 'va à Droite
                LILI.Aller_Droite()
            Case ToucheGLili 'va à gauche
                LILI.Aller_Gauche()
            Case ToucheHLili 'va à Haut
                LILI.Aller_Haut()
            Case ToucheBLili 'va à Bas
                LILI.Aller_Bas()
        End Select

    End Sub

    Dim MouvEnfant As Byte = 1

    Private Sub Mouvement_Juju(e As System.Windows.Forms.KeyEventArgs)
        JUJU = New Class_Juju(PictureBox_Juju.Location.X, PictureBox_Juju.Location.Y, Me)
        JUJU.Sortir() ' empeche de sortir du cadre

        Select Case e.KeyCode
            Case ToucheDJuju 'va à Droite
                Me.PictureBox_Juju.Left += 5 'va à droite
                JUJU.PositionEnfant = Me.PictureBox_Juju.Location
                Me.PictureBox_Juju.Image = My.Resources.JujuD1
                If MouvEnfant = 1 Then
                    Me.PictureBox_Juju.Image = My.Resources.JujuD2
                    MouvEnfant = 2
                    Exit Sub
                ElseIf MouvEnfant = 2 Then
                    Me.PictureBox_Juju.Image = My.Resources.JujuD3
                    MouvEnfant = 3
                    Exit Sub
                ElseIf MouvEnfant = 3 Then
                    Me.PictureBox_Juju.Image = My.Resources.JujuD1
                    MouvEnfant = 1
                    Exit Sub
                End If
            Case ToucheGJuju 'va à gauche
                ' JUJU.Aller_Gauche()
                Me.PictureBox_Juju.Left -= 5 'va à droite
                JUJU.PositionEnfant = Me.PictureBox_Juju.Location
                Me.PictureBox_Juju.Image = My.Resources.JujuG1
                If MouvEnfant = 1 Then
                    Me.PictureBox_Juju.Image = My.Resources.JujuG2
                    MouvEnfant = 2
                    Exit Sub
                ElseIf MouvEnfant = 2 Then
                    Me.PictureBox_Juju.Image = My.Resources.JujuG3
                    MouvEnfant = 3
                    Exit Sub
                ElseIf MouvEnfant = 3 Then
                    Me.PictureBox_Juju.Image = My.Resources.JujuG1
                    MouvEnfant = 1
                    Exit Sub
                End If
            Case ToucheHJuju 'va en Haut
                'JUJU.Aller_Haut()
                Me.PictureBox_Juju.Top -= 5 ' va en haut
                JUJU.PositionEnfant = Me.PictureBox_Juju.Location
                Me.PictureBox_Juju.Image = My.Resources.JujuH1
                If MouvEnfant = 1 Then
                    Me.PictureBox_Juju.Image = My.Resources.JujuH2
                    MouvEnfant = 2
                    Exit Sub
                ElseIf MouvEnfant = 2 Then
                    Me.PictureBox_Juju.Image = My.Resources.JujuH3
                    MouvEnfant = 3
                    Exit Sub
                ElseIf MouvEnfant = 3 Then
                    Me.PictureBox_Juju.Image = My.Resources.JujuH1
                    MouvEnfant = 1
                    Exit Sub
                End If
            Case ToucheBJuju 'va en Bas
                'JUJU.Aller_Bas()
                Me.PictureBox_Juju.Top += 5 ' va en bas
                JUJU.PositionEnfant = Me.PictureBox_Juju.Location
                Me.PictureBox_Juju.Image = My.Resources.JujuB1
                If MouvEnfant = 1 Then
                    Me.PictureBox_Juju.Image = My.Resources.JujuB2
                    MouvEnfant = 2
                    Exit Sub
                ElseIf MouvEnfant = 2 Then
                    Me.PictureBox_Juju.Image = My.Resources.JujuB3
                    MouvEnfant = 3
                    Exit Sub
                ElseIf MouvEnfant = 3 Then
                    Me.PictureBox_Juju.Image = My.Resources.JujuB1
                    MouvEnfant = 1
                    Exit Sub
                End If
        End Select
    End Sub



j'ai un message d'erreur, au niveau
 Me.PictureBox_Juju.Left += 5 'va à droite

Message d'erreur :
Opération inter-threads non valide : le contrôle 'Form1' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé.


j'ai du mal mettre mon thread, mais ou et comment le mettre ???
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
30 oct. 2015 à 13:56
Oui, un thread est un fil d'exécution, et on ne peut pas interagir directement entre 2 fils séparer.

Il faut utiliser un dispatcher et la méthode Pinvoke.

Tu interceptes les appuis touche dans un thread, puis tu invoke la méthode qui va déplacer ton personnage.

Mais comme je l'ai écrit plus haut, je ne suis pas sûr que ce soit la bonne voie, c'est juste une idée.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 2/11/2015 à 07:56
L'utilisation toute bête d'un timer permet de résoudre très facilement ce problème.
Je viens de le faire sous VB6 sans rencontrer la moindre difficulté.

Transposer cela (un petit exemple tout bête) pour VB.Net :
Sur un form :
- un label labelX
- un label labelflechegauche
- un timer enabled avec intervalle de 1

et ce code à transposer pour VB.Net
 Option Explicit
Private labX As Boolean, labfg As Boolean

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = 37 Then labfg = True
If KeyCode = 88 Then labX = True
End Sub


Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer)
If KeyCode = 37 Then labfg = False
If KeyCode = 88 Then labX = False
End Sub

Private Sub Timer1_Timer()
If labfg Then
labelflechegauche.Left = labelflechegauche.Left - 1
End If
If labX Then
LabelX.Left = LabelX.Left + 1
End If
End Sub


jouer (en même temps ou séparément) avec les touches X et flèche gauche et constater
________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
2 nov. 2015 à 11:23
Tiens ===>>> la chose m'intéressant un peu, je me suis amusé (toujours sous VB6) à tout traiter (dans tous les sens pour chaque joueur) et de manière plus condensée ===>>
Sur ton form :
- un timer comme dans l'exemple précédent (même intervalle et eanbled)
- un label nommé jacques
- un label nommé pierre
===>>>
Option Explicit
Private Type jeu
av As Boolean
ar As Boolean
h As Boolean
b As Boolean
End Type
Private jeu_jacques As jeu
Private jeu_pierre As jeu

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Select Case KeyCode
Case 68, 71, 72, 66
etat_jeux jeu_jacques, KeyCode, True
Case 37 To 40
etat_jeux jeu_pierre, KeyCode, True
End Select
End Sub


Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer)
Select Case KeyCode
Case 68, 71, 72, 66
etat_jeux jeu_jacques, KeyCode, False
Case 37 To 40
etat_jeux jeu_pierre, KeyCode, False
End Select
End Sub

Private Sub Timer1_Timer()
If jeu_pierre.ar Then
pierre.Left = pierre.Left - 1
End If
If jeu_pierre.av Then
pierre.Left = pierre.Left + 1
End If
If jeu_pierre.h Then
pierre.Top = pierre.Top - 1
End If
If jeu_pierre.b Then
pierre.Top = pierre.Top + 1
End If


If jeu_jacques.av Then
jacques.Left = jacques.Left + 1
End If
If jeu_jacques.ar Then
jacques.Left = jacques.Left - 1
End If
If jeu_jacques.h Then
jacques.Top = jacques.Top - 1
End If
If jeu_jacques.b Then
jacques.Top = jacques.Top + 1
End If
End Sub

Private Sub etat_jeux(le_jeu As jeu, cle As Integer, etat As Boolean)
With le_jeu
Select Case cle
Case 68: .av = etat
Case 71: .ar = etat
Case 72: .h = etat
Case 66: .b = etat
Case 37: .ar = etat
Case 38: .h = etat
Case 39: .av = etat
Case 40: .b = etat
End Select
End With
End Sub



jacques utilise les flèches directionnelles et pierre les touches G (pour gauche), D (pour droite), H (pour haut) et B (pour bas).

A toi de transposer tout cela en VB.Net (c'est facile ... en te précisant que je crois que Type (la variable personnalisée jeu) est sous vb.net : Structure
Amuse-toi (ou tes enfants, donc) bien.
0
ManuAntibes Messages postés 491 Date d'inscription mardi 24 octobre 2000 Statut Membre Dernière intervention 18 novembre 2021 5
2 nov. 2015 à 21:40
bonjour

merci pour tes codes ucfoutu.
sur le deuxième message (le code avec tt les directions)



et ton
 Private Type jeu 
à été converti en
Private Structure jeu 
dans VB.net.
comme tu as précisé

par contre j'ai un bug, dans le timer1
il ne garde pas la valeur True, récupéré dans etat_jeux.
pourquoi ??
0
ManuAntibes Messages postés 491 Date d'inscription mardi 24 octobre 2000 Statut Membre Dernière intervention 18 novembre 2021 5
3 nov. 2015 à 07:00
par contre quand je fais ma class, j'ai un souligné qui me bloque.


Public Class Class_Jeu

Private Structure jeu
Private av As Boolean
Private ar As Boolean
Private ha As Boolean
Private ba As Boolean
End Structure

Private _jeu_jacques As jeu
Private _jeu_pierre As jeu

Public Property Jeu_Jacques As jeu
Get
Return _jeu_jacques
End Get
Set(value As jeu)
_jeu_jacques = value
End Set
End Property

Public Property Jeu_Pierre As jeu
Get
Return _jeu_pierre
End Get
Set(value As jeu)
_jeu_pierre = value
End Set
End Property

End Class




merci
0
Zermelo Messages postés 378 Date d'inscription samedi 22 septembre 2012 Statut Membre Dernière intervention 13 août 2017 14
3 nov. 2015 à 10:12
Bonjour ucfoutu, bonjour ManuAntibes.
J'ai fait ce que j'ai pu pour transcrire terme à terme. Cela a l'air de fonctionner. Ne pas oublier de mettre KeyPreview à True.

Public Class Accueil
Private Structure jeu
Dim av As Boolean
Dim ar As Boolean
Dim h As Boolean
Dim b As Boolean
End Structure
Private jeu_jacques As jeu
Private jeu_pierre As jeu

Private Sub Accueil_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
Dim KeyCode As Integer = e.KeyValue
Select Case KeyCode
Case 68, 71, 72, 66
'MessageBox.Show(KeyCode.ToString)
etat_jeux(jeu_jacques, KeyCode, True)
Case 37 To 40
'MessageBox.Show(KeyCode.ToString)
etat_jeux(jeu_pierre, KeyCode, True)
End Select
End Sub

Private Sub Accueil_KeyUp(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyUp
Dim KeyCode As Integer = e.KeyValue
Select Case KeyCode
Case 68, 71, 72, 66
etat_jeux(jeu_jacques, KeyCode, False)
Case 37 To 40
etat_jeux(jeu_pierre, KeyCode, False)
End Select
End Sub

Private Sub etat_jeux(ByRef le_jeu As jeu, ByVal cle As Integer, ByVal etat As Boolean)
With le_jeu
Select Case cle
Case 68 : .av = etat
Case 71 : .ar = etat
Case 72 : .h = etat
Case 66 : .b = etat
Case 37 : .ar = etat
Case 38 : .h = etat
Case 39 : .av = etat
Case 40 : .b = etat
End Select
End With
End Sub

Private Sub Timer1_Tick(sender As Object, e As System.EventArgs) Handles Timer1.Tick
'MessageBox.Show("?")
If jeu_pierre.ar Then
Pierre.Left = Pierre.Left - 1
End If
If jeu_pierre.av Then
Pierre.Left = Pierre.Left + 1
End If
If jeu_pierre.h Then
Pierre.Top = Pierre.Top - 1
End If
If jeu_pierre.b Then
Pierre.Top = Pierre.Top + 1
End If


If jeu_jacques.av Then
Jacques.Left = Jacques.Left + 1
End If
If jeu_jacques.ar Then
Jacques.Left = Jacques.Left - 1
End If
If jeu_jacques.h Then
Jacques.Top = Jacques.Top - 1
End If
If jeu_jacques.b Then
Jacques.Top = Jacques.Top + 1
End If
End Sub

End Class


Cordialement.
0
Rejoignez-nous