Project1

标题: 鼠标指着主角就改变鼠标的icon,帮一下忙,感激不尽啊 [打印本页]

作者: slient叶枫    时间: 2013-1-28 18:30
标题: 鼠标指着主角就改变鼠标的icon,帮一下忙,感激不尽啊
本帖最后由 slient叶枫 于 2013-1-30 15:38 编辑

RT,求解。感激不尽@fux2   QQ826404407
  所用鼠标用脚本: 顺便提一下,该鼠标脚本里注释为"npc“时改变鼠标图标这个功能会卡死。顺带求解,@fux2(原谅俺....)
RUBY 代码复制
  1. #原来的鼠标四方向寻路来自66RPG,八方向由顾家枫修改。使用请带上作者信息。谢谢。
  2.  
  3. class Game_Event
  4.   attr_accessor :flag
  5. end
  6.  
  7. #==============================================================================
  8. # ■ Game_Map
  9. #------------------------------------------------------------------------------
  10. #  处理地图的类。包含卷动以及可以通行的判断功能。
  11. # 本类的实例请参考 $game_map 。
  12. #==============================================================================
  13.  
  14. class Game_Map
  15.   def check_event_custom(x, y)
  16.     for event in $game_map.events.values
  17.       if event.screen_x/32 == x and event.screen_y/32-1 == y
  18.         for i in 0...event.list.size
  19.           if event.list[i].parameters[0] == "enemy"
  20.             event.flag = 1
  21.           elsif event.list[i].parameters[0] == "npc"
  22.             event.flag = 2
  23.           elsif event.list[i].parameters[0] == "chest"
  24.             event.flag = 3
  25.           else
  26.             event.flag = 0
  27.           end
  28.           return event.flag
  29.         end
  30.       end
  31.     end
  32.   end
  33. end#==============================================================================
  34. # 本脚本来自[url=www.66rpg.com]www.66rpg.com[/url],源自geocities.jp,转载和使用请注明此内容
  35. #
  36. # 初始鼠标图案在35行和64行改,变换的鼠标图案在62行改
  37. # 这个脚本的思路是判断鼠标所在位置是否有事件,所以响应的情况只有一种。
  38. # 如果想有多种响应的话,思路复杂,比如拆分事件名称等,做出来的东西将繁琐。
  39. #                                                           —— JesseKiss
  40. #==============================================================================
  41. #=================以下两个用来调整战斗时的手感问题,可以自己试试。
  42. $敌人选框扩大 = 20
  43. $角色选框扩大 = 30
  44. #==============================================================================
  45. # API调用
  46. #==============================================================================
  47. $ShowCursor = Win32API.new("user32", "ShowCursor", 'i', 'l')
  48. $GetCursorPos = Win32API.new("user32", "GetCursorPos", 'p', 'i')
  49. $ScreenToClient = Win32API.new("user32", "ScreenToClient", 'ip', 'i')
  50. $GetActiveWindow = Win32API.new("user32", "GetActiveWindow", nil, 'l')
  51. $Window_HWND = $GetActiveWindow.call
  52. $GetKeyState = Win32API.new("user32", "GetKeyState", 'i', 'i')
  53. $FindWindow = Win32API.new("user32", "FindWindow", 'pp', 'i')
  54. $Mou = false
  55. #$HookStart  = Win32API.new("mouse_hook.dll", "HookStart", 'i', nil)
  56. #$HookEnd  = Win32API.new("mouse_hook.dll", "HookEnd", nil, nil)
  57. #$GetMouseStatus  = Win32API.new("mouse_hook.dll", "GetMouseStatus", 'i', 'i')
  58. #$Window_HWND = $FindWindow.call(nil, 'mousetry')
  59. module Mouse  
  60.   LEFT = 0x01
  61.   RIGHT = 0x02
  62.   def self.init(sprite = nil)
  63.     $ShowCursor.call(0)
  64.  
  65.     @show_cursor = false
  66.  
  67.     @mouse_sprite = Sprite.new
  68.     @mouse_sprite.z = 99999
  69.     @mouse_sprite.bitmap = Bitmap.new('Graphics/Icons/33-01.png')
  70.     #@mouse_sprite.bitmap.fill_rect(Rect.new(0, 0, 32, 32), Color.new(0, 0, 0))
  71.  
  72.     @left_press = false
  73.     @right_press = false
  74.     @left_trigger = false
  75.     @right_trigger = false
  76.     @left_repeat = false
  77.     @right_repeat = false
  78.     @click_lock = false
  79.     if @a == nil
  80.       @a = true
  81.       @total_sec = Graphics.frame_count * 3 / Graphics.frame_rate
  82.     end
  83.     update
  84.   end
  85.   def self.exit
  86.     @mouse_sprite.bitmap.dispose
  87.     @mouse_sprite.dispose
  88.     @show_cursor = true
  89. #    $HookEnd.call
  90.     $ShowCursor.call(1)
  91.   end
  92.   def self.mouse_debug
  93.     return @mouse_debug.bitmap
  94.   end
  95.   def self.refresh
  96.   end
  97.   def self.update
  98.     left_down = $GetKeyState.call(0x01)
  99.     right_down = $GetKeyState.call(0x02)
  100.     if Graphics.frame_count * 3 / Graphics.frame_rate != @total_sec
  101.       @total_sec = Graphics.frame_count * 3 / Graphics.frame_rate
  102.       @a = !@a
  103.     end
  104.   case $pop
  105.     when 3
  106.       if @a
  107.         @mouse_sprite.bitmap = Bitmap.new('Graphics/Icons/3.png')
  108.       else
  109.         @mouse_sprite.bitmap = Bitmap.new('Graphics/Icons/33.png')
  110.       end
  111.     else
  112.       @mouse_sprite.bitmap = Bitmap.new('Graphics/Icons/33-01.png')
  113.     end
  114.     @click_lock = false
  115.     mouse_x, mouse_y = self.get_mouse_pos
  116.     if @mouse_sprite != nil
  117.       @mouse_sprite.x = mouse_x
  118.       @mouse_sprite.y = mouse_y
  119.     end
  120.     if left_down[7] == 1
  121.       @left_repeat = (not @left_repeat)
  122.       @left_trigger = (not @left_press)
  123.       @left_press = true
  124.     else
  125.       @left_press = false
  126.       @left_trigger = false
  127.       @left_repeat = false
  128.     end
  129.     if right_down[7] == 1
  130.       @right_repeat = (not @right_repeat)
  131.       @right_trigger = (not @right_press)
  132.       @right_press = true
  133.     else
  134.       @right_press = false
  135.       @right_trigger = false
  136.       @right_repeat = false
  137.     end
  138.   end
  139.   def self.get_mouse_pos
  140.     point_var = [0, 0].pack('ll')
  141.     if $GetCursorPos.call(point_var) != 0
  142.       if $ScreenToClient.call($Window_HWND, point_var) != 0
  143.         x, y = point_var.unpack('ll')
  144.         if (x < 0) or (x > 10000) then x = 0 end
  145.         if (y < 0) or (y > 10000) then y = 0 end
  146.         if x > 640 then x = 640 end
  147.         if y > 480 then y = 480 end
  148.         return x, y
  149.       else
  150.         return 0, 0
  151.       end
  152.     else
  153.       return 0, 0
  154.     end
  155.   end
  156.   def self.press?(mouse_code)
  157.     if mouse_code == LEFT
  158.       if @click_lock
  159.         return false
  160.       else
  161.         return @left_press
  162.       end
  163.     elsif mouse_code == RIGHT
  164.       return @right_press
  165.     else
  166.       return false
  167.     end
  168.   end
  169.   def self.trigger?(mouse_code)
  170.     if mouse_code == LEFT
  171.       if @click_lock
  172.         return false
  173.       else
  174.         return @left_trigger
  175.       end
  176.     elsif mouse_code == RIGHT
  177.       return @right_trigger
  178.     else
  179.       return false
  180.     end
  181.   end
  182.   def self.repeat?(mouse_code)
  183.     if mouse_code == LEFT
  184.       if @click_lock
  185.         return false
  186.       else
  187.         return @left_repeat
  188.       end
  189.     elsif mouse_code == RIGHT
  190.       return @right_repeat
  191.     else
  192.       return false
  193.     end
  194.   end
  195.   def self.click_lock?
  196.     return @click_lock
  197.   end
  198.   def self.click_lock
  199.     @click_lock = true
  200.   end
  201.   def self.click_unlock
  202.     @click_lock = false
  203.   end
  204. end
  205. module Input
  206.   if @self_update == nil
  207.     @self_update = method('update')
  208.     @self_press = method('press?')
  209.     @self_trigger = method('trigger?')
  210.     @self_repeat = method('repeat?')
  211.   end
  212.   def self.update
  213.     @self_update.call
  214.     Mouse.update
  215.   end
  216.   def self.press?(key_code)
  217.     if @self_press.call(key_code)
  218.       return true
  219.     end
  220.     if key_code == C
  221.       return Mouse.press?(Mouse::LEFT)
  222.     #elsif key_code == B
  223.       #return Mouse.press?(Mouse::RIGHT)
  224.     else
  225.       return @self_press.call(key_code)
  226.     end
  227.   end
  228.   def self.trigger?(key_code)
  229.     if @self_trigger.call(key_code)
  230.       return true
  231.     end
  232.     if key_code == C
  233.       return Mouse.trigger?(Mouse::LEFT)
  234.     #elsif key_code == B
  235.       #return Mouse.trigger?(Mouse::RIGHT)
  236.     else
  237.       return @self_trigger.call(key_code)
  238.     end
  239.   end
  240.   def self.repeat?(key_code)
  241.     if @self_repeat.call(key_code)
  242.       return true
  243.     end
  244.     if key_code == C
  245.       return Mouse.repeat?(Mouse::LEFT)
  246.     #elsif key_code == B
  247.       #return Mouse.repeat?(Mouse::RIGHT)
  248.     else
  249.       return @self_repeat.call(key_code)
  250.     end
  251.   end
  252. end
  253. class Window_Selectable
  254.   if @self_alias == nil
  255.     alias self_update update
  256.     @self_alias = true
  257.   end
  258.   def update
  259.     #self.cursor_rect.empty
  260.     self_update
  261.     if self.active and @item_max > 0
  262.       index_var = @index
  263.       tp_index = @index
  264.       mouse_x, mouse_y = Mouse.get_mouse_pos
  265.       mouse_not_in_rect = true
  266.       for i in 0...@item_max
  267.         @index = i
  268.         update_cursor_rect
  269.         top_x = self.cursor_rect.x + self.x + 16
  270.         top_y = self.cursor_rect.y + self.y + 16
  271.         bottom_x = top_x + self.cursor_rect.width
  272.         bottom_y = top_y + self.cursor_rect.height
  273.         if (mouse_x > top_x) and (mouse_y > top_y) and
  274.            (mouse_x < bottom_x) and (mouse_y < bottom_y)
  275.           mouse_not_in_rect = false
  276.           if tp_index != @index
  277.             tp_index = @index
  278.             $game_system.se_play($data_system.cursor_se)
  279.           end
  280.           break
  281.         end
  282.       end
  283.       if mouse_not_in_rect
  284.         @index = index_var
  285.         update_cursor_rect
  286.         Mouse.click_lock
  287.       else
  288.         Mouse.click_unlock               
  289.       end
  290.     end
  291.   end
  292. end
  293. class Window_NameInput
  294.   if @self_alias == nil
  295.     alias self_update update
  296.     @self_alias = true
  297.   end
  298.   def update
  299.     #self.cursor_rect.empty
  300.     self_update
  301.     if self.active
  302.       index_var = @index
  303.       mouse_x, mouse_y = Mouse.get_mouse_pos
  304.       mouse_not_in_rect = true
  305.       for i in (0...CHARACTER_TABLE.size).to_a.push(180)
  306.         @index = i
  307.         update_cursor_rect
  308.         top_x = self.cursor_rect.x + self.x + 16
  309.         top_y = self.cursor_rect.y + self.y + 16
  310.         bottom_x = top_x + self.cursor_rect.width
  311.         bottom_y = top_y + self.cursor_rect.height
  312.         #
  313.         if (mouse_x > top_x) and (mouse_y > top_y) and
  314.            (mouse_x < bottom_x) and (mouse_y < bottom_y)
  315.           mouse_not_in_rect = false
  316.           break
  317.         end
  318.       end
  319.       if mouse_not_in_rect
  320.         @index = index_var
  321.         update_cursor_rect
  322.         Mouse.click_lock
  323.       else
  324.         Mouse.click_unlock
  325.       end
  326.     end
  327.   end
  328. end
  329. class Window_InputNumber
  330.   if @self_alias == nil
  331.     alias self_update update
  332.     @self_alias = true
  333.   end
  334.   def update
  335.     #self.cursor_rect.empty
  336.     self_update
  337.     mouse_x, mouse_y = Mouse.get_mouse_pos
  338.     if self.active and @digits_max > 0
  339.       index_var = @index
  340.       mouse_not_in_rect = true
  341.       for i in 0...@digits_max
  342.         @index = i
  343.         update_cursor_rect
  344.         top_x = self.cursor_rect.x + self.x + 16
  345.         bottom_x = top_x + self.cursor_rect.width
  346.         #
  347.         if (mouse_x > top_x) and (mouse_x < bottom_x)
  348.           mouse_not_in_rect = false
  349.           break
  350.         end
  351.       end
  352.       if mouse_not_in_rect
  353.         @index = index_var
  354.         update_cursor_rect
  355.         Mouse.click_lock
  356.       else
  357.         Mouse.click_unlock
  358.       end
  359.     end
  360.     if @last_mouse_y == nil
  361.       @last_mouse_y = mouse_y
  362.     end
  363.     check_pos = (@last_mouse_y - mouse_y).abs
  364.     if check_pos > 10
  365.       $game_system.se_play($data_system.cursor_se)
  366.       place = 10 ** (@digits_max - 1 - @index)
  367.       n = [url=home.php?mod=space&uid=27178]@Number[/url] / place % 10
  368.       [url=home.php?mod=space&uid=27178]@Number[/url] -= n * place
  369.       n = (n + 1) % 10 if mouse_y < @last_mouse_y
  370.       n = (n + 9) % 10 if mouse_y > @last_mouse_y
  371.       @number += n * place
  372.       refresh
  373.       @last_mouse_y = mouse_y
  374.     end
  375.   end
  376. end
  377. class Scene_File
  378.   if @self_alias == nil
  379.     alias self_update update
  380.     @self_alias = true
  381.   end
  382.   def update
  383.     mouse_x, mouse_y = Mouse.get_mouse_pos
  384.     Mouse.click_lock
  385.     idx = 0
  386.     for i in @savefile_windows
  387.       top_x = i.x + 16
  388.       top_y = i.y + 16
  389.       bottom_x = top_x + i.width
  390.       bottom_y = top_y + i.height
  391.       if (mouse_x > top_x) and (mouse_y > top_y) and
  392.          (mouse_x < bottom_x) and (mouse_y < bottom_y)
  393.         i.selected = true
  394.         if @file_index != idx
  395.           @file_index = idx
  396.           $game_system.se_play($data_system.cursor_se)
  397.         end            
  398.         Mouse.click_unlock
  399.       else
  400.         i.selected = false
  401.       end
  402.       idx += 1
  403.     end
  404.     self_update
  405.   end
  406. end
  407. class Arrow_Enemy
  408.   if @self_alias == nil
  409.     alias self_update update
  410.     @self_alias = true
  411.   end
  412.   def update
  413.     mouse_x, mouse_y = Mouse.get_mouse_pos
  414.     idx = 0
  415.     for i in $game_troop.enemies do
  416.       if i.exist?
  417.         top_x = i.screen_x - self.ox
  418.         top_y = i.screen_y - self.oy
  419.         bottom_x = top_x + self.src_rect.width
  420.         bottom_y = top_y + self.src_rect.height
  421.         if (mouse_x > top_x - $敌人选框扩大) and (mouse_y > top_y - $敌人选框扩大) and
  422.            (mouse_x < bottom_x + $敌人选框扩大) and (mouse_y < bottom_y + $敌人选框扩大)
  423.           if @index != idx
  424.             $game_system.se_play($data_system.cursor_se)
  425.             @index = idx
  426.           end
  427.         end
  428.       end
  429.       idx += 1
  430.     end
  431.     self_update
  432.   end
  433. end
  434. class Arrow_Actor
  435.   if @self_alias == nil
  436.     alias self_update update
  437.     @self_alias = true
  438.   end
  439.   def update
  440.     mouse_x, mouse_y = Mouse.get_mouse_pos
  441.     idx = 0
  442.     for i in $game_party.actors do
  443.       if i.exist?
  444.         top_x = i.screen_x - self.ox
  445.         top_y = i.screen_y - self.oy
  446.         bottom_x = top_x + self.src_rect.width
  447.         bottom_y = top_y + self.src_rect.height
  448.         if (mouse_x > top_x - $角色选框扩大) and (mouse_y > top_y - $角色选框扩大) and
  449.            (mouse_x < bottom_x + $角色选框扩大) and (mouse_y < bottom_y + $角色选框扩大)
  450.           if @index != idx
  451.             $game_system.se_play($data_system.cursor_se)
  452.             @index = idx
  453.           end
  454.         end
  455.       end
  456.       idx += 1
  457.     end
  458.     self_update
  459.   end
  460. end
  461. class Game_Player
  462.   if @self_alias == nil
  463.     alias self_update update
  464.     @self_alias = true
  465.   end
  466.   def update
  467.     mouse_x, mouse_y = Mouse.get_mouse_pos
  468.     unless $game_system.map_interpreter.running?
  469.       $pop = $game_map.check_event_custom(mouse_x/32,mouse_y/32)
  470.     else
  471.       $pop = 0
  472.     end
  473.     if @last_move_x == nil
  474.       @last_move_x = false
  475.     end
  476.     if Mouse.press?(Mouse::RIGHT)
  477.       last_moving = moving?
  478.       last_direction = @direction
  479.       unless moving? or $game_system.map_interpreter.running? or
  480.              @move_route_forcing or $game_temp.message_window_showing
  481.         last_x = @x
  482.         if @last_move_x
  483.           @last_move_x = false
  484.         elsif mouse_x > screen_x + 16
  485.           if mouse_y<screen_y-32
  486.             move_upper_right
  487.           elsif mouse_y>screen_y
  488.             move_lower_right
  489.             else
  490.           move_right
  491.           end
  492.         elsif mouse_x < screen_x - 16
  493.                     if mouse_y<screen_y-32
  494.             move_upper_left
  495.           elsif mouse_y>screen_y
  496.             move_lower_left
  497.             else
  498.           move_left
  499.           end
  500.         end
  501.         last_y = @y
  502.         if last_x != @x
  503.           @last_move_x = true
  504.         elsif mouse_y > screen_y
  505.                               if mouse_x<screen_x-16
  506.             move_lower_left
  507.           elsif mouse_x>screen_x+16
  508.             move_lower_right
  509.             else
  510.           move_down
  511.           end
  512.         elsif mouse_y < screen_y - 32
  513.                               if mouse_x<screen_x-16
  514.             move_upper_left
  515.           elsif mouse_x>screen_x+16
  516.             move_upper_right
  517.             else
  518.           move_up
  519.           end
  520.         end
  521.  
  522.           if last_y != @y
  523.           @last_move_x = false
  524.         elsif not @last_move_x
  525.           case last_direction
  526.           when 2
  527.             turn_down
  528.           when 4
  529.             turn_left
  530.           when 6
  531.             turn_right
  532.           when 8
  533.             turn_up
  534.           end
  535.         end
  536.       end
  537.     end
  538.     self_update
  539.   end
  540. end
  541. Mouse.init
  542. END { Mouse.exit }
  
作者: fux2    时间: 2013-1-28 18:33
判断鼠标坐标,setcursor,如果是用bitmap跟踪鼠标就改bitmap。
你的提问太抽象,在下无法详细回答,不知道你用的什么鼠标脚本,也不知道你的鼠标什么时候在刷新。
作者: slient叶枫    时间: 2013-1-28 19:02
fux2 发表于 2013-1-28 18:33
判断鼠标坐标,setcursor,如果是用bitmap跟踪鼠标就改bitmap。
你的提问太抽象,在下无法详细回答,不知道 ...

多谢,想听尊驾详细指导,QQ:826404407 感激不尽
作者: Chen。    时间: 2013-1-29 14:03
...........................................我的鼠标.....
作者: slient叶枫    时间: 2013-1-30 15:38
自顶,多谢各位了,各位大来解决一下,这个应该不算难吧...但俺不会...




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