IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Récupérer un évenement du clavier


Sujet :

C#

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 194
    Points : 83
    Points
    83
    Par défaut Récupérer un évenement du clavier
    Bonjour,

    comment fait-on pour récupérer un évènement du clavier (appui sur la touche entrée, a, b,...) dans un programme c#?
    c'est pour un jeu, pour déplacer un personnage

    merci d'avance

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    374
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 374
    Points : 451
    Points
    451
    Par défaut
    bonjour,
    Intercepte l'événemt keypress.
    Bon boulot
    Jean

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 194
    Points : 83
    Points
    83
    Par défaut
    oui j'avais compris mais c'est justement ce que je ne sais pas comment faire

  4. #4
    Membre confirmé
    Profil pro
    Développeur freelance
    Inscrit en
    Août 2006
    Messages
    453
    Détails du profil
    Informations personnelles :
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur freelance

    Informations forums :
    Inscription : Août 2006
    Messages : 453
    Points : 586
    Points
    586
    Par défaut
    Tu sélectionne ton composant sur lequel tu veux récupérer l'évènement, ensuite tu vas dans les propriété (l'éclair) et là tu associes l'évènement KeyPress à une méthode ...
    Sinon tu l'a crées à la main.

    Mosco.

  5. #5
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 194
    Points
    5 194
    Par défaut
    et voir, plutot mettre un gestionnaire d'evenement sur le KeyDown car certaines touches pour certains composants ne passent pas dans le keyPress (par exemple, les touches fleches ne sont pas toujours trappéés...)

    Ne pas oublier la propriété KeyPreview à true.. ce qui permet de ne pas limiter la gestion des evenements claviers au controle active ayant le focus

    The Monz, Toulouse

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 194
    Points : 83
    Points
    83
    Par défaut
    oui, mais sur quel composant dois-je mettre le keypress sachant que c'est un jeu et que l'utilisateur peut bouger un personnage? il n'y a aucune textbox...

    dois-je le mettre sur le form load?

  7. #7
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 194
    Points
    5 194
    Par défaut
    Tu mets ton event sur la Form de base...

    Tu selectionnes ta form dans le designer et tu vas sur l'éclair pour choisir
    ton evenement OnKeyDown

    (vu que c'est pour un jeu, la meilleure solution est de géré le KeyDown et le KeyUp.. comme ca, c'est facile de detecter que le joueur a relaché la touche et qu'il ne faut plus faire avancer le personnage

    The Monz, Toulouse

  8. #8
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 194
    Points
    5 194
    Par défaut
    Un code comme cela devrait te ravir

    Change la reference à l'image pour mettre ton image

    Voila... ca doit te faire une bonne base

    A rajouter dans le designer pour la form, l'event sur le OnKeyDown
    et sur le OnKeyUp

    Enjoy it

    The Monz, Toulouse

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
        public partial class Form1 : Form
        {
            private Image player;
            private Point p;
            private System.Timers.Timer time;
            private bool moveRight = false;
            private bool moveLeft = false;
            private bool moveDown = false;
            private bool moveUp = false;
            public Form1()
            {
                InitializeComponent();
                player = Image.FromFile(@"d:\Avatar_Nicolas_Chanteur.png");
                SetStyle(ControlStyles.AllPaintingInWmPaint, true);
                SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
                p = new Point(0, 0);
                time = new System.Timers.Timer();
                time.Interval = 10;
                time.Elapsed += new System.Timers.ElapsedEventHandler(time_Elapsed);
                time.Enabled = true;
                time.Start();
            }
     
            void time_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
            {
                if (moveRight)
                {
                    p.X += 5;                
                }
                if (moveLeft)
                {
                    p.X -= 5;
                }
                if (moveDown)
                {
                    p.Y += 5;
                }
                if (moveUp)
                {
                    p.Y -= 5;
                }
                Invalidate();
            }
     
            protected override void OnPaint(PaintEventArgs e)
            {
                base.OnPaint(e);
                Graphics g = e.Graphics;
                g.DrawImage(player, new Rectangle(p.X, p.Y, 40, 40), new Rectangle(0, 0, player.Width, player.Height), GraphicsUnit.Pixel);
     
            }
            private void Form1_Load(object sender, EventArgs e)
            {
     
            }
     
            private void Form1_KeyDown(object sender, KeyEventArgs e)
            {
                switch (e.KeyCode)
                {
                    case Keys.Right:
                        moveRight = true;
                        break;
                    case Keys.Left:
                        moveLeft = true;
                        break;
                    case Keys.Up:
                        moveUp = true;
                        break;
                    case Keys.Down:
                        moveDown = true;
                        break;
                }
            }
     
            private void Form1_KeyUp(object sender, KeyEventArgs e)
            {
                switch (e.KeyCode)
                {
                    case Keys.Right:
                        moveRight = false;
                        break;
                    case Keys.Left:
                        moveLeft = false;
                        break;
                    case Keys.Up:
                        moveUp = false;
                        break;
                    case Keys.Down:
                        moveDown = false;
                        break;
                }
            }
        }

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 194
    Points : 83
    Points
    83
    Par défaut
    merci, je vais tester tout ca

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 194
    Points : 83
    Points
    83
    Par défaut
    TheMonz, merci pour ton code, mais en l'éxécutant je n'arrive pas à faire bouger l'image?

    De plus, a quoi sert le timer?

  11. #11
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 194
    Points
    5 194
    Par défaut
    Pour faire bouger l'image, il faut appuyer sur les touches fleches et normalemet ca doit le faire bouger...

    Le timer est appelé toutes les 10 ms pour voir si un mouvement doit etre mise à jour...

    En clair, tu appuies sur une touche pour dire, je veux aller à droite... tu laisses appuyer la touche.. mais qui sait que tu l'as laissé appuyer ? et beh, personne..
    donc, quand tu appuies dessus, tu montes à true une variable disant que tu as pressée la touche.. et le timer regarde si tant que la touche est appuyé si il doit
    faire l'action associé... et quand tu relacheras la touche, le boolean passera à false, donc la routine d'affichage ne bougera plus rien...

    Si ca ne bouge pas, c'est soit que tu n'appuies pas sur la bonne touche, soit que le timer n'est pas lancé... car le Invalidate() qui se trouve dans la callback du timer fait la mise à jour

    Plutot qu'un timer, j'aurais pu aussi passer par une Property sur mon point, et à chaque fois que je le mets à jour, je fais un Invalidate() dans le set de ce point...

    genre :

    public Point myPoint
    {
    get {return myPoint;}
    set {myPoint = value; Invalidate();};

    tu vois le truc ? le concept ?

    The Monz, Toulouse

    }

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 194
    Points : 83
    Points
    83
    Par défaut
    ok merci pour tes explications pour le timer. Jvais essayer de voir pourquoi ça ne bouge pas en appuyant sur les fleches

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 194
    Points : 83
    Points
    83
    Par défaut
    j'ai l'impression que le programme n'a pas le temps de bouger l'image du fait que le timer effectue sa routine toutes les 10ms

    j'utilise le même code que toi, pourtant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Timers;
    using System.Windows.Forms;
     
    namespace testimage
    {
        public partial class Form1 : Form 
        { 
            private Image player; 
            private Point p; 
            private System.Timers.Timer time; 
            private bool moveRight = false; 
            private bool moveLeft = false; 
            private bool moveDown = false; 
            private bool moveUp = false; 
     
            public Form1() 
            { 
                InitializeComponent(); 
                player = Image.FromFile(@"d:\engabeck7.jpg"); 
                SetStyle(ControlStyles.AllPaintingInWmPaint, true); 
                SetStyle(ControlStyles.OptimizedDoubleBuffer, true); 
                p = new Point(0, 0); 
                time = new System.Timers.Timer(); 
                time.Interval = 10; 
                time.Elapsed += new System.Timers.ElapsedEventHandler(time_Elapsed); 
                time.Enabled = true; 
                time.Start(); 
            } 
     
            void time_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
            { 
                if (moveRight) 
                { 
                    p.X += 5; 
                } 
                if (moveLeft) 
                { 
                    p.X -= 5; 
                } 
                if (moveDown) 
                { 
                    p.Y += 5; 
                } 
                if (moveUp) 
                { 
                    p.Y -= 5; 
                } 
                Invalidate(); 
            } 
     
            protected override void OnPaint(PaintEventArgs e) 
            { 
                base.OnPaint(e); 
                Graphics g = e.Graphics; 
                g.DrawImage(player, new Rectangle(p.X, p.Y, 40, 40), new Rectangle(0, 0, player.Width, player.Height), GraphicsUnit.Pixel); 
            } 
     
            private void Form1_Load(object sender, EventArgs e) 
            { 
            } 
     
            private void Form1_KeyDown(object sender, KeyEventArgs e) 
            { 
                switch (e.KeyCode) 
                { 
                    case Keys.Right: moveRight = true; 
                        break; 
                    case Keys.Left: moveLeft = true; 
                        break; 
                    case Keys.Up: moveUp = true; 
                        break; 
                    case Keys.Down: moveDown = true; 
                        break; 
                } 
            } 
     
            private void Form1_KeyUp(object sender, KeyEventArgs e) 
            { 
                switch (e.KeyCode) { 
                    case Keys.Right: moveRight = false; 
                        break; 
     
                    case Keys.Left: moveLeft = false; 
                        break; 
     
                    case Keys.Up: moveUp = false; 
                        break; 
     
                    case Keys.Down: moveDown = false; 
                        break; 
                } 
            } 
        }
    }

  14. #14
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 194
    Points
    5 194
    Par défaut
    reduit la vitesse du timer..

    Sinon, ce que tu peux essayer, c'est de faire un truc du genre :

    Sur le KeyDown, tu rajoutes un Invalidate() pour voir si au moins ca bouge
    quand tu appuies sur le bouton

    A+ The Monz, Toulouse

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 194
    Points : 83
    Points
    83
    Par défaut
    j'ai mis des points d'arrets, et meme en appuyant sur les touches, le programme ne rentre pas dans les Form1_KeyDown et Form1_KeyUp

  16. #16
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Dans Visual Studio, sélectionne ton formulaire et met sa propriété KeyPreview (http://msdn2.microsoft.com/en-us/lib...eypreview.aspx) à True.
    Ainsi le programme entrera dasn les évènements que tu as cité

    A+

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 194
    Points : 83
    Points
    83
    Par défaut
    arf ça ne change rien, je dois etre maudit

    revoici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Timers;
    using System.Windows.Forms;
     
    namespace testimage
    {
        public partial class Form1 : Form 
        { 
            private Image player; 
            private Point p; 
            private System.Timers.Timer time; 
            private bool moveRight = false; 
            private bool moveLeft = false; 
            private bool moveDown = false; 
            private bool moveUp = false; 
     
            public Form1() 
            { 
     
                InitializeComponent();
                this.KeyPreview = true;
                player = Image.FromFile(@"d:\engabeck7.jpg"); 
                SetStyle(ControlStyles.AllPaintingInWmPaint, true); 
                SetStyle(ControlStyles.OptimizedDoubleBuffer, true); 
                p = new Point(0, 0); 
                time = new System.Timers.Timer(); 
                time.Interval = 10; 
                time.Elapsed += new System.Timers.ElapsedEventHandler(time_Elapsed); 
                time.Enabled = true; 
                time.Start(); 
            } 
     
            void time_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
            { 
                if (moveRight) 
                { 
                    p.X += 5; 
                } 
                if (moveLeft) 
                { 
                    p.X -= 5; 
                } 
                if (moveDown) 
                { 
                    p.Y += 5; 
                } 
                if (moveUp) 
                { 
                    p.Y -= 5; 
                } 
                Invalidate(); 
            } 
     
            protected override void OnPaint(PaintEventArgs e) 
            { 
                base.OnPaint(e); 
                Graphics g = e.Graphics; 
                g.DrawImage(player, new Rectangle(p.X, p.Y, 40, 40), new Rectangle(0, 0, player.Width, player.Height), GraphicsUnit.Pixel); 
            } 
     
            private void Form1_Load(object sender, EventArgs e) 
            { 
            } 
     
     
            private void Form1_KeyDown(object sender, KeyEventArgs e) 
            { 
                switch (e.KeyCode) 
                { 
                    case Keys.Right: moveRight = true; 
                        break; 
                    case Keys.Left: moveLeft = true; 
                        break;
                    case Keys.Up: moveUp = true; 
                        break; 
                    case Keys.Down: moveDown = true; 
                        break; 
                }
     
            }
     
     
     
            private void Form1_KeyUp(object sender, KeyEventArgs e) 
            { 
                switch (e.KeyCode) { 
                    case Keys.Right: moveRight = false; 
                        break; 
     
                    case Keys.Left: moveLeft = false; 
                        break; 
     
                    case Keys.Up: moveUp = false; 
                        break; 
     
                    case Keys.Down: moveDown = false; 
                        break; 
                }
            } 
        }
    }

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 194
    Points : 83
    Points
    83
    Par défaut
    quelqu'un peut m'aider? tester mon code?

  19. #19
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 194
    Points : 83
    Points
    83
    Par défaut
    ok sympa...

Discussions similaires

  1. Récupérer des évenements IO (entrées clavier, clic de souris)
    Par Vinestro dans le forum Bibliothèque standard
    Réponses: 5
    Dernier message: 21/04/2011, 08h59
  2. Réponses: 8
    Dernier message: 10/06/2010, 18h41
  3. [Win32] Récupérer un appui touche clavier
    Par elsargento dans le forum MFC
    Réponses: 19
    Dernier message: 06/05/2006, 11h05
  4. Réponses: 2
    Dernier message: 01/12/2005, 12h24
  5. Récupérer la touche du clavier pressée
    Par deubal dans le forum Débuter
    Réponses: 2
    Dernier message: 25/10/2005, 16h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo