Project1

标题: [又撞了]动态光标移动 [打印本页]

作者: 沙漠点灰    时间: 2011-4-24 15:55
标题: [又撞了]动态光标移动
本帖最后由 沙漠点灰 于 2011-4-24 15:57 编辑

写完之后,发现有人发过了(又撞上了),反正没什么技术含量,就没署名地扔了上来
  1. #==============================================================================
  2. # ■ Rect
  3. #------------------------------------------------------------------------------
  4. #  矩形类
  5. #==============================================================================
  6. # 移动帧数,自己改
  7. Cursor_Rect_Move = 10
  8. class Rect
  9.   # 设置
  10.   alias old_set set unless Rect.method_defined? "old_set"
  11.   def set(x,y,w,h,de=false)
  12.     if @target_rect.is_a?(Rect)
  13.       return if @target_rect == Rect.new(x,y,w,h)
  14.     end
  15.     if de
  16.       @cursor_rect_move = Cursor_Rect_Move
  17.       @target_rect = Rect.new(x,y,w,h)
  18.     else
  19.       self.old_set(x,y,w,h)
  20.     end
  21.   end
  22.   # 刷新
  23.   def update
  24.     return unless @target_rect and @cursor_rect_move
  25.     return if @cursor_rect_move <= 0
  26.     x = (@target_rect.x - self.x) / @cursor_rect_move
  27.     y = (@target_rect.y - self.y) / @cursor_rect_move
  28.     w = (@target_rect.width - self.width) / @cursor_rect_move
  29.     h = (@target_rect.height - self.height) / @cursor_rect_move
  30.     @cursor_rect_move -= 1
  31.     self.old_set(x+self.x,y+self.y,w+self.width,h+self.height)
  32.   end
  33. end
  34. #==============================================================================
  35. # ■ Window_Base
  36. #------------------------------------------------------------------------------
  37. #  游戏中全部窗口的超级类。
  38. #==============================================================================

  39. class Window_Base < Window
  40.   #--------------------------------------------------------------------------
  41.   # ● 刷新画面
  42.   #--------------------------------------------------------------------------
  43.   def update
  44.     super
  45.     self.cursor_rect.update
  46.     # 如果窗口的外关被变更了、再设置
  47.     if $game_system.windowskin_name != @windowskin_name
  48.       @windowskin_name = $game_system.windowskin_name
  49.       self.windowskin = RPG::Cache.windowskin(@windowskin_name)
  50.     end
  51.   end
  52. end
  53. #==============================================================================
  54. # ■ Window_Selectable
  55. #------------------------------------------------------------------------------
  56. #  拥有光标的移动以及滚动功能的窗口类。
  57. #==============================================================================

  58. class Window_Selectable < Window_Base
  59.   #--------------------------------------------------------------------------
  60.   # ● 更新光标举行
  61.   #--------------------------------------------------------------------------
  62.   def update_cursor_rect
  63.     # 光标位置不满 0 的情况下
  64.     if @index < 0
  65.       self.cursor_rect.empty
  66.       return
  67.     end
  68.     # 获取当前的行
  69.     row = @index / @column_max
  70.     # 当前行被显示开头行前面的情况下
  71.     if row < self.top_row
  72.       # 从当前行向开头行滚动
  73.       self.top_row = row
  74.     end
  75.     # 当前行被显示末尾行之后的情况下
  76.     if row > self.top_row + (self.page_row_max - 1)
  77.       # 从当前行向末尾滚动
  78.       self.top_row = row - (self.page_row_max - 1)
  79.     end
  80.     # 计算光标的宽
  81.     cursor_width = self.width / @column_max - 32
  82.     # 计算光标坐标
  83.     x = @index % @column_max * (cursor_width + 32)
  84.     y = @index / @column_max * 32 - self.oy
  85.     # 更新国标矩形
  86.     self.cursor_rect.set(x, y, cursor_width, 32,true)
  87.   end
  88. end
  89. #==============================================================================
  90. # ■ Window_Message
  91. #------------------------------------------------------------------------------
  92. #  显示文章的信息窗口。
  93. #==============================================================================

  94. class Window_Message < Window_Selectable

  95.   #--------------------------------------------------------------------------
  96.   # ● 刷新光标矩形
  97.   #--------------------------------------------------------------------------
  98.   def update_cursor_rect
  99.     if @index >= 0
  100.       n = $game_temp.choice_start + @index
  101.       self.cursor_rect.set(8, n * 32, @cursor_width, 32,true)
  102.     else
  103.       self.cursor_rect.empty
  104.     end
  105.   end
  106. end
复制代码
脚本开头的
Cursor_Rect_Move = 10
自己可以改,这个就是要多少帧移动到目的地。
不过一定请注意下面的事情——
最后的
  1. class Window_Message < Window_Selectable

  2.   #--------------------------------------------------------------------------
  3.   # ● 刷新光标矩形
  4.   #--------------------------------------------------------------------------
  5.   def update_cursor_rect
  6.     if @index >= 0
  7.       n = $game_temp.choice_start + @index
  8.       self.cursor_rect.set(8, n * 32, @cursor_width, 32,true)
  9.     else
  10.       self.cursor_rect.empty
  11.     end
  12.   end
  13. end
复制代码
是事件中的选择项,如果您想使用本脚本,并且用了什么对话框加强的脚本而发生冲突的情况,可以:

1.直接删掉引用的那一段,不过对话框选择就没有动态的效果了

2.在对话框加强的脚本中搜索"self.cursor_rect.set(",找到之后把最后的 ")" 改为 ",true)"  即加一个参数"true"

另:本脚本适合所有拥有选择光标的窗口(因为直接修改Rect,很暴力....), 以上脚本插在Main前

作者: summer92    时间: 2011-4-24 17:32
就是替换原来的Rect 光标是吧,图片光标才是主流啊,研究研究
作者: 小传子    时间: 2011-4-25 20:31
赞!效果很好,于是疯狂的移动光标中= =顺便围观签名

作者: wzhjii0    时间: 2011-4-25 22:08
表示读档、存档没效果
作者: 薄荷冰水    时间: 2011-4-26 12:43
读档存档,菜单选择人物状态无效果。~~
效果挺好,但是感觉选择物品技能时,从右边移动到左下这点,感觉不是很美观,左右上下移动就很好,斜移动感觉没那么好看。

望修改。。。。。。。。(好吧,我又伸手了。)
作者: 不是马甲    时间: 2011-4-26 12:48
能告诉我有什么用吗?我看了半天,没看出什么东东出来
作者: summer92    时间: 2011-4-26 13:55
就是光标是移动的,而不是瞬间移动(七龙珠???)
作者: 沙漠点灰    时间: 2011-4-26 17:13
哦!原来很多类都有个set!
解决方法:全局搜索:      self.cursor_rect.set(
把最后的 “)" 改为 ",true)"  (不含引号)  即加一个参数 true
作者: 薄荷冰水    时间: 2011-4-26 23:00
我认为斜着的,应该先和刚调用的时候一样,先缩小,再到位置后再放大,而不是直接就那么大地移动过去。 可以么? - -
作者: 沙漠点灰    时间: 2011-4-27 18:17
针对斜着移动优化...:
  1. #==============================================================================
  2. # ■ Rect
  3. #------------------------------------------------------------------------------
  4. #  矩形类
  5. #==============================================================================
  6. # 移动帧数,自己改
  7. Cursor_Rect_Move = 10
  8. class Rect
  9.   # 设置
  10.   alias old_set set unless Rect.method_defined? "old_set"
  11.   def set(x,y,w,h,de=false)
  12.     if @target_rect.is_a?(Rect)
  13.       return if @target_rect == Rect.new(x,y,w,h) or @target_rect_i == Rect.new(x,y,w,h)
  14.     end
  15.     if de
  16.       if self.x != x and self.y != y
  17.         # 斜着
  18.         @inclined = true
  19.         @cursor_rect_move = Cursor_Rect_Move
  20.         @target_rect_i = Rect.new(x,y,w,h)
  21.         @target_rect = Rect.new(self.x,self.y,0,0)
  22.         
  23.       else
  24.         @inclined = false
  25.         # 横竖
  26.         @cursor_rect_move = Cursor_Rect_Move
  27.         @target_rect = Rect.new(x,y,w,h)
  28.       end
  29.     else
  30.       self.old_set(x,y,w,h)
  31.     end
  32.   end
  33.   # 刷新
  34.   def update
  35.     return unless @target_rect and @cursor_rect_move
  36.     @cursor_rect_move -= 1
  37.     if @cursor_rect_move <= 0 and @inclined
  38.       @cursor_rect_move = Cursor_Rect_Move
  39.       @target_rect = @target_rect_i.dup
  40.       @target_rect_i = nil
  41.       return @inclined = false
  42.     end
  43.     return if @cursor_rect_move <= 0
  44.     x = (@target_rect.x - self.x) / @cursor_rect_move
  45.     y = (@target_rect.y - self.y) / @cursor_rect_move
  46.     w = (@target_rect.width - self.width) / @cursor_rect_move
  47.     h = (@target_rect.height - self.height) / @cursor_rect_move
  48.     self.old_set(x+self.x,y+self.y,w+self.width,h+self.height)
  49.   end
  50. end
  51. #==============================================================================
  52. # ■ Window_Base
  53. #------------------------------------------------------------------------------
  54. #  游戏中全部窗口的超级类。
  55. #==============================================================================

  56. class Window_Base < Window
  57.   #--------------------------------------------------------------------------
  58.   # ● 刷新画面
  59.   #--------------------------------------------------------------------------
  60.   def update
  61.     super
  62.     self.cursor_rect.update
  63.     # 如果窗口的外关被变更了、再设置
  64.     if $game_system.windowskin_name != @windowskin_name
  65.       @windowskin_name = $game_system.windowskin_name
  66.       self.windowskin = RPG::Cache.windowskin(@windowskin_name)
  67.     end
  68.   end
  69. end
  70. #==============================================================================
  71. # ■ Window_Selectable
  72. #------------------------------------------------------------------------------
  73. #  拥有光标的移动以及滚动功能的窗口类。
  74. #==============================================================================

  75. class Window_Selectable < Window_Base
  76.   #--------------------------------------------------------------------------
  77.   # ● 更新光标举行
  78.   #--------------------------------------------------------------------------
  79.   def update_cursor_rect
  80.     # 光标位置不满 0 的情况下
  81.     if @index < 0
  82.       self.cursor_rect.empty
  83.       return
  84.     end
  85.     # 获取当前的行
  86.     row = @index / @column_max
  87.     # 当前行被显示开头行前面的情况下
  88.     if row < self.top_row
  89.       # 从当前行向开头行滚动
  90.       self.top_row = row
  91.     end
  92.     # 当前行被显示末尾行之后的情况下
  93.     if row > self.top_row + (self.page_row_max - 1)
  94.       # 从当前行向末尾滚动
  95.       self.top_row = row - (self.page_row_max - 1)
  96.     end
  97.     # 计算光标的宽
  98.     cursor_width = self.width / @column_max - 32
  99.     # 计算光标坐标
  100.     x = @index % @column_max * (cursor_width + 32)
  101.     y = @index / @column_max * 32 - self.oy
  102.     # 更新国标矩形
  103.     self.cursor_rect.set(x, y, cursor_width, 32,true)
  104.   end
  105. end
  106. #==============================================================================
  107. # ■ Window_Message
  108. #------------------------------------------------------------------------------
  109. #  显示文章的信息窗口。
  110. #==============================================================================

  111. class Window_Message < Window_Selectable

  112.   #--------------------------------------------------------------------------
  113.   # ● 刷新光标矩形
  114.   #--------------------------------------------------------------------------
  115.   def update_cursor_rect
  116.     if @index >= 0
  117.       n = $game_temp.choice_start + @index
  118.       self.cursor_rect.set(8, n * 32, @cursor_width, 32,true)
  119.     else
  120.       self.cursor_rect.empty
  121.     end
  122.   end
  123. end
复制代码
另:
全局搜索:      self.cursor_rect.set(
把最后的 “)" 改为 ",true)"  (不含引号)  即加一个参数 true
已经是 ",true)" 的不用修改
作者: 薄荷冰水    时间: 2011-4-29 17:46
好象好有喜感啊- -。。。。。哈哈哈哈。。




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