Project1

标题: 使用脚本变量解决鼠标与键盘抢光标的效果 [打印本页]

作者: 果冻叮当猫    时间: 2008-9-23 16:54
标题: 使用脚本变量解决鼠标与键盘抢光标的效果
最近正在筹备制作一个带有鼠标的游戏!发现每个鼠标脚本都会跟键盘抢光标,就算鼠标不移动的时候也是如此!所以本人现在找了个鼠标脚本来开刀!修改后脚本大概如下!

首先是定义一个变量判断鼠标是否是移动中状态

#鼠标是否移动
$mouse_move


然后判断鼠标是否是静止状态(这里要借助鼠标无动作淡出的脚本)

  if @mouse_sprite != nil
     if @old_x != @mouse_sprite.x or @old_y != @mouse_sprite.y or
       Mouse.press?(Mouse::LEFT) or
       Mouse.press?(Mouse::RIGHT)
       @waittime = 80
       @mouse_sprite.opacity = 255
       ###########
       $mouse_move = true
       ###########

     end
     @waittime -= 1 if @waittime != 0
     @mouse_sprite.opacity -= 8 if @waittime == 0 and @mouse_sprite.opacity > 0
     @old_x = @mouse_sprite.x
     @old_y = @mouse_sprite.y
      ###########
      if @mouse_sprite.opacity < 100 or @waittime < 40   #这里是用透明度或者等待时间来判断鼠标是否正在使用中
        $mouse_move = false
      end
      ###########
  end

最后将所有有 update_cursor_rect和 mouse_not_in_rect 的脚本后面都加个判断,鼠标不移动就不刷新,其中 tp_index = @index 是将光标赋值到鼠标,也就是鼠标抢光标的罪魁祸首- -,可是这条语句又不能完全不用!所以也在后面加个判断就OK!不然鼠标就不是抢当前光标了!而是抢当前以外的光标!那就更郁闷了!- -


class Window_Selectable
if @self_alias == nil
   alias self_update update
   @self_alias = true
end
def update
   self_update
   if self.active and @item_max > 0
     index_var = @index
     tp_index = @index
     mouse_x, mouse_y = Mouse.get_mouse_pos
     mouse_not_in_rect = true
     for i in 0...@item_max
       @index = i
       update_cursor_rect if $mouse_move#####
       top_x = self.cursor_rect.x + self.x + 16
       top_y = self.cursor_rect.y + self.y + 16
       bottom_x = top_x + self.cursor_rect.width
       bottom_y = top_y + self.cursor_rect.height
       if (mouse_x > top_x) and (mouse_y > top_y) and
          (mouse_x < bottom_x) and (mouse_y < bottom_y)
         mouse_not_in_rect = false if $mouse_move#####
         if tp_index != @index
           tp_index = @index if $mouse_move#####
           $game_system.se_play($data_system.cursor_se)
         end
         break
       end
     end
     if mouse_not_in_rect
       @index = index_var
       update_cursor_rect if $mouse_move#####
       Mouse.click_lock
     else
       Mouse.click_unlock               
     end
   end
end
end
class Window_NameInput
if @self_alias == nil
   alias self_update update
   @self_alias = true
end
def update
   self_update
   if self.active
     index_var = @index
     mouse_x, mouse_y = Mouse.get_mouse_pos
     mouse_not_in_rect = true
     for i in (0...CHARACTER_TABLE.size).to_a.push(180)
       @index = i
       update_cursor_rect if $mouse_move#####
       top_x = self.cursor_rect.x + self.x + 16
       top_y = self.cursor_rect.y + self.y + 16
       bottom_x = top_x + self.cursor_rect.width
       bottom_y = top_y + self.cursor_rect.height
       if (mouse_x > top_x) and (mouse_y > top_y) and
          (mouse_x < bottom_x) and (mouse_y < bottom_y)
         mouse_not_in_rect = false if $mouse_move#####
         break
       end
     end
     if mouse_not_in_rect
       @index = index_var
       update_cursor_rect if $mouse_move#####
       Mouse.click_lock
     else
       Mouse.click_unlock
     end
   end
end
end
class Window_InputNumber
if @self_alias == nil
   alias self_update update
   @self_alias = true
end
def update
   self_update
   mouse_x, mouse_y = Mouse.get_mouse_pos
   if self.active and @digits_max > 0
     index_var = @index
     mouse_not_in_rect = true
     for i in 0...@digits_max
       @index = i
       update_cursor_rect if $mouse_move#####
       top_x = self.cursor_rect.x + self.x + 16
       bottom_x = top_x + self.cursor_rect.width
       if (mouse_x > top_x) and (mouse_x < bottom_x)
         mouse_not_in_rect = false if $mouse_move#####
         break
       end
     end
     if mouse_not_in_rect
       @index = index_var
       update_cursor_rect if $mouse_move#####
       Mouse.click_lock
     else
       Mouse.click_unlock
     end
   end
   if @last_mouse_y == nil
     @last_mouse_y = mouse_y
   end
   check_pos = (@last_mouse_y - mouse_y).abs
   if check_pos > 10
     $game_system.se_play($data_system.cursor_se)
     place = 10 ** (@digits_max - 1 - @index)
     n = @number / place % 10
     @number -= n * place
     n = (n + 1) % 10 if mouse_y < @last_mouse_y
     n = (n + 9) % 10 if mouse_y > @last_mouse_y
     @number += n * place
     refresh
     @last_mouse_y = mouse_y
   end
end
end

然后就OK了!所有的修改大致如此!以下是脚本(本人借用了鼠标无动作淡出来开刀的,大致上不会出现BUG或冲突)

下载地址(范例工程就不用了,反正只有一处脚本,直接插入Main之前就行)
http://rpg.blue/upload_program/g ... ��标_102588784.txt
作者: 果冻叮当猫    时间: 2008-9-23 16:57
{/gg}发错区了!应该是RMXP的才对!请版主帮忙转移一下!谢谢!
作者: drgdrg    时间: 2008-9-23 17:33
支持下……


很期待LZ签名中的游戏{/hx},嗯嗯
作者: 雪流星    时间: 2008-9-23 18:54
以下引用果冻叮当猫于2008-9-23 8:57:05的发言:
发错区了!应该是RMXP的才对!请版主帮忙转移一下!谢谢!

转移完毕
作者: 浩气青天    时间: 2008-9-23 19:00
很好,期待了很久的啊!
作者: doranikofu    时间: 2008-9-23 21:19
貌似不错 曾经想做鼠标嫌麻烦{/gg}
作者: wingcyx    时间: 2008-9-24 04:48
效果不错!还可以!不过在鼠标没用的时候键盘按键移动到鼠标的位置(鼠标隐藏)还是有小小的延时!不过问题还不大!至少不用牺牲FPS值!
作者: 果冻叮当猫    时间: 2008-9-25 04:46
暂时没发现什么大错误!还算过得去
作者: 果冻叮当猫    时间: 2008-9-25 04:54
发现一个问题!鼠标停留在光标位置不动后使用键盘移动到改鼠标位置有奇怪的连续响声!
解决办法:

         if tp_index != @index and $mouse_move#####
           tp_index = @index #if $mouse_move#####
           $game_system.se_play($data_system.cursor_se)
         end

找到下列脚本改成这样就可以了!
毕竟是简单的问题就不做解释了哈!{/kuk}
作者: 果冻叮当猫    时间: 2008-9-29 06:23
用了很久了!完全找不到有什么BUG!请大家帮忙找一下哈!
作者: 果冻叮当猫    时间: 2008-10-3 05:54
{/pz}为什么没人来支持我?难道鼠标就没什么人在游戏中用的吗?
作者: 精灵使者    时间: 2008-11-17 23:22
其实这个脚本很实用,但是现在技术区一直都是很冷的区。
作者: 水晶凌    时间: 2008-11-17 23:27
提示: 作者被禁止或删除 内容自动屏蔽
作者: 果冻叮当猫    时间: 2008-11-18 00:19
以下引用精灵使者于2008-11-17 15:22:19的发言:

其实这个脚本很实用,但是现在技术区一直都是很冷的区。


= =!呜呜呜!为什么我一直是处于被埋没的状态!大受打击!
作者: featherwoo    时间: 2009-4-9 09:57
提示: 作者被禁止或删除 内容自动屏蔽
作者: waya    时间: 2009-9-16 14:38
支持一下




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