Что нового

Снижение отдачи (прерывание функции)

aizen43r

Новичок
Сообщения
4
Репутация
0
Приветствую всех! Не могу понять как остановить работу функции при отжатии ЛКМ. Отдачу гасит нормально при стрельбе очередью, но если сделать 1-2 выстрела, то функция выполняется полностью - продолжает рисовать траекторию движения прицела.
Пробовал 2 варианта:
Код:
#include <GUIConstantsEx.au3>
#include <MouseOnEvent.au3>
HotKeySet("{END}","Exitt")

Global $nronoff, $x, $y
_MouseSetOnEvent($MOUSE_PRIMARYDOWN_EVENT, "_MOUSE_PRIMARYDOWN_EVENT")
_MouseSetOnEvent($MOUSE_PRIMARYUP_EVENT, "_MOUSE_PRIMARYUP_EVENT")


While 1
    Sleep(50)
WEnd

Func _MOUSE_PRIMARYDOWN_EVENT()
   sleep(150)
   nrmove(-10, 15)
   sleep(140)
   nrmove(0, 13)
   sleep(140)
   nrmove(-17, 13)
   sleep(140)
   nrmove(-16, 9)
   sleep(140)
   nrmove(-10, 5)
   sleep(140)
EndFunc

Func _MOUSE_PRIMARYUP_EVENT()
;Остановка функции снижения отдачи
 EndFunc

Func nrmove($x, $y)
	_WinAPI_Mouse_Event(0x0001, $x, $y)
 EndFunc

Func Exitt()
    Exit
EndFunc


Код:
#Include <constants.au3>
#include <buttonconstants.au3>
#include <staticconstants.au3>
#include <statusbarconstants.au3>
#include <windowsconstants.au3>
#include <misc.au3>
#include <WinAPI.au3>
#include <Sound.au3>
#include <Array.au3>
#include <EditConstants.au3>
#include <MsgBoxConstants.au3>
#include <GDIPlus.au3>

;///Configurations///
;/ Here is where u change the shaking value
$shake = 10
;/ On/Off Hotkey
HotKeySet("{F1}", "nronoff")
HotKeySet("{END}","Exitt")
;////////////////////

Global $shake, $nronoff, $x, $y

while 1
   If $nronoff = "1" then
While _IsPressed(01)
   nrmove(-10, 15)
   sleep(140)
   nrmove(0, 13)
   sleep(140)
   nrmove(-17, 13)
   sleep(140)
   nrmove(-16, 9)
   sleep(140)
   nrmove(-10, 5)
   sleep(140)
WEnd
  EndIF
WEnd

Func nronoff ()
	Switch $nronoff
		Case "1"
			$nronoff = 0
		Case Else
			$nronoff = 1
	EndSwitch
EndFunc

Func nrmove($x, $y)
	_WinAPI_Mouse_Event(0x0001, $x, $y)
 EndFunc

 Func Exitt()
    Exit
EndFunc
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Код:
While _IsPressed(01)

Вот эта строка является триггером, запускающим цепочку команд. После того как триггер сработал, независимо от того что кнопка уже отжата, цепочка команд будет выполнена и только потом оно начнет ожидать повторного нажатия кнопки 01. Так что если хочется чтобы команды переставали выполняться при отжатии кнопки, надо перед каждой командой проверять зажата ли она.
 
Автор
A

aizen43r

Новичок
Сообщения
4
Репутация
0
Уже думал об этом... Перед каждым перемещением прицела проверять.
Но... Надо как-то упростить, т.к. 14 видов оружия и у каждого свой "рисунок" (если 30 патронов в обойме, то будет 30 координат). Код станет слишком громоздким.
Да и еще рисунок меняется в зависимости от того, сидит персонаж или стоит или двигается. Плюс что установлено на оружии, а это еще 5-7 вариантов "рисунка" для каждого оружия.
 

mr.Gbabak

Осваивающий
Сообщения
257
Репутация
23
Я в стрелялки не играю, но чем плоха такая конструкция:
Код:
#include <Misc.au3>

DllOpen("user32.dll")

While 1
	If _IsPressed("01") Then
		While _IsPressed("01")
			MouseMove($X, $Y, 0)
			Sleep(10)
		WEnd
	ElseIf _IsPressed("1B") Then
		ExitLoop
	EndIf
	Sleep(10)
WEnd

DllClose("user32.dll")
 
Автор
A

aizen43r

Новичок
Сообщения
4
Репутация
0
Будут еще условия - приседания во время стрельбы (нажат ли ctrl), движение в стороны или вперед (нажата W, S или D). Ну и т.д. Проще было бы прервать выполнение функции.
Если проще, то бежишь - увидел цель, зажимаешь ЛКМ, через 1-3 выстрела приседаешь, чтоб тебя меньше было видно или уходишь в сторону, продолжая поливать вражину огнем. В каждом случае координаты, например 5го выстрела, будут свои (3 варианта).
Если идти дальше - модификация которая установлена на оружии так же меняет координаты каждого выстрела.
 
Автор
A

aizen43r

Новичок
Сообщения
4
Репутация
0
Можно ли тут сделать так, чтобы перемещение курсора мыши было не мгновенным? К примеру, если надо рвзернутся на 180 градусов, то живому человеку на это потребуется полсекунды. А скрипт это делает мгновенно. Сильно "палится". Да и из-за этого возникает "тряска" экрана при корректировке траектории движения точки прицеливания во время стрельбы.
Код:
Func nrmove($x, $y)
    _WinAPI_Mouse_Event(0x0001, $x, $y)
 EndFunc
 
Верх