Как более плавно перемещать «спрайт» в C#

У меня есть Picturebox для перемещения с помощью клавиш (W, A, S, D), но он очень прерывистый, и вы можете нажимать только одну клавишу за раз. Есть ли другой способ более плавно перемещать «спрайт»?

Это мой код, который я пробовал:

    private void Form1_KeyPress(object sender, KeyPressEventArgs e)
    {
        int offset = 10;
        if (e.KeyChar == 'a')
        {
            pictureBox1.Location = new Point(pictureBox1.Location.X - offset, pictureBox1.Location.Y);
        }
        else if (e.KeyChar == 'w')
        {
            pictureBox1.Location = new Point(pictureBox1.Location.X, pictureBox1.Location.Y - offset);
        }
        else if (e.KeyChar == 's')
        {
            pictureBox1.Location = new Point(pictureBox1.Location.X, pictureBox1.Location.Y + offset);
        }
        else if (e.KeyChar == 'd')
        {
            pictureBox1.Location = new Point(pictureBox1.Location.X + offset, pictureBox1.Location.Y);
        }
    }

Я предполагаю, что это WinForms. Попытка изменить положение элементов управления пользовательского интерфейса приводит к перекомпоновке формы и очень медленно; вы никогда не получите хорошую производительность таким образом. Если вам абсолютно необходимо использовать WinForms, создайте один элемент управления Canvas и рисуйте внутри него.

Dour High Arch 26.06.2019 23:18

WinForms — это не игровой движок; это для создания бизнес-форм. Если вы создаете игру, вы, вероятно, захотите использовать какой-нибудь игровой движок, такой как Unity или аналогичный.

Eric Lippert 27.06.2019 00:19

а) Перемещение на 10 пикселей прерывистое. б) winforms не синхронизирует анимацию с монитором, поэтому она всегда будет неровной. c) рисуйте все сами, лучше всего на PictureBox или Label. Не рисуйте на панели! Рисование на форме с двойной буферизацией возможно, но не позволяет легко расширяться.

TaW 27.06.2019 09:19
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
108
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Возможно, вам лучше обновить местоположение внутри, а не присваивать ему новое значение, вызвав pictureBox1.Location.Translate(offset, offset);

См. https://docs.microsoft.com/en-us/dotnet/api/system.drawing.point.offset?view=netframework-4.8#System_Drawing_Point_Offset_System_Int32_System_Int32_

Чтобы расширить Babak и ответить на другую часть (нажимая только одну клавишу за раз), измените else if на серию операторов if. С else if последовательность прерывается, как только одно из них становится истинным, а это означает, что как только вы нажмете одну клавишу, другие не будут искаться.

KeyPressEventArgs.KeyChar может содержать только одно нажатие клавиши; он не хочет искать других.
Dour High Arch 27.06.2019 17:43

Другие вопросы по теме