Форум: "Начинающим";
Текущий архив: 2007.09.23;
Скачать: [xml.tar.bz2];
ВнизИнвертировать мышь по оси Y Найти похожие ветки
← →
HF-Trade © (2007-08-27 04:16) [0]Народ, подскажите как сделать сабжик? -
Мне нуна, чтоб при запуске определенного приложения инвертировалась мышь. Отловить запущенно оно(нужное мне приложение) или нет - не проблема. А вот как мышку по Y заставить ползать наоборот я хз=(
← →
Anatoly Podgoretsky © (2007-08-27 09:23) [1]> HF-Trade (27.08.2007 04:16:00) [0]
Верный путь довести пользователя до дурдома.
← →
Юрий Зотов © (2007-08-27 11:03) [2]> HF-Trade © (27.08.07 04:16)
> подскажите как сделать сабжик?
Если скажете, для чего такой сабжик нужен, то можно и подсказать.
← →
wp2 © (2007-08-27 11:28) [3]если тупо: надо узнать координаты миши, и переместить мышь в нужную позицию специальными функциями (такого добра в инете полно)
← →
HF-Trade © (2007-08-27 17:35) [4]Нет, тупо двинуть мышу эт не нуна.
> Юрий Зотов ©
Играю в игрушку одну - там нет инвертации мыши. А я уж 100 лет как тока на инвертированной... - привык с ней...
← →
TUser © (2007-08-27 17:43) [5]Хм, может Панель управления - Мышь - Для левшей?
:)
← →
wp2 © (2007-08-27 18:00) [6]>Играю в игрушку одну - там нет инвертации мыши. А я уж 100 лет как тока на инвертированной... - привык с ней...
Descent?
← →
Юрий Зотов © (2007-08-27 18:14) [7]> HF-Trade © (27.08.07 17:35) [4]
Инвертированные кнопки - это понятно. Для левшей.
А инвертация движения - я, вроде как, тоже не первый месяц мышку гоняю, но о таком даже и не слышал ни разу.
Что-то тут не то...
:о)
← →
Anatoly Podgoretsky © (2007-08-27 18:25) [8]> Юрий Зотов (27.08.2007 18:14:07) [7]
Тем более по оси Х, двигаешь мышку вверх, а она вниз ползет, так и свихнуться можно.
← →
Bora.ru (2007-08-27 18:27) [9]Шаг вперед -> два шага назад
и наоборот
← →
Daedr (2007-08-27 18:34) [10]
> Тем более по оси Х, двигаешь мышку вверх, а она вниз ползет,
> так и свихнуться можно.
сразу видно не геймер), вопрос хороший, часто сталкивался с подобной проблемой, если кто знает подскажите)
← →
@!!ex © (2007-08-27 19:57) [11]> [7] Юрий Зотов © (27.08.07 18:14)
не. нормуль. бывают игры с инвертированной мышой.
Например симуляторы какие нить.
Вот куда должен наклоняться нос самолета при движении мыши вперед?
По правилам - вниз, по стандартным привычкам - вверх.
Пот поэтому и делают инвертирование, чтобы геймер мог выбрать.
Лично я никогда не заморачивался, ибо перестройка мозга под инвертированное управление происходит минут за 10, прогу дольше писать.
← →
DeadMeat © (2007-08-27 20:21) [12]Всю жизнь пользуюсь во всех 3D приложениях, где не видно курсора инвертированной мышкой. И очень страдаю, когда онной "фичи" нету. И перестраиваться с одного "недоделанного" приложения на другое "нормальное" не очень то и легко. Среди пользователей (ИМХО) много "инвертеров". Это как бы и не редкость.
← →
HF-Trade © (2007-08-27 22:14) [13]Дык кто нить подскажет по существу то?
Игра - Хроники Тарр - космосимулятор. - Всегда играл в такие - X-Tension(The Threat,X3-Reunion и т.п.), а наши сделали и чета намудрили.
Диск есессно скачал с инета, поставил Демантулсой, все норм - инверта нема(( Вроде как и патчи они уже стяпают, тока народ пишет что после патчей ваще играть никак низя. Да и после патчей уже старфорс обламывает - грит диск не тот))
Вообщем вот так.
> Anatoly Podgoretsky © (27.08.07 18:25) [8]
> > Юрий Зотов (27.08.2007 18:14:07) [7]
>
> Тем более по оси Х, двигаешь мышку вверх, а она вниз ползет,
> так и свихнуться можно.
Во первых по Y надо, а не по X. А во вторых если надо поизуверствовать мона намного проще написать - кнопочки чтоб там менялись местами и т.п. Нафига такй гемор с инвертом в данном случае ума не приложу...
> TUser
Дык енто кнопочки=)) А тут именно иверт движения)
← →
@!!ex © (2007-08-27 22:22) [14]Самый просто способ - включить VSync, чтобы точно знать максимальное FPS, которое выдает игра(Оно при включенном VSync равно частоте моника), и напистаь прогу, которая с частотой в два раза превышающей максимальный фпс будет тестить положение мыши, и если она сместилась - инвертировать движение.
← →
@!!ex © (2007-08-27 23:44) [15]На. Только при запуске нужно указывать как часто проверять позицию мыши. у меня при 10мс, вообще все очень плавно.
Запускаешь прогу, нажимаешь Alt+F11 - активируется инверсия, Alt+F12 - выключает, Alt+F9 закрывает прогу.program InvertMouse;
oyWindow(WND);
uses
Windows,
Messages,
SysUtils;
var
WND:HWND;
Atom_Start,Atom_Stop, Atom_Close:Word;
Working:boolean = false;
Finished:boolean = false;
Sleep_Time:integer;
DelayTime, LastTime:integer;
msg : TMsg;
MousePos:TPoint;
NewMousePos:TPoint;
function WndProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
case (Msg) of
WM_CLOSE:
begin
PostQuitMessage(0);
end;
WM_HOTKEY: begin
Result := 0;
if wParam = Atom_Start then begin
Working:=true;
GetCursorPos(MousePos);
end
else
if wParam = Atom_Stop then
Working:=false
else
if wParam = Atom_Close then
Finished:=true;
end;
else
Result := DefWindowProc(hWnd, Msg, wParam, lParam); // Default result if nothing happens
end;
end;
Function CreateHotKeyWnd:HWND;
var
h_Instance : HINST;
wndClass : TWndClass;
begin
h_Instance := GetModuleHandle(nil);
ZeroMemory(@wndClass, SizeOf(wndClass));
with wndClass do
begin
style := CS_OWNDC ;
lpfnWndProc := @WndProc; // Set the window procedure to our func WndProc
hInstance := h_Instance;
hCursor := LoadCursor(0, IDC_ARROW);
lpszClassName := "InvertMouseWindowClass";
end;
Windows.RegisterClass(wndClass);
Result:=CreateWindow("InvertMouseWindowClass","Invert Mouse",WS_BORDER,0,0,0,0,0,0,h_Instance,0);
end;
begin
Sleep_Time:=StrToInt(ParamStr(1));
WND:=CreateHotKeyWnd;
Atom_Start:=GlobalAddAtom("Hot Key Start Inverting");
Atom_Stop:=GlobalAddAtom("Hot Key Stop Inverting");
Atom_Close:=GlobalAddAtom("Hot Key Close Program");
RegisterHotKey(WND,Atom_Start,MOD_ALT,VK_F11);
RegisterHotKey(WND,Atom_Stop,MOD_ALT,VK_F12);
RegisterHotKey(WND,Atom_Close,MOD_ALT,VK_F9);
LastTime:=GetTickCount;
while not finished do
begin
if (PeekMessage(msg, 0, 0, 0, PM_REMOVE)) then begin
if (msg.message = WM_QUIT) then
finished := True
else begin
TranslateMessage(msg);
DispatchMessage(msg);
end;
end;
DelayTime:=GetTickCount()-LastTime;
LastTime:=GetTickCount();
if Delaytime<Sleep_Time then
Sleep(Sleep_time-Delaytime);
if Working then begin
GetCursorPos(NewMousePos);
NewMousePos.Y:=MousePos.Y-(NewMousePos.Y-MousePos.Y);
SetCursorPos(NewMousePos.X,NewMousePos.Y);
MousePos:=NewMousePos;
end;
end;
GlobalDeleteAtom(Atom_Start);
GlobalDeleteAtom(Atom_Stop);
GlobalDeleteAtom(Atom_Close);
Destr
end.
← →
@!!ex © (2007-08-27 23:50) [16]Проблемы будут, если игра фиксирует где нить курсор мыши, в экшенах это делаеться всегда.
Соответственно надо модифицировать прогу, чтобы она учитывала, что позиция куда игра кидает курсор - стартовая и двигать никуда не надо.
Минут через 40 может кину проги, учитывающей это.
← →
HF-Trade © (2007-08-28 00:28) [17]Спасиб. Вроде работает=)
← →
@!!ex © (2007-08-28 00:37) [18]После запуска игры, когда мышь зафиксируеться, не двигая мышь, нужно нажать Alt+F10.
после чего все тоже самое. Alt+F11, Alt+F12.
Не тестировал на прогах с фиксацией мыши, тольк на играх, где фиксации нет.
Все ок. ТОлько не рекоменду подводить мышу к верхней или нижней грание экрана, ибо тогда будет крайне неприятный глюк, саязынный с отличием положения реального, от тго. куда мы перемещаем мышу.
решения нормального пока не нашел, правда и не искал особо.program InvertMouse;
uses
Windows,
Messages,
SysUtils;
var
WND:HWND;
Atom_Start,Atom_Stop,Atom_Fix, Atom_Close:Word;
Working:boolean = false;
Finished:boolean = false;
Sleep_Time:integer;
DelayTime, LastTime:integer;
msg : TMsg;
MousePos:TPoint;
NewMousePos:TPoint;
Fixed:boolean;
FixedPos:TPoint;
function WndProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
case (Msg) of
WM_CLOSE:
begin
PostQuitMessage(0);
end;
WM_HOTKEY: begin
Result := 0;
if wParam = Atom_Start then begin
Working:=true;
GetCursorPos(MousePos);
end
else
if wParam = Atom_Stop then
Working:=false
else
if wParam = Atom_Close then
Finished:=true
else
if wParam = Atom_Fix then begin
Fixed:=true;
GetCursorPos(FixedPos);
end;
end;
else
Result := DefWindowProc(hWnd, Msg, wParam, lParam);
end;
end;
Function CreateHotKeyWnd:HWND;
var
h_Instance : HINST;
wndClass : TWndClass;
begin
h_Instance := GetModuleHandle(nil);
ZeroMemory(@wndClass, SizeOf(wndClass));
with wndClass do
begin
style := CS_OWNDC ;
lpfnWndProc := @WndProc; // Set the window procedure to our func WndProc
hInstance := h_Instance;
hCursor := LoadCursor(0, IDC_ARROW);
lpszClassName := "InvertMouseWindowClass";
end;
Windows.RegisterClass(wndClass);
Result:=CreateWindow("InvertMouseWindowClass","Invert Mouse",WS_BORDER,0,0,0,0,0,0,h_Instance,nil);
end;
begin
Sleep_Time:=StrToInt(ParamStr(1));
WND:=CreateHotKeyWnd;
Atom_Start:=GlobalAddAtom("Hot Key Start Inverting");
Atom_Stop:=GlobalAddAtom("Hot Key Stop Inverting");
Atom_Close:=GlobalAddAtom("Hot Key Close Program");
Atom_Fix:=GlobalAddAtom("Hot Key Fix Mouse Position");
RegisterHotKey(WND,Atom_Start,MOD_ALT,VK_F11);
RegisterHotKey(WND,Atom_Stop,MOD_ALT,VK_F12);
RegisterHotKey(WND,Atom_Close,MOD_ALT,VK_F9);
RegisterHotKey(WND,Atom_Fix,MOD_ALT,VK_F10);
LastTime:=GetTickCount;
while not finished do
begin
if (PeekMessage(msg, 0, 0, 0, PM_REMOVE)) then begin
if (msg.message = WM_QUIT) then
finished := True
else begin
TranslateMessage(msg);
DispatchMessage(msg);
end;
end;
DelayTime:=GetTickCount()-LastTime;
LastTime:=GetTickCount();
if Delaytime<Sleep_Time then
Sleep(Sleep_time-Delaytime);
if Working then begin
GetCursorPos(NewMousePos);
if not Fixed or (NewMousePos.Y<>FixedPos.Y) then begin
NewMousePos.Y:=MousePos.Y-(NewMousePos.Y-MousePos.Y);
SetCursorPos(NewMousePos.X,NewMousePos.Y);
end;
MousePos:=NewMousePos;
end;
end;
GlobalDeleteAtom(Atom_Start);
GlobalDeleteAtom(Atom_Stop);
GlobalDeleteAtom(Atom_Close);
GlobalDeleteAtom(Atom_Fix);
DestroyWindow(WND);
end.
← →
GrayFace © (2007-08-28 19:06) [19]ИМХО, хуки для этого больше бы подошли.
← →
HF-Trade © (2007-08-29 16:24) [20]Да. Хук был бы предпочтительней.
← →
@!!ex © (2007-08-29 17:36) [21]> [19] GrayFace © (28.08.07 19:06)
> [20] HF-Trade © (29.08.07 16:24)
На что хук ставитЬ? :)
← →
HF-Trade © (2007-08-30 23:21) [22]
> @!!ex © (29.08.07 17:36) [21]
На мышЬ=)
> ТОлько не рекоменду подводить мышу к верхней или нижней
> грание экрана, ибо тогда будет крайне неприятный глюк, саязынный
> с отличием положения реального, от тго. куда мы перемещаем
> мышу.
> решения нормального пока не нашел, правда и не искал особо.
>
Может узнать разрешение и если курсор меньше или равен 0 или больше или равен разрешению по Y - откидывать его на 1 пиксель?
← →
@!!ex © (2007-08-31 01:00) [23]> На мышЬ=)
Хуки ставятся на события.
Как геймдевелопер завляю - игры обрабатывают очень мало событиый. И события мыши туда не входят.
> Может узнать разрешение и если курсор меньше или равен 0
> или больше или равен разрешению по Y - откидывать его на
> 1 пиксель?
Пробуй, уод у тебя есть, мне лично влом. :)
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.09.23;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.041 c