Removing the delay after KeyDown event?

前端 未结 3 854
野的像风
野的像风 2020-11-29 13:32

When I hold a key in my game to move my player:

public void MainForm_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Up)
    {
        Pla         


        
3条回答
  •  渐次进展
    2020-11-29 14:07

    A subjectivly elegent approach:

    public partial class Form1 : Form
    {
        private static Timer timer;
        private static bool[] keys_down;
        private static Keys[] key_props;
    
        private void Form1_Load(object sender, EventArgs e)
        {
            keys_down = new bool[4];
            key_props = new []{Keys.A, Keys.D, Keys.W, Keys.S};
            timer = new Timer();
            timer.Interval = 15; // Roughly 67 FPS
            timer.Tick += tick;
            timer.Start();
            KeyDown += key_down_event;
            KeyUp += key_up_event;
            ... // More things to do when the form loads.
        }
    
        private void tick(Object source, EventArgs e)
        {
            ... // Do this every timing interval.
            byte n = 0;
            foreach (var v in keys_down)
            {
                if (n == 3 && v)
                    ... // If the "s" key is being held down, no key delay issues. :)
                n++;
            }
            ...
        }
    
        private void key_down_event(object sender, KeyEventArgs e)
        {
            byte n = 0;
            foreach (var v in keys_down)
            {
                if (e.KeyCode == key_props[n])
                    keys_down[n] = true;
                n++;
            }
        }
    
        private void key_up_event(object sender, KeyEventArgs e)
        {
            byte n = 0;
            foreach (var v in keys_down)
            {
                if (e.KeyCode == key_props[n])
                    keys_down[n] = false;
                n++;
            }
        }
    
        public Form1()
        {
            InitializeComponent();
        }
    }
    

提交回复
热议问题