LINUX.ORG.RU

Как сделать мышь в режиме джойстика?

 , ,


0

1

Имеется ввиду чтобы вместо координатных событий приходили «сдвинулось на столько-то пикселей вверх/вниз/вправо/влево» на неограниченное расстояние. В некоторых 3д-играх например такое используют для поворота камеры.

Предполагаю что это можно сделать костылём: прога постоянно переставляет мышиный курсор в центр окна (+ ещё надо как-то сделать чтобы укзаатель не мог убежать из окна, но думаю такое тоже есть), и тогда можно в самом деле двигать мышкой в одну сторону сколько угодно. Но может быть есть нативный способ проще?

★★★★★

В играх сделано немного по другому, чем дальше мышь от центра экрана, тем больше отклоняется виртуальный джойстик. Если игра запущена в окне, то поведение отличается или игра не даёт приблизить мышь к границе окна постоянно перемещая курсор назад на несколько пикселей или позволяет курсору выйти за границу окна. Оба подхода так себе, так как мешают в разных ситуациях. С последним подходом боролся средствами wm перемещая мышь обратно, по сути эмулируя первый подход.

einhander ★★★★★
()
Последнее исправление: einhander (всего исправлений: 1)
Ответ на: комментарий от einhander

В каких-то и как ты описал, да, но по-моему обычно именно камера двигается (по кругу) когда двигаешь мышь вправо-влево.

Оба подхода так себе, так как мешают в разных ситуациях.

Не, речь не про то как удержать, а про то чтобы получать вместо координат их приращение, без костыльного перемещения мыши назад.

firkax ★★★★★
() автор топика

Что-то типа такого тебе нужно: https://www.kernel.org/doc/html/v5.0/input/event-codes.html#ev-rel

Скорее всего, какая-то высокоуровневая абстракция будет удобнее, например:

или посмотреть, как там это реализовано.

static_lab ★★★★★
()
Последнее исправление: static_lab (всего исправлений: 1)

Позиция мышки может быть абсолютная и относительная. Во втором случае так и делают, курсор всегда в центре экрана, а игра получает лишь отклонения в ту или иную сторону величина этого отклонения задаёт например ускорение/отклонение джойтика.

Это всё можно легко имитировать, даже без центрирования

  • получаешь текущие координаты и ничего не делаешь просто сохраняя их
  • A получаешь следующие и вычисляешь разницу, выдаешь разницу (сохраняешь координаты для вычисления разница в следующем получении координат)
  • goto A

Первое смещение координат будет пропущено соотвецтвено, ибо ты работаешь с их разницей и тебе в целом плевать какие у тебя там координаты.

Разницу уже обрабатывай как хочешь, усредняй, вычисляй ускорение, обрезай и тому подобное. Вариантов тьма =)

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 3)
Ответ на: комментарий от static_lab

Первое это ядерный интерфейс, гуи софту в него напрямую не стоит лезть, только через графический сервер.

Второе я так понимаю просто обёртка над обычным mouse-move событием, только досчитывает к нему относительный сдвиг.

firkax ★★★★★
() автор топика
Ответ на: комментарий от LINUX-ORG-RU

Это всё можно легко имитировать, даже без центрирования

Без центрирования мышка упрётся в границу экрана и дальше координаты меняться перестанут. А её раньше она выйдет за пределы окна и координаты перестанут присылаться.

Ну, про центрирование я в стартовом сообщении и так догадался, но оно мне показалось костыльным. Видимо только такой способ и есть в итоге.

firkax ★★★★★
() автор топика
Ответ на: комментарий от firkax

Второе я так понимаю просто обёртка над обычным mouse-move событием, только досчитывает к нему относительный сдвиг.

Вот в исходниках я такого не увидел. Как будто бы этот relative уже прилетает из XInput2.

static_lab ★★★★★
()