设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 37061|回复: 87

[RMVX发布] [vx]鼠标系统 1楼无DLLl,2楼依赖DLL(2010-09-23更新)

  [复制链接]

TA还没有解放自身的潜力。

Lv1.梦旅人

梦石
0
星屑
46
在线时间
10 小时
注册时间
2007-5-27
帖子
2558

第1届Title华丽大赛新人奖

发表于 2010-8-8 00:55:05 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 沉影不器 于 2010-11-6 17:27 编辑

我的vx鼠标历程


1.最早出现在贵论坛的vx鼠标,应该是"光的圆周率"引入的>>这个版本<<

2.后来我做了一定修改,并连同>>vx新菜单样式<<发布

3.再后来,又做了小改动,命名为"修改版"单独发布了,即>>这个帖子<<

4.这是我第三次修改了,主要是添加功能(详见下文)...只贴出核心脚本,场景啦窗体啦这类接入可以延用原版.

5.测试测试测试测试....在我看来没有需求的话,脚本就很难完善!如果大家也期望vx鼠标更上一层楼,请积极参与!谢谢!!

# ** vx鼠标脚本修改版 bata
#------------------------------------------------------------------------------
# 修改自: DerVVulfman和berka的鼠标脚本
# 链接: http://www.rpgmakervx-fr.com
#------------------------------------------------------------------------------
# 沉影不器的修改:
#
#  (一)鼠标核心修改:
#     ① 优化FPS,主要是避免反复读取ini文件.
#        **事实上句柄没变化,不需要反复读硬盘
#     ② 增加几个功能
#        Mouse.toggled?       侦测鼠标键是否已经触发
#        Mouse.press?         侦测鼠标键是否处于"按下"状态
#        Mouse.dbl_click?     鼠标双击
#        Mouse.scroll         侦测鼠标滚轮 返回值:向前>0,向后<0
#        Mouse.move?          鼠标是否移动
#                             **其中左键返回值1,右键返回2,中键返回16,允许多键
#        Mouse.over?(obj)     鼠标是否经过
#                             **支持Sprite,Window,Viewport,Rect,Plane,可补充
#     ③ 鼠标按键取值(支持左右键交换)
#        左键:1 右键:2 中键:4
#
#  (二)vx应用修改:
#     ① 修复使用交通工具时鼠标无效的bug (鼠标双击:上/下交通工具)
#     ② 降低对象灵敏度
#     ③ 修复物品或技能有效范围是"全体"或"使用者"时光标错误bug
#     ④ 修改角色在地图上的移动,防止地图上"滑动"
#     ⑤ 鼠标不在选项上时,按左键不响应
#     ⑥ F2不影响鼠标使用
#     ⑦ 鼠标点击移动中的NPC,该NPC停止移动,原地面向角色
#        做为NPC的事件,在事件页中增加注释(): npc=true
#     ⑧ 增加鼠标滚轮功能,在选项窗体中代替方向键滚动




2010-08-08 更新
附上修改后的vx应用脚本及测试工程
(Mouse.double_click? 鼠标双击) --->使用双击可以上/下交通工具
(Mouse.scroll 侦测鼠标滚轮) --->使用滚轮可以滚动物品窗口等
Mouse.down?和 Mouse.move?暂时不能在我提供的工程中直接测试...

2010-08-15 更新
① 使用紫苏的hwnd获取脚本,以后应该都没问题了
② 修改刷新: 为保证同一帧内调用相同方法返回相同值,而将大部分鼠标动作保存在update里
③ 重写双击算法,修复柳柳提出的双击bug
④ 支持鼠标逻辑左右键
⑤ 增加把事件做为npc的办法,修复38571240提出的"门事件"无效bug
⑥ 由于截窗体消息效果不佳,改用最普通的比较坐标法实现Mouse.move?判断...=.=

2010-08-19 更新
① 统一使用GetKeyState捕捉所有鼠标键操作.
② rgss内部拦截消息基本上没有进展空间,已标明滚轮脚本处,不需要可自行删除.



附件已更新(2010-08-19)



有点儿担心带坏风气...已去掉附件收费了...
关于之前付款的声明:退款麻烦,有需要的回帖退款



vx鼠标系统修改版_Final版.

vx鼠标系统修改版.rar

278.68 KB, 下载次数: 25283

vx鼠标bata

点评

哎甭误会,本来需要的是测试...不过现在不需要了  发表于 2010-9-7 22:26
charge O_O,我个人转账1V吧。评分随小幽。  发表于 2010-9-7 22:21

评分

参与人数 9星屑 +46 +20 收起 理由
snyb5010 + 10 精品文章
end55rpg + 4 nb
shinliwei + 2
DeathKing + 10 精品文章
小幽的马甲 + 20 + 10 补分
lzy136188230 + 4
fgtsky + 2 精品。。赞同!
54cn + 2 支持
a000b1745 + 2 精神支持、加油!

查看全部评分

阿桑奇不是一个偶像;阿桑奇是一种思想

TA还没有解放自身的潜力。

Lv1.梦旅人

梦石
0
星屑
46
在线时间
10 小时
注册时间
2007-5-27
帖子
2558

第1届Title华丽大赛新人奖

 楼主| 发表于 2010-8-8 01:04:09 | 显示全部楼层

DLL版VX鼠标(2010-09-23更新)

本帖最后由 沉影不器 于 2010-11-6 17:28 编辑

本次更新,同样仅是鼠标核心的更新,主要是修补bug,顺便加几项新功能,详见方法列表:
  1. # 使用说明:
  2. #
  3. #    利用紫苏提供的winproc,而写的新鼠标系统,跟外站那个完全不相干了
  4. #
  5. #    在使用RM精灵伪造鼠标光标时,利用WM_SETFOCUS和WM_KILLFOCUS消息解决了F1窗口
  6. #    不显示鼠标问题.
  7. #
  8. #    也提供另一种选择:
  9. #    允许使用系统光标(即cur或ani后缀的光标文件),由配置模块TrueMouse参数设定
  10. #    由于光标文件不是rgss支持的格式,在指定文件时,最好包含后缀.
  11. #
  12. #     ** 注意: 开启TrueMouse时会关闭全屏模式,因为全屏下光标不可见
  13. #    ------------------------------------------------------------------------
  14. #    提供的主要方法如下:
  15. #     Mouse.pos
  16. #       提供鼠标坐标,返回值是个数组,格式为[x,y]
  17. #     Mouse.area?(rect)
  18. #       判断鼠标是否在参数rect范围内
  19. #     Mouse.up?(key)
  20. #       鼠标按键是否处在"松开"的瞬间
  21. #       参数key取值(1:左键 2:右键 4:中键),允许不输入参数,表示任意鼠标键,下同
  22. #     Mouse.down?(key)
  23. #       鼠标按键是否处在"按下"的瞬间
  24. #     Mouse.click?(key)
  25. #       鼠标按键单击,脚本简化,仅判断down?
  26. #     Mouse.dbl_clk?(key)
  27. #       鼠标按键双击
  28. #     Mouse.press?(key)
  29. #       鼠标按键是否处在"按下"的状态
  30. #     Mouse.toggle?(key)
  31. #       鼠标按键的触发状态(在开和关之间切换)
  32. #     Mouse.scroll
  33. #       返回鼠标滚轮的滚动值.正值表示向前,负值表示向后,零表示未发生滚动
  34. #     Mouse.move?
  35. #       判断鼠标是否移动
  36. #     Mouse.set_pos(x,y)
  37. #       指定鼠标坐标,鼠标移动到该坐标
  38. #     Mouse.set_cursor(file)
  39. #       改变当前鼠标的光标样式.参数file为光标文件名(路径由配置模块指定)
  40. #       如果参数为nil或者指定光标文件不存在等,不返回错误,但光标不可见
  41. #     Mouse.sys_cursor
  42. #       还原到系统默认光标
  43. #     Mouse.clip(x,y,width,height)
  44. #       把鼠标锁死在指定区域范围内
  45. #       省略参数时,解除鼠标锁定
复制代码
提供测试工程下载,这个工程仍然以我在主楼更新的鼠标系统为主体,只是把它的核心替换成新的这个,仅供测试..
为了直接兼容旧工程,做了小修改.



有点儿担心带坏风气...已去掉附件收费了...
关于之前付款的声明:退款麻烦,有需要的回帖退款

2010-09-23 更新
修改down不受双击影响


vx鼠标系统修改版(依赖DLL).rar

275.35 KB, 下载次数: 8278

点评

好东东,我用无DLL的就不兼容。。  发表于 2011-7-17 20:05
……嗯,DLL版和您的VX新菜单样式冲突啊,存档页面,怎么解决?  发表于 2011-2-20 14:53

评分

参与人数 1星屑 +20 收起 理由
精灵使者 + 20 购买~恩恩

查看全部评分

阿桑奇不是一个偶像;阿桑奇是一种思想

回复 支持 反对

使用道具 举报

TA还没有解放自身的潜力。

Lv1.梦旅人

梦石
0
星屑
50
在线时间
416 小时
注册时间
2006-10-21
帖子
1245
发表于 2010-8-8 01:27:44 | 显示全部楼层
签名看来那4个高级装备脚本兼容啦?
回复 支持 反对

使用道具 举报

TA还没有解放自身的潜力。

Lv2.观梦者

梦石
0
星屑
536
在线时间
620 小时
注册时间
2009-11-11
帖子
2725
发表于 2010-8-8 13:28:55 | 显示全部楼层
一直觉得很卡,家用机向吧,,,网游向???

这里的大佬个个都是人才,讲话又好听,我超喜欢这里的
回复 支持 反对

使用道具 举报

TA还没有解放自身的潜力。

Lv1.梦旅人 (管理员)

八云紫的式神

梦石
0
星屑
104
在线时间
1202 小时
注册时间
2008-1-1
帖子
4282

烫烫烫

发表于 2010-8-8 13:34:44 | 显示全部楼层
看一下我在发布区发的改过的鼠标脚本,修正了几处判定
另外我也做过兼容F2,原理就是那个不反复读取句柄,你然你这个有了我就不发布了
rm for linux(wine)制作中,期待夏娜SAMA能实现到webrm上
回复 支持 反对

使用道具 举报

TA还没有解放自身的潜力。

Lv1.梦旅人

梦石
0
星屑
46
在线时间
10 小时
注册时间
2007-5-27
帖子
2558

第1届Title华丽大赛新人奖

 楼主| 发表于 2010-8-8 21:35:28 | 显示全部楼层
2010-08-08 更新

附上修改后的vx应用脚本及测试工程
(Mouse.double_click? 鼠标双击) --->使用双击可以上/下交通工具
(Mouse.scroll 侦测鼠标滚轮) --->使用滚轮可以滚动物品窗口等
Mouse.down?和 Mouse.move?暂时不能在我提供的工程中直接测试...

关于:
Mouse.move?是截取wm_msg判断的,也不知道是太准确了还是太不准确了...貌似尚无法付诸应用:(
有更好的建议请您提出来,或者直接帮助修改,谢谢!

To: wangswz
谢谢.确有此计划,借着改fsl的机会,把以往脚本整理一遍...但目前只关注鼠标,复杂装备系列延后

To: summer92
修改后的鼠标脚本,奔4 2.0的老机子也能保持60fps

To: zh99998
您是指>>这个帖子<<吗?
  1. GetKeyState.call(1) & 0X01 == 1
复制代码
最早的作者Near Fantastica这么写,是为了提取返回值的最低位...您只判断>1是不够的,会受其它数位影响,比如最高位

另一点,读取句柄的方法似乎被讨论过...当时我提出反复读硬盘才是影响fps的关键,不过可能被忽略...新论坛很难搜索,找不着帖了...



最后,感谢回帖,请更多的人帮忙测试或修改,谢谢!!

点评

期待ing~  发表于 2010-8-8 21:49

阿桑奇不是一个偶像;阿桑奇是一种思想

回复 支持 反对

使用道具 举报

TA还没有解放自身的潜力。

Lv1.梦旅人

梦石
0
星屑
50
在线时间
14 小时
注册时间
2010-8-6
帖子
109
发表于 2010-8-9 01:20:22 | 显示全部楼层
只在默认脚本基础上添加鼠标脚本性能怎么样?如果完全兼容我想添加进去。
回复 支持 反对

使用道具 举报

TA还没有解放自身的潜力。

Lv1.梦旅人

梦石
0
星屑
50
在线时间
66 小时
注册时间
2009-2-13
帖子
382
发表于 2010-8-10 23:36:41 | 显示全部楼层
用了这个脚本之后 门事件的行走图好像都不管用了
回复 支持 反对

使用道具 举报

TA还没有解放自身的潜力。

Lv1.梦旅人

66RPG站长

梦石
0
星屑
54
在线时间
615 小时
注册时间
2005-10-10
帖子
5734

RMVX自由创作大赛亚军第2届短篇游戏比赛亚军第5届短篇游戏比赛冠军

发表于 2010-8-11 04:52:12 | 显示全部楼层
不参与技术讨论,只说一下实际使用zh9同学脚本遇到的问题
最麻烦的问题:click?、press?有时候有一定误差。比如用press将一个东西拽起来挪动的时候,有一定几率会没拽好掉在地上——不确定到底是什么原因,基本是随机出现;click则有一定几率(不低)会判断成类似于双击的效果等。我个人还是从逻辑上处理掉了,技术上我想应该值得改进。
另一个是如果game.exe和game.ini改名的话,鼠标失效。
第三个是如果窗口不是焦点的话,鼠标挪进来似乎也有点问题。运行过程中按F1出来帮助也是有一些问题。
回复 支持 反对

使用道具 举报

TA还没有解放自身的潜力。

Lv1.梦旅人

梦石
0
星屑
41
在线时间
21 小时
注册时间
2008-8-5
帖子
1924
发表于 2010-8-11 14:49:15 | 显示全部楼层
本帖最后由 紫苏 于 2010-8-11 15:02 编辑

有几个问题:

不应该依赖 GetAsyncKeyState 的最低位来实现 click,因为最低位有可能被其它程序先行获取,等到 RM 程序再调用 GetAsncKeyState 的时候由于另一个程序先调用过了,虽然按键状态依然是按下,但最低位却已经变成了 0
具体原因让 MSDN 来解释(MSDN 的规律是 Remarks 内容最重要):http://msdn.microsoft.com/en-us/library/ms646293(VS.85).aspx
解决方法:用变量记录按键按下状态,click 里判断变量,如果为 true 则 click? 返回 false,如果为 false 则把变量设置为 true,返回 true;刷新时判断,如果变量为 true 且 GetKeyState 返回的状态是没有按键已弹起,则设变量为 false

实际上这个脚本中的 click? 不是我们通常所理解的鼠标单击事件,因为单击应该是按下跟一个弹开,而这里的 click? 实际上是和 Input.trigger? 实现了一样的功能,所以会有按下后立即返回 true 的现象




GetAsncKeyState 检测的是中断层的按键状态,所以跳过了 OS 的逻辑按键映射,当这个映射并不是物理左键对应逻辑左键、物理右键对应逻辑右键时,就会发生一些很有喜感的现象,如用 OS 提供的接口让鼠标左右键反转后,用户认为按下了左键(当然实际按的是鼠标右键)但程序却依然认为按下了右键,用户认为按下了右键(当然实际按的是鼠标左键)但程序却依然认为按下了左键
解决方法:用 GetKeyState 判断逻辑按键




press? 是用的 GetKeyState 来判断按键状态,但是它取了最低位,最低位是一个按键开关的状态,每次按键按下时状态会反转,要么就是对大写锁定等有开关状态的按键比较有用,要么就是用于实现多次按某个键轮流进行不同操作的功能
很明显在这里取出最低位不合适,press? 应该返回按键当前是否按下的状态,所以应该用 0x8000 取出最高位,否则会有按下一次弹起后 press? 也永远返回 true,或者没有按过 press? 就返回 true 的现象




@down.push(1)   if (GetKeyState.call(1) & 0x1000) / 0x1000 == 1
这几行脚本很奇怪,为什么用的是 0x1000?用 0x1000 进行与运算取出的是倒数第四高位,而 MSDN 说按下的状态是在最高位
测试了一下,似乎当最高位为 1 时,高字节的所有位,包括低字节的最高位确实同时变成了 1,但似乎不应该以偏概全假设这个语句永远是真,很可能是平台有关的
另外这里可以不用除,也不用移位,直接判断返回值 != 0 即可




刷新的实现比较诡异,用了数组来保存这次刷新按下的键,虽然数组的长度最大也只是个位数,但频繁分配内存、搜索、释放内存也是个不容忽视的问题,可以优化为使用变量记录按下状态(同第一个问题的解),刷新时仅仅是改变 true/false




关于获取句柄,有上面某柳提到的问题,还有标题动态刷新时匹配标题失败的问题,以及同时开两个标题相同的游戏窗口时可能获取到不正确的句柄的问题,统一解决方法:http://rpg.blue/forum.php?mod=viewthread&tid=133018




关于鼠标滚轮和 move? 的实现,理论上还是有些问题,因为即便在判断的那一刻确实有 WM_MOUSEHWHEEL 或 WM_MOUSEMOVE 消息,但它们并不一定处于消息队列的头部,特别是在硬件性能差或者资源紧凑的环境下,可能每次 PeekMessage 的时候都有数个消息处于上述两个消息的前端,暂时还没有被 RM 默认的消息循环移出队列并处理,这样直接效果就是滚动或移动了但没反应
另外 WM_MOUSEHWHEEL 的 wParam 还包含滚动距离的数据,可以在默认的菜单里做相应的相应的处理,目前无论滚动多远都只会让窗口光标移动 1




关于鼠标的实现其实还有一种方法,个人感觉比这种用 GetCursorPos、GetKeyState 等函数的方法要简单,就是直接处理 WM_MOUSEMOVE、WM_LBUTTONDOWN、WM_LBUTTONUP 等各种鼠标相关的消息
以前夏娜发过一个替换窗口过程的工程,在 DLL 里 SetWindowLong 替换 RM 的窗口过程,并用 rgss102j.dll 里的 RGSSEval 去回调 RM 脚本里的各种回调函数,方法和 RM 后台运行的一样,可以用来处理鼠标的消息
具体方法可以是:设计各种闭包,在不同的场景让一个全局的回调 Proc 保存这个闭包,然后让 DLL 里的窗口过程函数统一调用处理鼠标消息
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:fux2@moe9th.com|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2019-8-20 21:49

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表