Project1

标题: 求教:关于怎么获取当前活动选项的坐标范围……等2问…… [打印本页]

作者: sssWorld    时间: 2013-5-6 14:15
标题: 求教:关于怎么获取当前活动选项的坐标范围……等2问……
本帖最后由 Sion 于 2013-5-25 17:53 编辑

小白表示有了点C++基础,就想去到处改默认脚本……
然后发现自己实在DT,于是下了@Sion 大大的VA鼠标脚本来学习&入门,然后就一堆问题来了……

背景:1张图就够了……




[line]1[/line]
问题1:在大地图上点击右键后,会发现背景那块会留着个鼠标……怎么去掉啊?
个人觉得关键的代码:
RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2.   # ● 鼠标指针精灵 ——> 来自Sion大大的部分代码
  3.   #--------------------------------------------------------------------------
  4.   def creat_mouse_sprite
  5.     @mouse_sprite = Sprite.new
  6.     if File.exist?('Graphics/System/Cursor.png')
  7.       @mouse_sprite.bitmap = Bitmap.new('Graphics/System/Cursor')
  8.     else
  9.  
  10.       if $no_arrowpic_warn
  11.         msgbox('未找到文件:Graphics\System\Cursor.png
  12.  
  13. “鼠标指针”将使用游戏自带图片
  14.  
  15. 该提示可以在脚本内关闭')
  16.       end
  17.  
  18.       @mouse_sprite.bitmap = Bitmap.new(24, 24)
  19.       @mouse_sprite.bitmap.blt(0, 0, Cache.system('Iconset'),
  20.         Rect.new(5 * 24, 24 * 24, 24, 24))
  21.     end
  22.     @mouse_sprite.z = 9999
  23.     Show_Cursor.call(0)
  24.   end
  25.   #--------------------------------------------------------------------------
  26.   # ● 更新 ——> 来自Sion大大的部分代码
  27.   #--------------------------------------------------------------------------
  28.   def update
  29.     @mouse_sprite.x, @mouse_sprite.y = get_mouse_pos
  30.     left_state  = Get_Key_State.call(0x01)
  31.     left_state[7] == 1 ? @left_state +=1 : @left_state = 0
  32.     right_state = Get_Key_State.call(0x02)
  33.     right_state[7] == 1 ? @right_state +=1 : @right_state = 0
  34.     update_double_click
  35.     @left_state == 1 ? @ck_count = 0 : @ck_count += 1
  36.   end

[line]1[/line]
问题2:鼠标点击左键的时候无论在不在选项上都会相当于按了空格键

所以就想能否获取当前的活动选项的坐标范围?以判断鼠标是否真的点中了选项

注意是活动选项,也就是按下空格,发生响应的那个选项
比如图片现在的状态是进入了【技能】选项,准备选择人物选项,那么活动的选项则是艾里克的那个人物选择框,主要问题就是:获取活动窗口,的当前选项,的坐标范围……


PS:由于是想自己来改&学习,所以发了个主帖,大大莫怪


作者: Sion    时间: 2013-5-6 18:39
本帖最后由 Sion 于 2013-5-6 18:43 编辑

后面的背景是截图,需要在系统截图的时候隐藏鼠标精灵,然后再让它显示出来。
下面是补丁
  1. class << Mouse
  2. attr_reader :mouse_sprite
  3. end

  4. class << SceneManager
  5.   unless self.method_defined?(:snapshot_for_background_2013_5_6)
  6.     alias_method :snapshot_for_background_2013_5_6, :snapshot_for_background
  7.   end
  8.   def snapshot_for_background
  9.     Mouse.mouse_sprite.visible = false
  10.     snapshot_for_background_2013_5_6
  11.     Mouse.mouse_sprite.visible = true
  12.   end
  13. end
复制代码
判断范围的代码,因为偷懒,借用了系统原来的光标系统,修改起来比较困难。
作者: sssWorld    时间: 2013-5-6 18:47
本帖最后由 sssWorld 于 2013-5-6 18:48 编辑
Sion 发表于 2013-5-6 18:39
后面的背景是截图,需要在系统截图的时候隐藏鼠标精灵,然后再让它显示出来。
下面是补丁判断范围的代码, ...


也就是说用了这个补丁后,即使以后设置了存档截图之类的功能,也能把鼠标隐藏了?

关于范围如果是初始的脚本集合的话,应该怎样获取呢?
作者: Sion    时间: 2013-5-6 19:20
本帖最后由 Sion 于 2013-5-6 19:37 编辑
sssWorld 发表于 2013-5-6 18:47
也就是说用了这个补丁后,即使以后设置了存档截图之类的功能,也能把鼠标隐藏了?

关于范围如果是初始的 ...


1,需要在对应的地方隐藏鼠标精灵。截图存档之类的应该不是使用 SceneManager 里的那个截图

2,初始脚本是指新建工程的默认脚本?

通过调用API来获取鼠标坐标
  1. module UrMouse

  2.   Get_Cursor_Pos    = Win32API.new('user32', 'GetCursorPos', 'p', 'i')
  3.   Screen_To_Client  = Win32API.new('user32', 'ScreenToClient', 'ip', 'i')
  4.   Get_Active_Window = Win32API.new('user32', 'GetActiveWindow', nil, 'l')
  5.   HWnd                = Get_Active_Window.call

  6.   module_function

  7.   def get_pos
  8.     arg = [0, 0].pack('ll')
  9.     Get_Cursor_Pos.call(arg)
  10.     Screen_To_Client.call(HWnd, arg)
  11.     arg.unpack('ll')
  12.   end
  13. end
复制代码
使用
  1. x, y = UrMouse.get_pos
复制代码
来获取鼠标当前坐标,然后就简单的计算一下就能判定鼠标是不是在指定的范围。
作者: sssWorld    时间: 2013-5-6 19:41
本帖最后由 sssWorld 于 2013-5-6 19:43 编辑
Sion 发表于 2013-5-6 19:20
1,需要在对应的地方隐藏鼠标精灵。截图存档之类的应该不是使用 SceneManager 里的那个截图

2,初始脚本 ...


Mouse这段我看懂了,因为之前学过VC++的说……

对,就是指那个RMVA自动生成的默认脚本,如果我没理解错的话,【菜单】也是通过 建立一个新window对象 来实现的?那么这样的话应该就可以通过window类的方法获取选项的坐标范围了吧。

另:RMVA应该也封装了一部分基类吧,大大介绍的ruby-doc网站好像只有Ruby的基本语法和数据结构(类似于C++与VC++的区别),有介绍RMVA自己封装的类的网站吗?

顺便吐一句:新人不能发链接……是防广告么……
作者: Sion    时间: 2013-5-6 19:59
本帖最后由 Sion 于 2013-5-6 20:03 编辑
sssWorld 发表于 2013-5-6 19:41
Mouse这段我看懂了,因为之前学过VC++的说……

对,就是指那个RMVA自动生成的默认脚本,如果我没理解错 ...


知道个英文站: http://rgss3doc.tk//en/index.html
不完全汉化的F1档:http://rpg.blue/home.php?mod=spa ... o=blog&id=11217
RGSS3基类源码听说是用C编写的,反正我是没找到- -b

菜单的话,看看默认脚本 + F1帮助档应该能看懂的。主要是 Window_Selectable 和它的父类
作者: sssWorld    时间: 2013-5-6 20:03
Sion 发表于 2013-5-6 19:59
知道个英文站: http://rgss3doc.tk//en/index.html
不完全汉化的F1档:http://rpg.blue/home.php?mo ...

非常感谢大大的解答和分享!{:2_275:}




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1