幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3193|回复: 1

[个人创意] 在游戏中应用鼠标滚轮 by 紫苏

[复制链接]

16

主题

36

帖子

1063

积分

⑥精研

积分
1063
发表于 2010-8-27 08:38:15 | 显示全部楼层 |阅读模式
首先声明,这是紫苏大人原创的,不是我。
具体情况看这里:
http://bbs.66rpg.com/forum.php?m ... 3612&page=2

发布在这里只是希望跟我一样需要用到鼠标滚轮功能的人,能够更便利的找到,仅此而已。

脚本:(插入到MAIN上方即可)
  1. #在游戏中使用鼠标滚轮 by 紫苏
  2.   module Mouse
  3.   # 累积 delta 值上限
  4.   WHEEL_DELTA = 120
  5.   def self.on_wheel(delta, keys, x, y)
  6.     # 此次滚动是否产生了效果
  7.     effect = false
  8.     # 累积 delta
  9.     @@delta += delta
  10.     if @@delta.abs >= WHEEL_DELTA
  11.       delta_idx = - @@delta / WHEEL_DELTA
  12.       # 进行特定场景的特殊处理
  13.       case $scene
  14.       when Scene_File
  15.         savefile_windows = $scene.instance_eval {
  16.           @savefile_windows[@file_index].selected = false
  17.           @file_index = (@file_index + delta_idx) % 4
  18.           @savefile_windows[@file_index].selected = true
  19.         }
  20.         effect = true
  21.       end
  22.       # 枚举 Window_Selectable 可选择窗口对象
  23.       ObjectSpace.each_object(Window_Selectable) { |o|
  24.         # 光标索引上限
  25.         limit = o.instance_eval { @item_max }
  26.         # 如果可选择窗口未被释放、已激活、可见
  27.         if not o.disposed? and o.active and o.visible
  28.           # 移动光标
  29.           o.index = (o.index + delta_idx) % limit
  30.           effect = true
  31.         end
  32.       }
  33.       # 如果产生了效果就播放移动光标 SE
  34.       effect and $game_system.se_play($data_system.cursor_se)
  35.       # 重新累积 delta
  36.       @@delta %= WHEEL_DELTA
  37.     end
  38.   end
  39.   # 如果第一次定义 Wheel 常量
  40.   if !defined? Wheel
  41.     # 初始化滚轮相关数据
  42.     Wheel = Win32API.new('rm_mouse_wheel', 'intercept', 'v', 'v')
  43.     Wheel.call
  44.     @@delta = 0
  45.   end
  46. end
复制代码
紫苏大人的应用说明:
其中 on_wheel 就是处理滚轮的回调函数,可以在里面扩充不同场景的处理,这里实现了在标题和结束场景时滚轮移动窗口光标的功能
参数列表中,delta 是滚动的范围;keys 是滚动同时还有什么虚拟键按下;x 是滚动时的屏幕鼠标 x 坐标;x 是滚动时的屏幕鼠标 y 坐标
具体用法可以参考:
http://msdn.microsoft.com/en-us/library/ms645617(VS.85).aspx


附带dll(解包后请放置在游戏目录中)
  


紫苏大人公布的dll源码,有兴趣的可以看下:
  1. #include <windows.h>
  2. #include <stdio.h>
  3. typedef DWORD (*EVALFUNC)(LPCSTR);
  4. LONG oldWndProc;
  5. EVALFUNC eval;
  6. LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
  7.     switch(uMsg) {
  8.     case WM_MOUSEWHEEL:
  9.         char buf[128];
  10.         sprintf(buf, "Mouse.respond_to? :on_wheel and Mouse.on_wheel(%hd,%hd,%hd,%hd)",
  11.             wParam >> 16 & 0xffff, wParam & 0xffff, lParam & 0xffff, lParam >> 16 & 0xffff);
  12.         eval(buf);
  13.         return TRUE;
  14.     default:
  15.         return CallWindowProc((WNDPROC)oldWndProc, hWnd, uMsg, wParam, lParam);
  16.     }
  17. }
  18. void intercept() {
  19.     HMODULE hRGSS;
  20.     DWORD threadId = GetCurrentThreadId();
  21.     HWND hWnd = GetWindow(GetForegroundWindow(), GW_HWNDFIRST);
  22.     do {
  23.         if(threadId == GetWindowThreadProcessId(hWnd, NULL)) {
  24.             char className[12];
  25.             GetClassName(hWnd, className, 12);
  26.             if(!strcmp(className, "RGSS Player")) break;
  27.         }
  28.         hWnd = GetWindow(hWnd, GW_HWNDNEXT);
  29.     } while(hWnd);
  30.     oldWndProc = SetWindowLong(hWnd, GWL_WNDPROC, (LONG)WindowProc);
  31.     if(!(hRGSS = LoadLibrary("rgss102j.dll")))
  32.         hRGSS = LoadLibrary("rgss103j.dll");
  33.     eval = (EVALFUNC)GetProcAddress(hRGSS, "RGSSEval");
  34. }
复制代码

本帖子中包含更多资源

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

x
回复

使用道具 举报

550

主题

9116

帖子

214748万

积分

超级版主

如同神一般的存在,腿神!拖后腿的神~~

Rank: 8Rank: 8

积分
2147483647
发表于 2010-8-27 13:20:06 | 显示全部楼层
嘎嘎,紫苏大一如既往的强大
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2024-4-20 23:13 , Processed in 0.017663 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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