Почему KeyPress умножается

Рейтинг: 0Ответов: 1Опубликовано: 20.04.2023
public partial class GameForm : Form
    {
        static Player player = (Player)Game.sbj[0, Game.player_id];
        public GameForm()
        {
            InitializeComponent();
            Map.Build();
            player = (Player)Game.sbj[0, Game.player_id];

        }

        public void Rndr()
        {
            label1.Location = new Point(player.x, player.y);
            label1.Text = Map.Render();
        }

        private void plr_tmr_Tick(object sender, EventArgs e)
        {
            this.KeyPress += player.Move;
        }

        private void rndr_tmr_Tick(object sender, EventArgs e)
        {
            Rndr();
        }
    }

В таймере plr_tmr отправляются нажатия клавиатуры в player.Move()

public void Move(Object? sender, KeyPressEventArgs? e)
        {
            //Collision
            Collision(1);

            /////////// Movement
            Console.WriteLine("клавиша нажата...");
            // Right
            if (e.KeyChar == 'd' && !right_col || e.KeyChar == '1')
            {
                x+=1;      
                Console.WriteLine("D-key!");
            }
            // Left

            if (e.KeyChar == 'a' && !left_col) 
            {
                --x;
                Console.WriteLine("a-key!");
            }

            // Down
            if (e.KeyChar == 's' && !down_col)
            {
                ++y;
                Console.WriteLine("S-key!");
            }
            
    
            //Up
            if (e.KeyChar == 'w' && !up_col)
            {
                --y;
                Console.WriteLine("W-key!");
            }   

И там почему-то нажатия удваиваются, вначале всё нормально, потом за нажатие начинает писать в консоль множество например "W-key!" за раз, потом больше и больше. Даже если очень быстро нажать не зажимая.

Ответы

▲ 1

Проблема в вашем методе, который создает новую подписку на событие:

private void plr_tmr_Tick(object sender, EventArgs e)
{
    this.KeyPress += player.Move;
}

Так как таймер у вас срабатывает через промежутки времени, то и подписываться вы будете постоянно.
Решение: перенести код из события таймера в другое место, где вы подпишитесь на событие 1 раз.