Project1

标题: 鼠标脚本选项页的滚动…… [打印本页]

作者: 水迭澜    时间: 2008-2-19 21:47
标题: 鼠标脚本选项页的滚动……
难道就没人发现站上的鼠标脚本都存在选项超过一页无法滚动的问题吗= =+只能用键盘控制……这样的话还不如直接用键盘呢……
今天更新了一下Window_Selectable,
这个东西的用途就是在选择项超过一页的时候,点击窗口外面自动往下滚动。看懂的也可以把点击范围限制在窗口的下/上方某个区域……甚至自制选项条……

原鼠标脚本出现那个BUG的原因是没有更改Window_Selectable的update里边控制选项滚动的部分,这样鼠标的移动到窗口最下边的时候,程序发现已经可以翻页了,就往下移动了光标。如果是键盘操作那么光标会停下来,然而鼠标判断index是用屏幕位置来判断的……也就是说,这个时候鼠标指着的index已经又往下移动了。于是程序又要命令光标往下移动……这个过程会一直反复,直到鼠标指向最后一页为止。

这个修改其实只是把判断滚动的东西移动到了update里- -,鼠标不在选项窗口内的时候点左键才能滚动,是向哪个方向滚动取决于鼠标的Y坐标是在窗口的上半部分还是下半部分……
本来想过其他修改方法,例如飞鱼在5楼说的加两个按键的方法=v=+不过这个好象是最省事的……MS冲突性也不高-v-+就这样了……

另外用了这个键盘就不能控制窗口滚动了~不过……有了鼠标还何必用键盘呢(被PIA……)

要用的可以直接替换鼠标脚本的相应位置……也就是class Window_Selectable那段~


  1. class Window_Selectable
  2.   if @self_alias == nil
  3.     alias self_update update
  4.     @self_alias = true
  5.   end
  6.   def update
  7.     #self.cursor_rect.empty
  8.     self_update
  9.     if self.active and @item_max > 0
  10.       index_var = @index
  11.       tp_index = @index
  12.       mouse_x, mouse_y = Mouse.get_mouse_pos
  13.       mouse_not_in_rect = true
  14.       for i in 0...@item_max
  15.         @index = i
  16.         update_cursor_rect
  17.         top_x = self.cursor_rect.x + self.x + 16
  18.         top_y = self.cursor_rect.y + self.y + 16
  19.         bottom_x = top_x + self.cursor_rect.width
  20.         bottom_y = top_y + self.cursor_rect.height
  21.         if (mouse_x > top_x) and (mouse_y > top_y) and
  22.            (mouse_x < bottom_x) and (mouse_y < bottom_y)
  23.           mouse_not_in_rect = false
  24.           if tp_index != @index
  25.             tp_index = @index
  26.             $game_system.se_play($data_system.cursor_se)
  27.           end
  28.           break
  29.         end
  30.       end
  31.       if mouse_not_in_rect
  32.         #  row = @index / @column_max
  33.           # 当前行被显示开头行前面的情况下
  34.           if self.top_row < row_max-page_row_max and Mouse.press?(Mouse::LEFT) and mouse_y>self.y+self.height/2
  35.             self.top_row +=1
  36.           end
  37.           # 当前行被显示末尾行之后的情况下
  38.           if self.top_row > 0 and Mouse.press?(Mouse::LEFT) and mouse_y<=self.y+self.height/2#self.top_row + (self.page_row_max - 1)
  39.             # 从当前行向末尾滚动
  40.             self.top_row -=1
  41.           end
  42.         @index = index_var
  43.         if self.is_a?(Window_Target)
  44.           @index=-3
  45.         end
  46.         update_cursor_rect
  47.         Mouse.click_lock
  48.       else
  49.         Mouse.click_unlock               
  50.       end
  51.     end
  52.   end
  53.   def update_cursor_rect
  54.     # 光标位置不满 0 的情况下
  55.     if @index < 0
  56.       self.cursor_rect.empty
  57.       return
  58.     end
  59.     # 获取当前的行
  60.     row = @index / @column_max
  61.     # 当前行被显示开头行前面的情况下
  62.     if row < self.top_row
  63.       # 从当前行向开头行滚动
  64.       self.cursor_rect.empty
  65.       return
  66.     end
  67.     # 当前行被显示末尾行之后的情况下
  68.     if row > self.top_row + (self.page_row_max - 1)
  69.       # 从当前行向末尾滚动
  70.       self.cursor_rect.empty
  71.       return
  72.     end
  73.     # 计算光标的宽
  74.     cursor_width = self.width / @column_max - 32
  75.     # 计算光标坐标
  76.     x = @index % @column_max * (cursor_width + 32)
  77.     y = @index / @column_max * 32 - self.oy
  78.     # 更新光标矩形
  79.     self.cursor_rect.set(x, y, cursor_width, 32)
  80.   end
  81. end
复制代码

作者: Eclair    时间: 2008-2-19 21:55
提示: 作者被禁止或删除 内容自动屏蔽
作者: 吟香    时间: 2008-2-19 22:02
提示: 作者被禁止或删除 内容自动屏蔽
作者: 水迭澜    时间: 2008-2-20 00:33
问题是不是每个鼠标都有滚轮=v=+
不过这东西只是随手写的,做个参考而已……
作者: 幻の飞鱼    时间: 2008-2-20 00:43
这个……其实很早就有人问过,尝试解决过,不是很完美……因为增加了两个按扭=。=
LZ很强大
作者: Thomas    时间: 2008-2-20 00:57
提示: 作者被禁止或删除 内容自动屏蔽
作者: 水迭澜    时间: 2008-3-5 09:57
默默地顶上来一下。。。木有人处理这帖灭?
作者: 沉影不器    时间: 2008-3-5 18:11
提示: 作者被禁止或删除 内容自动屏蔽
作者: 水迭澜    时间: 2008-3-5 21:39
望LS,差不多吧。
然后用一个sprite放在鼠标的位置来伪它= =bbb
然后就是在window_selectable里判断它是否在选项那里~
作者: 火鸡三毛老大    时间: 2008-3-14 04:40
最好是可以选择鼠标和键盘...选择时键盘鼠标双使用...选择后支持单个....防止玩家没有键盘或鼠标..{/cy}
作者: q2571875    时间: 2008-3-15 00:59
看看,试试。
作者: 趙雲    时间: 2008-3-15 02:15
啊,如果早看到这个帖子的话……
不过貌似水的脚本不够完善呢,这是偶超级繁琐的版本,用偶的VX版临时改的
,不过没有键盘问题,鼠标点击窗口上下方的箭头翻页。
以下覆盖鼠标脚本中 class Window_Selectable部分

  1. class Window_Selectable
  2.   
  3. if @self_alias == nil
  4.    alias self_update update
  5.    @self_alias = true
  6. end
  7. def update
  8.    self_update
  9.    
  10.    if self.active and @item_max > 0
  11.      index_var = @index
  12.      tp_index = @index
  13.      mouse_x, mouse_y = Mouse.get_mouse_pos
  14.      mouse_not_in_rect = true
  15.      for i in (top_row * @column_max)...[@item_max ,top_row * @column_max + page_item_max].min
  16.        @index = i
  17.        update_cursor_rect
  18.        top_x = self.cursor_rect.x + self.x + 16
  19.        top_y = self.cursor_rect.y + self.y + 16
  20.        bottom_x = top_x + self.cursor_rect.width
  21.        bottom_y = top_y + self.cursor_rect.height
  22.        if (mouse_x > top_x) and (mouse_y > top_y) and
  23.           (mouse_x < bottom_x) and (mouse_y < bottom_y)
  24.          mouse_not_in_rect = false
  25.          if tp_index != @index
  26.            tp_index = @index
  27.            $game_system.se_play($data_system.cursor_se)
  28.          end
  29.          break
  30.        end
  31.      end
  32.      if mouse_not_in_rect
  33.        @index = index_var
  34.        update_cursor_rect
  35.        Mouse.click_lock
  36.        if  Mouse.kk_trigger?(Mouse::LEFT)
  37.           x1 = self.x + self.contents.width / 2 + 8
  38.           y1 = self.y + self.contents.height - 16
  39.           y2 = self.y - 4
  40.           rect_down = Rect.new(x1,y1,24,24)
  41.           rect_up = Rect.new(x1,y2,24,24)
  42.           #p Mouse.get_mouse_pos , rect_down
  43.           if Mouse.in?(rect_down)
  44.             if self.top_row + (self.page_row_max - 1) < (self.row_max - 1)
  45.               # 光标向后移动一页
  46.               $game_system.se_play($data_system.cursor_se)
  47.               @index = [@index + self.page_item_max, @item_max - 1].min
  48.               self.top_row += self.page_row_max
  49.             end
  50.           end
  51.           if Mouse.in?(rect_up)
  52.             if self.top_row > 0
  53.               # 光标向前移动一页
  54.               $game_system.se_play($data_system.cursor_se)
  55.               @index = [@index - self.page_item_max, 0].max
  56.               self.top_row -= self.page_row_max
  57.             end
  58.           end
  59.         end      
  60.      else
  61.        Mouse.click_unlock               
  62.      end
  63.    end
  64. end
  65. end
复制代码


以下放进Mouse 类 def self.press?(mouse_code) 之上
  1. def self.kk_trigger?(mouse_code)
  2.    if mouse_code == LEFT
  3.        return @left_trigger
  4.    elsif mouse_code == RIGHT
  5.      return @right_trigger
  6.    else
  7.      return false
  8.    end
  9. end

  10. def self.in?(rect)
  11.   mouse_x, mouse_y = Mouse.get_mouse_pos
  12.   return (mouse_x > rect.x and mouse_x < rect.x + rect.width and mouse_y > rect.y and mouse_y < rect.y + rect.height)
  13. end
复制代码

作者: 水迭澜    时间: 2008-3-15 02:41
哦……主要是那个箭头太小了,我觉得点起来很麻烦= =bbb
很久没动过那个脚本了……OTZ
作者: 趙雲    时间: 2008-3-15 02:43
点击范围扩大成24*24了,个人感觉手感还行。{/wx}
作者: 水迭澜    时间: 2008-3-16 08:16
哈阿?
标签不是改了灭?
作者: 幻の飞鱼    时间: 2008-3-16 19:16
印象中有一个传说中支持滚轮的鼠标
把翻页用滚轮应该粉无敌的
作者: enghao_lim    时间: 2008-3-20 07:13
以下引用幻の飞鱼于2008-3-16 11:16:22的发言:
印象中有一个传说中支持滚轮的鼠标
把翻页用滚轮应该粉无敌的

这个我曾经有一个,不过在删除RM的时候一起被清掉了,唯一还记得的是那好像是在一个日语网站翻出来的。
作者: 粉红梦    时间: 2008-3-23 20:40
提示: 作者被禁止或删除 内容自动屏蔽
作者: 电眼娃娃∮轩    时间: 2008-5-18 16:59
- -?哪个脚本具体插入到哪个位置哦
作者: 风雪优游    时间: 2009-6-12 08:00
发布完毕,+2VIP
http://rpg.blue/web/htm/news1021.htm
请LZ自行修改标签!!!
作者: 一醉倾城    时间: 2009-7-30 01:26
这个……其实很早就有人问过,尝试解决过,不是很完美……因为增加了两个按扭=。=
LZ很强大
幻の飞鱼 发表于 2008-2-20 00:43



这位兄弟说的貌似就是我勒呵呵,好东西啊,想当初我写仙4菜单的时候遇到的这个问题迟迟无法解决,就用了一个取巧的办法,现在我的菜单应该可以完善了,lZ果然强悍,这个东西真不错,恩,深入研究下吧,呵呵。




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