Перемещение объекта с помощью мыши? - PullRequest
0 голосов
/ 31 октября 2018

Я сейчас пытаюсь переместить 2D текстуру в SharpDX. Я могу успешно переместить его, но он скачет немного каждые несколько кадров. Например, если я перетаскиваю снизу, справа вверх, влево, я получаю случайный прыжок, когда источник изображения находится на 75% внизу справа, а затем возвращается туда, где он был несколькими кадрами позже. На мой взгляд, это довольно странно, и я думаю, что это возможно из-за события или положения мыши.

Я обновляю позицию текстуры с помощью события MouseMove в моей форме:

private void MouseMove(object sender, MouseEventArgs e) {
    if (e.Button == MouseButtons.Left) {
        testSprite.Position = new Vector2(e.X - testSprite.Position.X,
                                          e.Y - testSprite.Position.Y);
    }
}

Я думаю, что это в основном связано с тем, как я устанавливаю значения X и Y. Правильно ли я здесь делаю математику или это является причиной моей проблемы? Я решил написать это так, потому что я не хочу, чтобы источник текстуры (0, 0: верхний, левый) переместился в положение мыши, а вместо этого плавно перемещался мышью из ее текущего положения.


Ясность

  • Правильна ли моя математика для назначения X и Y?
    • Да: Что еще может вызвать этот прыжок ?
    • Нет: что такое правильная математика?

При отладке и пробовании разных подходов я узнал, что:

  • Установка Position на e.X,Y обеспечивает плавное движение.
    • Однако это переходит в положение мыши, которое не является желательным.

1 Ответ

0 голосов
/ 31 октября 2018

Этапы процесса перетаскивания:

Начать с MouseDown:
- проверить, не коснулся ли объект
- помните ObjectPos0, MousePos0
- установить флаг isDragging (означает, что MouseDown находится на объекте)

При перемещении мыши (если isDragging):
- ObjectPos = ObjectPos0 + (MousePos - MousePos0)
- перерисовать

On MouseUp (если isDragging):
- исправить окончательное положение
- сделать необходимую работу
- очистить isDragging флаг

...