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
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
bonjour,
Intercepte l'événemt keypress.
Bon boulot
Jean
oui j'avais compris mais c'est justement ce que je ne sais pas comment faire
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.
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
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?
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
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; } } }
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?
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
}
ok merci pour tes explications pour le timer. Jvais essayer de voir pourquoi ça ne bouge pas en appuyant sur les fleches
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; } } } }
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
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
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+
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; } } } }
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager