罗技游戏软件 LUA脚本编程 从入门到放弃 篇四:鼠标定位与移动
距上一篇已经快一个月啦,原因有三~
一个是忙,宝宝更大了,已经习得连续滚翻天赋,没办法放床上或车上忽悠一会儿抽点时间出来了。
一个是懒,这个没药医。
还有一个,就是LGS的鼠标坐标相关函数的参数系统,乱得一逼。特别是在双屏的情况下,基本每个函数的参数用法都不一样
我花了点时间整理了一下几个函数的参数规律,适用于多显示器的朋友参考。
如果你跟我一样使用多显示器,使用鼠标移动、定位的相关函数之前,请务必看完,否则会一头雾水。
如果你只有单显示器……呃,差不多可以直接看下一期了。
GetMousePosition
首先我们来看仅有的、获取鼠标坐标的方式,GetMousePosition。
之所以要用这个函数,因为LGS里并非以屏幕像素坐标来作为参数,而是以0至65535为区间两头。
也就是说,假设你的鼠标在屏幕右下角,以传统的像素坐标系,它应该是x=1920,y=1080。但是在LSG的坐标系里,它就是x=65535,y=65535。
并且,LGS的直接移动函数都是用的此等计算方法,所以如果你的取点和定位都用LGS来完成的话,或许还是离不开这个函数的。
或者,咱们可以用其他软件取得像素坐标,然后通过数学换算的方式算得LGS的这个坐标系,也是可以的。
经过实战,GetMousePosition这个函数以主显示器左上角为原点(0,0),所以如果你的副显示器在主显左边,则X轴就会变成负数。如果在右边,则X轴会大于65535,以此类推。
MoveMouseTo
这个函数非常坑爹,它只能在主显示器范围内移动。
我的主显示器是靠右的宽屏,无法移动到靠左的带鱼。
因为,传负数进去函数会直接报错,而官方文档也写了,如果接入了多个显示器请用其他函数代替。
所以,如果你只有单显示器,用GetMousePosition和MoveMouseTo函数即可。
但是如果你接了多显,那就**了……请往下看。
MoveMouseToVirtual
根据官方文档,这是唯一一个能在多显示器状态下,移动鼠标到任意位置的函数。
但是经过实测,这个函数的参数规则,是以全桌面的最左上角为(0,0),说白了,和GetMousePosition函数是不一样的。
也就是说,你用GetMousePosition函数辛辛苦苦抓取的坐标,在这个函数里是不能用的,必须要经过计算变换…………
能干出这种事情来,LGS的工程师也算是人才了。估计这俩函数不是同一个人写的,又没有一个统筹的产品经理,于是这几个奇葩的函数就这么诞生了。
MoveMouseRelative
那么,LGS非常“慈悲”的提供了另一个函数,以当前鼠标坐标为原点,进行“相对移动”的函数。
但是奇葩的是,这个函数的坐标参数,使用的是像素,也就是屏幕像素,而非前面几个函数的65535系统。
那么毫无疑问了,这三个函数肯定是三个不同的程序员写的,而且他们没有一个产品经理……
而更更更更奇葩的是,这个函数的参数最多只能接受-127到128,也即一个字节的0xFF。
如果你传入了大于128的数字,则会溢出,129相当于-127,256相当于0,虽然不会报错,但是绝对得不到想要的结果。
因为LUA都是要宿主导出函数的,如果宿主参数定义的时候,就只有一个字节,那也就会变成这样了。
--------------------------------------------------------------------------------------------------
说了那么多,如果非要总结一下的话:
假如你是独显,或者多显但脚本只用在主显示器上,则问题不大,使用GetMousePosition函数获取坐标之后,使用MoveMouseTo移动即可。
如果你的脚本有用在多显器的非主显示器上,则必须先使用GetMousePosition获得一套坐标,经过算术变换,算得另一套坐标,再使用到MoveMouseToVirtual函数里。
本期就先用MoveMouseRelative来做一下守望屁股的一键转身,下期再整理一份多屏情况下通用的变换函数和应用脚本。
由于MoveMouseRelative函数一次最多只能移动128个像素,为了方便调试,结合实测之后,大概是每次10个像素,182次移动可以转大概180度……这个参数根据每个人的分辨率、游戏、鼠标状况等都有可能不一样,只能自行实测了。
代码和罗技的参考文档都放到度盘里了,车牌号1bp3oOP5。
下一期:坐标变换与一键换装
福利大狗
校验提示文案
你好过分
校验提示文案
Kivil
校验提示文案
jkchang
校验提示文案
值友1306464783
校验提示文案
值友1488928760
校验提示文案
英雄sa
校验提示文案
值友3371264844
校验提示文案
闷骚小宅男
校验提示文案
wumaster
校验提示文案
waltlc
校验提示文案
jkchang
if IsMouseButtonPressed(4) then
for i=1,2 do
MoveMouseRelative(0,1)
end
end
end
校验提示文案
值友7625054793
校验提示文案
树梢上猴子
校验提示文案
Jason_王
校验提示文案
光刃小屋
校验提示文案
Oo麦粒oO
校验提示文案
值友4660753647
校验提示文案
騎馬過河
校验提示文案
值友3505398160
校验提示文案
值友9361601732
校验提示文案
七年的雨
校验提示文案
七年的雨
校验提示文案
大侠一只耳
校验提示文案
英雄sa
校验提示文案
值友1488928760
校验提示文案
Creeper233
校验提示文案
值友5359460152
校验提示文案
值友1306464783
校验提示文案
值友3371264844
校验提示文案
值友3505398160
校验提示文案
jkchang
校验提示文案
jkchang
if IsMouseButtonPressed(4) then
for i=1,2 do
MoveMouseRelative(0,1)
end
end
end
校验提示文案
Kivil
校验提示文案
值友7625054793
校验提示文案
騎馬過河
校验提示文案
值友4660753647
校验提示文案
Oo麦粒oO
校验提示文案
你好过分
校验提示文案
光刃小屋
校验提示文案