hongqizhen 发表于 2010-8-27 08:38:15

在游戏中应用鼠标滚轮 by 紫苏

首先声明,这是紫苏大人原创的,不是我。
具体情况看这里:
http://bbs.66rpg.com/forum.php?mod=viewthread&tid=153612&page=2

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

脚本:(插入到MAIN上方即可)
#在游戏中使用鼠标滚轮 by 紫苏
module Mouse
# 累积 delta 值上限
WHEEL_DELTA = 120
def self.on_wheel(delta, keys, x, y)
    # 此次滚动是否产生了效果
    effect = false
    # 累积 delta
    @@delta += delta
    if @@delta.abs >= WHEEL_DELTA
      delta_idx = - @@delta / WHEEL_DELTA
      # 进行特定场景的特殊处理
      case $scene
      when Scene_File
      savefile_windows = $scene.instance_eval {
          @savefile_windows[@file_index].selected = false
          @file_index = (@file_index + delta_idx) % 4
          @savefile_windows[@file_index].selected = true
      }
      effect = true
      end
      # 枚举 Window_Selectable 可选择窗口对象
      ObjectSpace.each_object(Window_Selectable) { |o|
      # 光标索引上限
      limit = o.instance_eval { @item_max }
      # 如果可选择窗口未被释放、已激活、可见
      if not o.disposed? and o.active and o.visible
          # 移动光标
          o.index = (o.index + delta_idx) % limit
          effect = true
      end
      }
      # 如果产生了效果就播放移动光标 SE
      effect and $game_system.se_play($data_system.cursor_se)

      # 重新累积 delta
      @@delta %= WHEEL_DELTA
    end
end
# 如果第一次定义 Wheel 常量
if !defined? Wheel
    # 初始化滚轮相关数据
    Wheel = Win32API.new('rm_mouse_wheel', 'intercept', 'v', 'v')
    Wheel.call
    @@delta = 0
end
end紫苏大人的应用说明:
其中 on_wheel 就是处理滚轮的回调函数,可以在里面扩充不同场景的处理,这里实现了在标题和结束场景时滚轮移动窗口光标的功能
参数列表中,delta 是滚动的范围;keys 是滚动同时还有什么虚拟键按下;x 是滚动时的屏幕鼠标 x 坐标;x 是滚动时的屏幕鼠标 y 坐标
具体用法可以参考:
http://msdn.microsoft.com/en-us/library/ms645617(VS.85).aspx



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



紫苏大人公布的dll源码,有兴趣的可以看下:#include <windows.h>
#include <stdio.h>

typedef DWORD (*EVALFUNC)(LPCSTR);

LONG oldWndProc;
EVALFUNC eval;

LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    switch(uMsg) {
    case WM_MOUSEWHEEL:
      char buf;
      sprintf(buf, "Mouse.respond_to? :on_wheel and Mouse.on_wheel(%hd,%hd,%hd,%hd)",
            wParam >> 16 & 0xffff, wParam & 0xffff, lParam & 0xffff, lParam >> 16 & 0xffff);
      eval(buf);
      return TRUE;
    default:
      return CallWindowProc((WNDPROC)oldWndProc, hWnd, uMsg, wParam, lParam);
    }
}

void intercept() {
    HMODULE hRGSS;
    DWORD threadId = GetCurrentThreadId();
    HWND hWnd = GetWindow(GetForegroundWindow(), GW_HWNDFIRST);
    do {
      if(threadId == GetWindowThreadProcessId(hWnd, NULL)) {
            char className;
            GetClassName(hWnd, className, 12);
            if(!strcmp(className, "RGSS Player")) break;
      }
      hWnd = GetWindow(hWnd, GW_HWNDNEXT);
    } while(hWnd);
    oldWndProc = SetWindowLong(hWnd, GWL_WNDPROC, (LONG)WindowProc);
    if(!(hRGSS = LoadLibrary("rgss102j.dll")))
      hRGSS = LoadLibrary("rgss103j.dll");
    eval = (EVALFUNC)GetProcAddress(hRGSS, "RGSSEval");
}

secondsen 发表于 2010-8-27 13:20:06

嘎嘎,紫苏大一如既往的强大
页: [1]
查看完整版本: 在游戏中应用鼠标滚轮 by 紫苏