<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; AHK: Использование движений мышью для выбора оружия]]></title>
	<link rel="self" href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=13467&amp;type=atom" />
	<updated>2018-02-14T16:32:13Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.script-coding.com/viewtopic.php?id=13467</id>
		<entry>
			<title type="html"><![CDATA[AHK: Использование движений мышью для выбора оружия]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=123715#p123715" />
			<content type="html"><![CDATA[<p>Хочу поделиться скриптом которым пользуюсь в играх для быстрого выбора оружия. Он позволяет использовать сочетание горячей клавиши и движение мышью (влево-вправо,вверх-вниз). Так же данный скрипт блокирует движение камеры во время выбора. В коде я создаю таймер 1 мс, для этого используется драйвер в папке&nbsp; WaitableTimer, его необходимо разблокировать.<br /></p><div class="codebox"><pre><code>
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;      Использование мыши для выбора оружия       ;;;
;;;              Claus555, 14/02/2018г.              ;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Данный скрипт позволяет применять движения мыши (влево-вправо,вверх-вниз)
;в сочетании с горячей клавишей для подтверждения выбора.
;Если взять стандартную мышь, то на ней присутствует 4 и 5 кнопки мыши
;-это два возможных действия. Но если к нажатой кнопке добавить движение мышью,
;получится 2х4=8 действий(где 4-четыре направления мыши).
;Вместо 2 получаем 8 клавиш!

#SingleInstance force
#Persistent

;меняем раскладку на английскую  
ControlGetFocus, CtrlFocus, % &quot;ahk_id&quot; WinExist(&quot;A&quot;)
PostMessage, 0x50, 0, 0x4090409, %CtrlFocus% ;английский
setkeydelay -1 ; нет пауз между нажатиями


BasicData:=[&quot;XButton1&quot;,&quot;XButton2&quot;]

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;             Создание основного таймера           ;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#include CLR.ahk
asm:=CLR_LoadLibrary(&quot;WaitableTimer\WaitableTimer.dll&quot;)
wt:=asm.CreateInstance(&quot;WaitableTimer&quot;)
MyTimer := wt.Create(Func(&quot;Entry&quot;), 1)
MyTimer.Start()

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;                     MouseDelta                   ;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SMX:=OldSMX:=SMY:=OldSMY:=DSX:=DSY:=0
#include MouseDelta.ahk
md:=new MouseDelta(&quot;MouseEvent&quot;).Start()
md.SetState(0)
SetTimer, SpeedMouse, 100

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;                    Основной цикл                 ;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
S1:
Loop % BasicData.MaxIndex() ;просмотр всех элементов массива
{
variable:=BasicData[A_Index]
if variable in XButton1,XButton2
PS:=&quot;P&quot; ;определяем физическое состояние
else
PS:=&quot;&quot; ;логическое
%variable%:=GetKeyState(BasicData[A_Index],PS)
}

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;                    Выбор оружия                  ;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
if (XButton1 and !MB4)
md.SetState(1),MB4:=1
if (!XButton1 and MB4)
md.SetState(0),MB4:=0,MV4:=0

R1:=(MV4=1)?1:0,ST1:=T(D(&quot;R1&quot;),&quot;ST1&quot;,100),PRESS40(ST1,&quot;vk31&quot;)
R2:=(MV4=2)?1:0,ST2:=T(D(&quot;R2&quot;),&quot;ST2&quot;,100),PRESS40(ST2,&quot;vk32&quot;)
R3:=(MV4=3)?1:0,ST3:=T(D(&quot;R3&quot;),&quot;ST3&quot;,100),PRESS40(ST3,&quot;vk33&quot;)
R4:=(MV4=4)?1:0,ST4:=T(D(&quot;R4&quot;),&quot;ST4&quot;,100),PRESS40(ST4,&quot;vk34&quot;)

if (XButton2 and !MB5)
md.SetState(1),MB5:=1
if (!XButton2 and MB5)
md.SetState(0),MB5:=0,MV5:=0

R5:=(MV5=5)?1:0,ST5:=T(D(&quot;R5&quot;),&quot;ST5&quot;,100),PRESS40(ST5,&quot;vk35&quot;)
R6:=(MV5=6)?1:0,ST6:=T(D(&quot;R6&quot;),&quot;ST6&quot;,100),PRESS40(ST6,&quot;vk36&quot;)
R7:=(MV5=7)?1:0,ST7:=T(D(&quot;R7&quot;),&quot;ST7&quot;,100),PRESS40(ST7,&quot;vk37&quot;)
R8:=(MV5=8)?1:0,ST8:=T(D(&quot;R8&quot;),&quot;ST8&quot;,100),PRESS40(ST8,&quot;vk38&quot;)

Return


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;         &quot;Невидимые&quot;(экранированные) клавиши      ;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
*XButton1::Return 
*XButton2::Return 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;            Завершение работы скрипта             ;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
End::ExitApp 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;                     Таймер-вход                  ;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Entry(){ 
Gosub, S1 
}

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;    Физическое нажатие(клавиатура-40мс повтор)    ;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PRESS40(X,Y,Z=&quot;P&quot;)
{
	global 
	if (X and !%Z%1%Y%)
	{
	send {Blind}{%Y% Down}
	%Z%1%Y%:=1,%Z%2%Y%:=A_TickCount
	}
	
	if (X and A_TickCount-%Z%2%Y%&gt;=40)
	{ 
	send {Blind}{%Y% Down}
	%Z%2%Y%:=A_TickCount
	}
	
	if (!X and %Z%1%Y%)
	{
	send {Blind}{%Y% Up}
	%Z%1%Y%:=0
	}
}

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;                    Срабатывание                  ;;;;                                                                                                                                                                                                                                      ;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
D(X)
{
local Z
Z:=(%X%!=d%X% and %X%)?1:0,d%X%:=%X%
Return Z
}

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;                       Таймер                     ;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
T(X,Y,V)
{
global 
if (X and !T1%Y%)
T1%Y%:=1,T2%Y%:=A_TickCount

if (T2%Y%=&quot;&quot; or A_TickCount-T2%Y%&gt;=V)
T1%Y%:=0

Return T1%Y%
}

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;               Мышь-блокировка камеры             ;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MouseEvent(MouseID, x := 0, y := 0){
global
	if (MouseID)
	{
	SMX+=x,SMY+=y
	DllCall(&quot;mouse_event&quot;,uint,1,int,-x,int,-y,uint,0,int,0)	
	}
}

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;                Мышь-режим джойстика              ;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SpeedMouse:
DSX:=SMX-OldSMX,OldSMX:=SMX,DSY:=SMY-OldSMY,OldSMY:=SMY

if (MB4 and abs(DSX)&gt;abs(DSY))
{
	if (DSX&gt;1 and !MV4) ;смещение вправо
	MV4:=3
	if (DSX&lt;-1 and !MV4) ;смещение влево
	MV4:=1
}
else if MB4
{
	if (DSY&gt;1 and !MV4) ;смещение вниз
	MV4:=4
	if (DSY&lt;-1 and !MV4) ;смещение вверх
	MV4:=2
}

if (MB5 and abs(DSX)&gt;abs(DSY))
{
	if (DSX&gt;1 and !MV5) ;смещение вправо
	MV5:=7
	if (DSX&lt;-1 and !MV5) ;смещение влево
	MV5:=5
}
else if MB5
{
	if (DSY&gt;1 and !MV5) ;смещение вниз
	MV5:=8
	if (DSY&lt;-1 and !MV5) ;смещение вверх
	MV5:=6
}
Return
</code></pre></div>]]></content>
			<author>
				<name><![CDATA[sabir.yanin2014]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=33790</uri>
			</author>
			<updated>2018-02-14T16:32:13Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=123715#p123715</id>
		</entry>
</feed>
