赞 | 2 |
VIP | 341 |
好人卡 | 22 |
积分 | 6 |
经验 | 66602 |
最后登录 | 2024-5-19 |
在线时间 | 1243 小时 |
Lv2.观梦者 (管理员) 八云紫的式神
- 梦石
- 0
- 星屑
- 599
- 在线时间
- 1243 小时
- 注册时间
- 2008-1-1
- 帖子
- 4282
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
原鼠标输入模块中press判定有bug,以下为修复后的:- #==============================================================================
- # ** 鼠标输入模块
- #------------------------------------------------------------------------------
- # 微调 by zh99998
- # 版本 1.2a
- # 06-30-2010
- # 修复press判定
- # 基于沉影的鼠标系统修改版alpha
- #------------------------------------------------------------------------------
- # by DerVVulfman
- # 版本 1.2
- # 08-18-2007
- #------------------------------------------------------------------------------
- # 建立在鼠标输入模块...
- #
- # by Near Fantastica
- #------------------------------------------------------------------------------
- # Set_Pos feature by
- # Freakboy
- #------------------------------------------------------------------------------
- #
- # CALLS:
- #
- # Mouse.click?
- # 判断鼠标是否真的按下(Ture/False).
- # 这个值控制您按下的是左/右键,还是中键
- #
- # Mouse.press?
- # 判断鼠标是否真的按下/保持按下状态
- # 这个值控制您按下的是左/右键,还是中键
- # Mouse.pixels
- # Mouse.pixels
- # 这个值返回鼠标所在的坐标(640*480大小),如果鼠标超出游戏画面,这个值为空
- #
- # Mouse.tiles
- # This returns the mouse's screen coordinates in map tiles. Based on the
- # system's 20x15 tile size, this returns it in index values (a 0-19 width &
- # a 0-14 height). This functions the same manner as Mouse.pixels.
- #
- # Mouse.set_pos
- # This allows you to forcefully position the mouse at an x/y position within
- # the game screen by pixel coordinates. Given the game's normal screen width
- # of 640x480, adding: Mouse.set_pos(320,240) should position the mouse dead
- # center of the gaming window.
- #
- # Mouse.update
- # Add this routine into your update routines to update the mouse position.
- # It must be called otherwise you won't get valid mouse coordinates.
- #
- #==============================================================================
- module Mouse
- #--------------------------------------------------------------------------
- # ## 常量
- #--------------------------------------------------------------------------
- GetAsyncKeyState = Win32API.new("user32","GetAsyncKeyState",['i'],'i')
- GetKeyState = Win32API.new("user32","GetKeyState",['i'],'i')
-
- ScreenToClient = Win32API.new('user32', 'ScreenToClient', 'lp', 'i')
-
- GetCursorPos = Win32API.new('user32', 'GetCursorPos', 'p', 'i')
- GetClientRect = Win32API.new('user32', 'GetClientRect', 'lp', 'i')
-
- #--------------------------------------------------------------------------
- # * Mouse Click
- # button : button
- #--------------------------------------------------------------------------
- def Mouse.click?(button)
- return false if button == 1 and !$click_abled
- return true if @keys.include?(button)
- return false
- end
- #--------------------------------------------------------------------------
- # * Mouse Pressed
- # button : button
- #--------------------------------------------------------------------------
- def Mouse.press?(button)
- return true if @press.include?(button)
- return false
- end
- #--------------------------------------------------------------------------
- # * Mouse Pressed
- # button : button
- #--------------------------------------------------------------------------
- def Mouse.area?(x, y, width=32, height=32)
- return false if @pos == nil
- return true if @pos[0] >= x and @pos[0] <= (x+width) and @pos[1] >= y and @pos[1] <= (y+height)
- return false
- end
- #--------------------------------------------------------------------------
- # * Mouse Pixel Position
- #--------------------------------------------------------------------------
- def Mouse.pixels
- return @pos == nil ? [0, 0] : @pos
- end
- #--------------------------------------------------------------------------
- # * Mouse Tile Position
- #--------------------------------------------------------------------------
- def Mouse.tiles
- return nil if @pos == nil
- x = @pos[0] / 32
- y = @pos[1] / 32
- return [x, y]
- end
- #--------------------------------------------------------------------------
- # * Set Mouse Position
- #--------------------------------------------------------------------------
- def Mouse.set_pos(x_pos=0, y_pos=0)
- width, height = Mouse.client_size
- if (x_pos.between?(0, width) && y_pos.between?(0, height))
- x = Mouse.client_pos[0] + x_pos; y = Mouse.client_pos[1] + y_pos
- Win32API.new('user32', 'SetCursorPos', 'NN', 'N').call(x, y)
- end
- end
- #--------------------------------------------------------------------------
- # * Mouse Update
- #--------------------------------------------------------------------------
- def Mouse.update
- @pos = Mouse.pos
- @keys, @press = [], []
- @keys.push(1) if GetAsyncKeyState.call(1) & 0X01 == 1
- @keys.push(2) if GetAsyncKeyState.call(2) & 0X01 == 1
- @keys.push(3) if GetAsyncKeyState.call(4) & 0X01 == 1
- @press.push(1) if GetKeyState.call(1) > 1
- @press.push(2) if GetKeyState.call(2) > 1
- @press.push(3) if GetKeyState.call(4) > 1
- ## 鼠标双击
- @wait ||= 0
- @wait += 1 if @key != nil
- (@key = nil; @wait = 0) if @wait > 30 # 双击时间
- end
- #--------------------------------------------------------------------------
- # * Automatic functions below
- #--------------------------------------------------------------------------
- #
- #--------------------------------------------------------------------------
- # * Obtain Mouse position in screen
- #--------------------------------------------------------------------------
- def Mouse.global_pos
- pos = [0, 0].pack('ll')
- if GetCursorPos.call(pos) != 0
- return pos.unpack('ll')
- else
- return nil
- end
- end
- #--------------------------------------------------------------------------
- # * Return Screen mouse position within game window
- #--------------------------------------------------------------------------
- def Mouse.pos
- x, y = Mouse.screen_to_client(*Mouse.global_pos)
- width, height = Mouse.client_size
- begin
- if (x >= 0 and y >= 0 and x < width and y < height)
- return x, y
- else
- return nil
- end
- rescue
- return nil
- end
- end
- #--------------------------------------------------------------------------
- # * Pass Screen to Game System
- #--------------------------------------------------------------------------
- def Mouse.screen_to_client(x, y)
- return nil unless x and y
- pos = [x, y].pack('ll')
- if ScreenToClient.call(HWND, pos) != 0
- return pos.unpack('ll')
- else
- return nil
- end
- end
- #--------------------------------------------------------------------------
- # * Get Game Window Size
- #--------------------------------------------------------------------------
- def Mouse.client_size
- rect = [0, 0, 0, 0].pack('l4')
- GetClientRect.call(HWND, rect)
- right, bottom = rect.unpack('l4')[2..3]
- return right, bottom
- end
- #--------------------------------------------------------------------------
- # * Get Window Position
- #--------------------------------------------------------------------------
- def Mouse.client_pos
- rect = [0, 0, 0, 0].pack('l4')
- ## 用户区
- GetClientRect.call(HWND, rect)
- left, upper = rect.unpack('l4')[0..1]
- return left, upper
- end
- #--------------------------------------------------------------------------
- # ## 句柄
- #--------------------------------------------------------------------------
- def Mouse.get_hwnd
- game_name = "\0" * 256
- Win32API.new('kernel32', 'GetPrivateProfileStringA', 'pppplp', 'l').call('Game','Title','',game_name,255,".\\Game.ini")
- game_name.delete!("\0")
- return Win32API.new('user32', 'FindWindowA', 'pp', 'l').call('RGSS Player',game_name)
- end
- #--------------------------------------------------------------------------
- # ## 双击
- #--------------------------------------------------------------------------
- def self.double_click?(key)
- if @keys.include?(key)
- @key !=key ? (@key = key; return false) : (@key = nil; return true)
- end
- end
- ## 句柄常量
- HWND = Mouse.get_hwnd
-
- ###############
- GetMessage = Win32API.new('user32','GetMessage','plll','l')
-
- Point = Struct.new(:x, :y)
- Message = Struct.new(:message, :wparam, :lparam, :pt)
- Param = Struct.new(:x, :y, :scroll)
-
- def self.scroll
- msg = "\0"*32
- GetMessage.call(msg,0,0,0)
- r = wmcallback(unpack_msg(msg))
- return r unless r.nil?
- end
-
- def wmcallback(msg)
- return unless msg.message == Scroll
- param = Param.new
- param.x = word2signed_short(loword(msg.lparam))
- param.y = word2signed_short(hiword(msg.lparam))
- param.scroll = word2signed_short(hiword(msg.wparam))
- return [param.x,param.y,param.scroll]
- end
-
- def hiword(dword)
- ###return ((dword&0xffff0000)>>16)&0x0000ffff
- return (dword & 0xffff0000) / 0x10000
- end
-
- def loword(dword)
- return dword&0x0000ffff
- end
- end
复制代码 改动在于Mouse.update中@press.push部分- @press.push(1) if GetKeyState.call(1) > 1
- @press.push(2) if GetKeyState.call(2) > 1
- @press.push(3) if GetKeyState.call(4) > 1
复制代码 脚本基于沉影的鼠标系统修改alpha |
|