设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 92|回复: 1
打印 上一主题 下一主题

[讨论] 适用于XP魔塔的鼠标寻路脚本

[复制链接]

Lv2.观梦者

梦石
0
星屑
345
在线时间
73 小时
注册时间
2018-4-25
帖子
6
跳转到指定楼层
1

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
修改自 芯☆淡茹水的鼠标寻路脚本:https://rpg.blue/thread-408715-1-1.html
·修改了存档左右键翻页的BUG
·修改了寻路距离和添加了绕过楼梯(不知道有没有用)
·修改成不到终点不触发事件,本来想修改寻路来解决,遗憾没有成功。可以防止点错导致的打怪、开门的行为。
·请把以下附件放至Graphics\Icons目录里(文件名:SCMouseIcon.png)


如有BUG欢迎指出。
RUBY 代码复制
  1. #==============================================================================
  2. # 〓 鼠标点击自寻路 〓      Integration: 芯☆淡茹水
  3. #==============================================================================
  4. #  鼠标脚本,来自 [url]www.66RPG.com[/url] , 未署名。
  5. #==============================================================================
  6. # GET事件的名字
  7. class Game_Event < Game_Character
  8.   def scname
  9.     @event.name
  10.   end
  11. end
  12. #==============================================================================
  13. class Game_Temp; attr_accessor :move_position; end
  14. #==============================================================================
  15. class Game_Map
  16.   #--------------------------------------------------------------------------
  17.   def distance(x1, y1, x2, y2)
  18.     return delta_x(x1, x2).abs + delta_y(y1, y2).abs
  19.   end
  20.   #--------------------------------------------------------------------------
  21.   def loop_horizontal?
  22.     return false
  23.   end
  24.   #--------------------------------------------------------------------------
  25.   def loop_vertical?
  26.     return false
  27.   end
  28.   #--------------------------------------------------------------------------
  29.   def delta_x(x1, x2)
  30.     result = x1 - x2
  31.     if loop_horizontal? && result.abs > width / 2
  32.       result += result < 0 ? width : -width
  33.     end
  34.     return result
  35.   end
  36.   #--------------------------------------------------------------------------
  37.   def delta_y(y1, y2)
  38.     result = y1 - y2
  39.     if loop_vertical? && result.abs > height / 2
  40.       result += result < 0 ? height : -height
  41.     end
  42.     return result
  43.   end
  44. end
  45. #==============================================================================
  46. class Game_Character
  47.   #--------------------------------------------------------------------------
  48.   alias xr_mv_initialize initialize
  49.   def initialize
  50.     xr_mv_initialize
  51.     @search_limit = 99
  52.   end
  53.   #--------------------------------------------------------------------------
  54.   def delta_x_from(x)
  55.     return $game_map.delta_x(@x, x)
  56.   end
  57.   #--------------------------------------------------------------------------
  58.   def delta_y_from(y)
  59.     return $game_map.delta_y(@y, y)
  60.   end
  61.   #--------------------------------------------------------------------------
  62.   def move_straight(direction)
  63.  
  64.     return if direction == 0
  65.     @direction = direction
  66.     passable?(@x, @y, direction) && move_forward
  67.   end
  68.   #--------------------------------------------------------------------------
  69.   # 判断是否有阻障
  70.   def is_block?(sc_x, sc_y, *sc_arg)
  71.     $game_map.events.each do |key, value|
  72.       if sc_x == value.x and sc_y == value.y and sc_arg.include?(value.scname)
  73.         return false
  74.       end
  75.     end
  76.     return true
  77.   end
  78.   #--------------------------------------------------------------------------
  79.   def find_direction(x, y)
  80.     return 0 if @x == x && @y == y
  81.     goal_x = x; goal_y = y
  82.     map_width = $game_map.width
  83.     node_list = []; open_list = []; closed_list = []
  84.     start = {}; best = start
  85.     start[:parent] = nil; start[:x] = @x; start[:y] = @y; start[:g] = 0
  86.     start[:xr] = $game_map.distance(start[:x], start[:y], goal_x, goal_y);
  87.     node_list.push(start)
  88.     open_list.push(start[:y] * map_width + start[:x])
  89.     while node_list.size > 0
  90.       best_index = 0
  91.       node_list.size.times do |i|
  92.         best_index = i if node_list[i][:xr] < node_list[best_index][:xr]
  93.       end
  94.       current = node_list[best_index]
  95.       x1 = current[:x]; y1 = current[:y]
  96.       pos1 = y1 * map_width + x1
  97.       g1 = current[:g]
  98.       node_list.delete(current)
  99.       open_list.delete(pos1)
  100.       closed_list << pos1
  101.       if current[:x] == goal_x && current[:y] == goal_y
  102.         best = current
  103.         break
  104.       end
  105.       next if g1 >= @search_limit
  106.       4.times do |j|
  107.         direction = 2 + j * 2
  108.         x2 = x1 + (direction == 6 ? 1 : direction == 4 ? -1 : 0)
  109.         y2 = y1 + (direction == 2 ? 1 : direction == 8 ? -1 : 0)
  110.         pos2 = y2 * map_width + x2
  111.         x3 = x1 + (direction == 6 ? -1 : direction == 4 ? 1 : 0)
  112.         y3 = y1 + (direction == 2 ? -1 : direction == 8 ? 1 : 0)
  113.         next if !is_block?(x1, y1, "上楼") && is_block?(start[:x], start[:y], "上楼")
  114.         next if !is_block?(x1, y1, "下楼") && is_block?(start[:x], start[:y], "下楼")
  115.         next if closed_list.include?(pos2)
  116.         next if (!passable?(x1, y1, direction))
  117. =begin
  118.         if (!passable?(x1, y1, direction)) and ((x2 != x) or (y2 != y)) and
  119.         ((x3 != x) or (y3 != y))
  120.           next
  121.         end
  122. =end
  123.         g2 = g1 + 1
  124.         index2 = open_list.index(pos2)
  125.         if index2 == nil || g2 < node_list[index2][:g]
  126.           if index2 != nil
  127.             neighbor = node_list[index2]
  128.           else
  129.             neighbor = {}; node_list << neighbor; open_list << pos2
  130.           end
  131.           neighbor[:parent] = current
  132.           neighbor[:x] = x2
  133.           neighbor[:y] = y2
  134.           neighbor[:g] = g2
  135.           neighbor[:xr] = g2 + $game_map.distance(x2, y2, goal_x, goal_y)
  136.           if !best || neighbor[:xr] - neighbor[:g] < best[:xr] - best[:g]
  137.              best = neighbor
  138.           end
  139.         end
  140.       end
  141.     end
  142.     node = best
  143.     while node[:parent] && node[:parent] != start
  144.       node = node[:parent]
  145.     end
  146.     # return 0 if node_list.size < 1
  147.     delta_x1 = $game_map.delta_x(node[:x], start[:x])
  148.     delta_y1 = $game_map.delta_y(node[:y], start[:y])
  149.     if delta_y1 > 0
  150.       return 2
  151.     elsif delta_x1 < 0
  152.       return 4
  153.     elsif delta_x1 > 0
  154.       return 6
  155.     elsif delta_y1 < 0
  156.       return 8
  157.     end
  158.     delta_x2 = delta_x_from(goal_x)
  159.     delta_y2 = delta_y_from(goal_y)
  160.     if delta_x2.abs > delta_y2.abs
  161.       return delta_x2 > 0 ? 4 : 6
  162.     elsif delta_y2 != 0
  163.       return delta_y2 > 0 ? 8 : 2
  164.     end
  165.     return 0
  166.   end
  167. end
  168. #==============================================================================
  169. class Position_hints < Sprite
  170.   #--------------------------------------------------------------------------
  171.   def initialize(viewport)
  172.     super(viewport)
  173.     @x = @y = 0
  174.     @data_state = nil
  175.     @flash_count = 0
  176.     self.ox = 16; self.oy = 32
  177.     self.visible = false
  178.     self.bitmap = Bitmap.new(32,32)
  179.     self.bitmap.fill_rect(0,0,32,32,Color.new(255,255,255,120))
  180.   end
  181.   #--------------------------------------------------------------------------
  182.   def dispose
  183.     self.bitmap.dispose
  184.     super
  185.   end
  186.   #--------------------------------------------------------------------------
  187.   def state_changed?
  188.     return @data_state != $game_temp.move_position
  189.   end
  190.   #--------------------------------------------------------------------------
  191.   def update
  192.     super
  193.     update_state
  194.     update_flash
  195.     update_position
  196.   end
  197.   #--------------------------------------------------------------------------
  198.   def update_state
  199.     return unless state_changed?
  200.     self.visible = ($game_temp.move_position != nil)
  201.     if $game_temp.move_position
  202.       @x = $game_temp.move_position[0]; @y = $game_temp.move_position[1]
  203.       @flash_count = 0
  204.       update_flash
  205.       update_position
  206.     end
  207.     @data_state = $game_temp.move_position ? $game_temp.move_position.clone : nil
  208.   end
  209.   #--------------------------------------------------------------------------
  210.   def update_flash
  211.     return if !self.visible
  212.     @flash_count = (@flash_count + 1) % 40
  213.     if @flash_count < 20
  214.       opacity = (20 - @flash_count) * 8
  215.     else
  216.       opacity = (@flash_count - 20) * 8
  217.     end
  218.     self.opacity = opacity
  219.   end
  220.   #--------------------------------------------------------------------------
  221.   def update_position
  222.     return if !self.visible
  223.     self.x = (@x * 128 - $game_map.display_x + 3) / 4 + 16
  224.     self.y = (@y * 128 - $game_map.display_y + 3) / 4 + 32
  225.     self.z = self.y - 1
  226.   end
  227. end
  228. #==============================================================================
  229. class Spriteset_Map
  230.   #--------------------------------------------------------------------------
  231.   alias xr_new_mouse_initialize initialize
  232.   def initialize
  233.     xr_new_mouse_initialize
  234.     @position_hints = Position_hints.new(@viewport1)
  235.   end
  236.   #--------------------------------------------------------------------------
  237.   alias xr_new_mouse_dispose dispose
  238.   def dispose
  239.     @position_hints.dispose
  240.     xr_new_mouse_dispose
  241.   end
  242.   #--------------------------------------------------------------------------
  243.   alias xr_new_mouse_update update
  244.   def update
  245.     @position_hints && @position_hints.update
  246.     xr_new_mouse_update
  247.   end
  248. end
  249. #==============================================================================
  250. class Scene_Map
  251.   #--------------------------------------------------------------------------
  252.   alias xr_new_mouse_update update
  253.   def update
  254.     xr_new_mouse_update
  255.     (Mouse.trigger?(Mouse::LEFT) || Mouse.press?(Mouse::LEFT)) && set_move_position
  256.   end
  257.   #--------------------------------------------------------------------------
  258.   def player_can_move?
  259.     return false if $game_temp.message_window_showing
  260.     return false if $game_system.map_interpreter.running?
  261.     return false if $game_temp.player_transferring
  262.     return !$game_player.move_route_forcing
  263.   end
  264.   #--------------------------------------------------------------------------
  265.   def set_move_position
  266.     return unless player_can_move?
  267.     cx, cy = Mouse.mouse_cd_pos
  268.     $game_temp.move_position = [cx, cy]
  269.   end
  270.   #--------------------------------------------------------------------------
  271.   alias xr_new_mouse_transfer_player transfer_player
  272.   def transfer_player
  273.     $game_temp.move_position = nil
  274.     xr_new_mouse_transfer_player
  275.   end
  276. end
  277. #==============================================================================
  278. # 本脚本来自[url]www.66RPG.com[/url],使用和转载请保留此信息
  279. #==============================================================================
  280. #以下两个用来调整战斗时的手感问题,可以自己试试。
  281. $敌人选框扩大 = 20
  282. $角色选框扩大 = 30
  283. #==============================================================================
  284. # API调用
  285. #==============================================================================
  286. $ShowCursor = Win32API.new("user32", "ShowCursor", 'i', 'l')
  287. $GetCursorPos = Win32API.new("user32", "GetCursorPos", 'p', 'i')
  288. $ScreenToClient = Win32API.new("user32", "ScreenToClient", 'ip', 'i')
  289. $GetActiveWindow = Win32API.new("user32", "GetActiveWindow", nil, 'l')
  290. $Window_HWND = $GetActiveWindow.call
  291. $GetKeyState = Win32API.new("user32", "GetKeyState", 'i', 'i')
  292. #$FindWindow = Win32API.new("user32", "FindWindow", 'pp', 'i')
  293. #$HookStart  = Win32API.new("mouse_hook.dll", "HookStart", 'i', nil)
  294. #$HookEnd  = Win32API.new("mouse_hook.dll", "HookEnd", nil, nil)
  295. #$GetMouseStatus  = Win32API.new("mouse_hook.dll", "GetMouseStatus", 'i', 'i')
  296. #$Window_HWND = $FindWindow.call(nil, 'mousetry')
  297. #==============================================================================
  298. module Mouse  
  299.   LEFT = 0x01
  300.   RIGHT = 0x02
  301.  
  302.   def self.init(sprite = nil)
  303. #   $HookStart.call($Window_HWND)
  304.     $ShowCursor.call(0)
  305.  
  306.     @show_cursor = false
  307.  
  308.     @mouse_sprite = Sprite.new
  309.     @mouse_sprite.z = 99999
  310.     @mouse_sprite.bitmap = Bitmap.new('Graphics/Icons/SCMouseIcon.png')
  311.     #修改为自己的路径↑
  312.     #@mouse_sprite.bitmap.fill_rect(Rect.new(0, 0, 32, 32), Color.new(0, 0, 0))
  313.  
  314.     @left_press = false
  315.     @right_press = false
  316.     @left_trigger = false
  317.     @right_trigger = false
  318.     @left_repeat = false
  319.     @right_repeat = false
  320.     @click_lock = false
  321.  
  322.     update
  323.   end
  324.   def self.exit
  325.     @mouse_sprite.bitmap.dispose
  326.     @mouse_sprite.dispose
  327.     @show_cursor = true
  328. #    $HookEnd.call
  329.     $ShowCursor.call(1)
  330.   end
  331.   def self.mouse_debug
  332.     return @mouse_debug.bitmap
  333.   end
  334.   def self.update
  335.     @mouse_sprite.visible = $xiaolv20
  336.  
  337.     left_down = $GetKeyState.call(0x01)
  338.     right_down = $GetKeyState.call(0x02)
  339.  
  340.     @click_lock = false
  341.     mouse_x, mouse_y = self.get_mouse_pos
  342.     if @mouse_sprite != nil
  343.       @mouse_sprite.x = mouse_x
  344.       @mouse_sprite.y = mouse_y
  345.     end
  346.     if left_down[7] == 1
  347.       @left_repeat = (not @left_repeat)
  348.       @left_trigger = (not @left_press)
  349.       @left_press = true
  350.     else
  351.       @left_press = false
  352.       @left_trigger = false
  353.       @left_repeat = false
  354.     end
  355.     if right_down[7] == 1
  356.       @right_repeat = (not @right_repeat)
  357.       @right_trigger = (not @right_press)
  358.       @right_press = true
  359.     else
  360.       @right_press = false
  361.       @right_trigger = false
  362.       @right_repeat = false
  363.     end
  364.   end
  365.   def self.get_mouse_pos
  366.     return 0,0 unless $xiaolv20
  367.     point_var = [0, 0].pack('ll')
  368.     if $GetCursorPos.call(point_var) != 0
  369.       if $ScreenToClient.call($Window_HWND, point_var) != 0
  370.         x, y = point_var.unpack('ll')
  371.         if (x < 0) or (x > 10000) then x = 0 end
  372.         if (y < 0) or (y > 10000) then y = 0 end
  373.         if x > 640 then x = 640 end
  374.         if y > 480 then y = 480 end
  375.         return x, y
  376.       else
  377.         return 0, 0
  378.       end
  379.     else
  380.       return 0, 0
  381.     end
  382.   end
  383.   def self.mouse_cd_pos
  384.     x, y = self.get_mouse_pos
  385.     x /= 32; y /= 32
  386.     x += $game_map.display_x / 128
  387.     y += $game_map.display_y / 128
  388.     return x, y
  389.   end
  390.   def self.press?(mouse_code)
  391.     return false unless $xiaolv20
  392.     if mouse_code == LEFT
  393.       if @click_lock
  394.         return false
  395.       else
  396.         return @left_press
  397.       end
  398.     elsif mouse_code == RIGHT
  399.       return @right_press
  400.     else
  401.       return false
  402.     end
  403.   end
  404.   def self.trigger?(mouse_code)
  405.     return false unless $xiaolv20
  406.     if mouse_code == LEFT
  407.       if @click_lock
  408.         return false
  409.       else
  410.         return @left_trigger
  411.       end
  412.     elsif mouse_code == RIGHT
  413.       return @right_trigger
  414.     else
  415.       return false
  416.     end
  417.   end
  418.   def self.repeat?(mouse_code)
  419.     return false unless $xiaolv20
  420.     if mouse_code == LEFT
  421.       if @click_lock
  422.         return false
  423.       else
  424.         return @left_repeat
  425.       end
  426.     elsif mouse_code == RIGHT
  427.       return @right_repeat
  428.     else
  429.       return false
  430.     end
  431.   end
  432.   def self.click_lock?
  433.     return @click_lock
  434.   end
  435.   def self.click_lock
  436.     @click_lock = true
  437.   end
  438.   def self.click_unlock
  439.     @click_lock = false
  440.   end
  441. end
  442. $xiaolv20 = true
  443. module Input
  444.   if @self_update == nil
  445.     @self_update = method('update')
  446.     @self_press = method('press?')
  447.     @self_trigger = method('trigger?')
  448.     @self_repeat = method('repeat?')
  449.   end
  450.   def self.update
  451.     @self_update.call
  452.     Mouse.update
  453.   end
  454.   def self.press?(key_code)
  455.     if @self_press.call(key_code)
  456.       return true
  457.     end
  458.     if key_code == C
  459.       return Mouse.press?(Mouse::LEFT)
  460.     elsif key_code == B
  461.       return Mouse.press?(Mouse::RIGHT)
  462.     else
  463.       return @self_press.call(key_code)
  464.     end
  465.   end
  466.   def self.trigger?(key_code)
  467.     if @self_trigger.call(key_code)
  468.       return true
  469.     end
  470.     if key_code == C
  471.       return Mouse.trigger?(Mouse::LEFT)
  472.     elsif key_code == B
  473.       return Mouse.trigger?(Mouse::RIGHT)
  474.     else
  475.       return @self_trigger.call(key_code)
  476.     end
  477.   end
  478.   def self.repeat?(key_code)
  479.     if @self_repeat.call(key_code)
  480.       return true
  481.     end
  482.     if key_code == C
  483.       return Mouse.repeat?(Mouse::LEFT)
  484.     elsif key_code == B
  485.       return Mouse.repeat?(Mouse::RIGHT)
  486.     else
  487.       return @self_repeat.call(key_code)
  488.     end
  489.   end
  490. end
  491. class Window_Selectable
  492.   if @self_alias == nil
  493.     alias self_update update
  494.     @self_alias = true
  495.   end
  496.   def update
  497.     #self.cursor_rect.empty
  498.     self_update
  499.     if self.active and @item_max > 0
  500.       index_var = @index
  501.       tp_index = @index
  502.       mouse_x, mouse_y = Mouse.get_mouse_pos
  503.       mouse_not_in_rect = true
  504.       for i in 0...@item_max
  505.         @index = i
  506.         update_cursor_rect
  507.         top_x = self.cursor_rect.x + self.x + 16
  508.         top_y = self.cursor_rect.y + self.y + 16
  509.         bottom_x = top_x + self.cursor_rect.width
  510.         bottom_y = top_y + self.cursor_rect.height
  511.         if (mouse_x > top_x) and (mouse_y > top_y) and
  512.            (mouse_x < bottom_x) and (mouse_y < bottom_y)
  513.           mouse_not_in_rect = false
  514.           if tp_index != @index
  515.             tp_index = @index
  516.             $game_system.se_play($data_system.cursor_se)
  517.           end
  518.           break
  519.         end
  520.       end
  521.       if mouse_not_in_rect
  522.         @index = index_var
  523.         update_cursor_rect
  524.         Mouse.click_lock
  525.       else
  526.         Mouse.click_unlock               
  527.       end
  528.     end
  529.   end
  530. end
  531. class Window_NameInput
  532.   if @self_alias == nil
  533.     alias self_update update
  534.     @self_alias = true
  535.   end
  536.   def update
  537.     #self.cursor_rect.empty
  538.     self_update
  539.     if self.active
  540.       index_var = @index
  541.       mouse_x, mouse_y = Mouse.get_mouse_pos
  542.       mouse_not_in_rect = true
  543.       for i in (0...CHARACTER_TABLE.size).to_a.push(180)
  544.         @index = i
  545.         update_cursor_rect
  546.         top_x = self.cursor_rect.x + self.x + 16
  547.         top_y = self.cursor_rect.y + self.y + 16
  548.         bottom_x = top_x + self.cursor_rect.width
  549.         bottom_y = top_y + self.cursor_rect.height
  550.         #
  551.         if (mouse_x > top_x) and (mouse_y > top_y) and
  552.            (mouse_x < bottom_x) and (mouse_y < bottom_y)
  553.           mouse_not_in_rect = false
  554.           break
  555.         end
  556.       end
  557.       if mouse_not_in_rect
  558.         @index = index_var
  559.         update_cursor_rect
  560.         Mouse.click_lock
  561.       else
  562.         Mouse.click_unlock
  563.       end
  564.     end
  565.   end
  566. end
  567. class Window_InputNumber
  568.   if @self_alias == nil
  569.     alias self_update update
  570.     @self_alias = true
  571.   end
  572.   def update
  573.     #self.cursor_rect.empty
  574.     self_update
  575.     mouse_x, mouse_y = Mouse.get_mouse_pos
  576.     if self.active and @digits_max > 0
  577.       index_var = @index
  578.       mouse_not_in_rect = true
  579.       for i in 0...@digits_max
  580.         @index = i
  581.         update_cursor_rect
  582.         top_x = self.cursor_rect.x + self.x + 16
  583.         bottom_x = top_x + self.cursor_rect.width
  584.         #
  585.         if (mouse_x > top_x) and (mouse_x < bottom_x)
  586.           mouse_not_in_rect = false
  587.           break
  588.         end
  589.       end
  590.       if mouse_not_in_rect
  591.         @index = index_var
  592.         update_cursor_rect
  593.         Mouse.click_lock
  594.       else
  595.         Mouse.click_unlock
  596.       end
  597.     end
  598.     if @last_mouse_y == nil
  599.       @last_mouse_y = mouse_y
  600.     end
  601.     check_pos = (@last_mouse_y - mouse_y).abs
  602.     if check_pos > 10
  603.       $game_system.se_play($data_system.cursor_se)
  604.       place = 10 ** (@digits_max - 1 - @index)
  605.       n = @number / place % 10
  606.       @number -= n * place
  607.       n = (n + 1) % 10 if mouse_y < @last_mouse_y
  608.       n = (n + 9) % 10 if mouse_y > @last_mouse_y
  609.       @number += n * place
  610.       refresh
  611.       @last_mouse_y = mouse_y
  612.     end
  613.   end
  614. end
  615.  
  616.  
  617.  
  618. class Scene_File
  619.   if @self_alias == nil
  620.     alias self_update update
  621.     @self_alias = true
  622.   end
  623.   def update
  624.     # 此处做了修改,存读档请按左右键翻页
  625.     sc_top = @help_window.height
  626.     sc_height = (480 - sc_top) / 4
  627.  
  628.     mouse_x, mouse_y = Mouse.get_mouse_pos
  629.     Mouse.click_lock if mouse_y <= sc_top
  630.     sc_a = @file_index - @file_index % 4
  631.     sc_b = -1
  632.  
  633.     for i in 0..3
  634.       if (mouse_y > sc_top + (i * sc_height)) and (mouse_y < sc_top + ((i + 1) * sc_height))
  635.         sc_b = sc_a + i
  636.         break
  637.       end
  638.     end
  639.  
  640.     if sc_b != -1 and @file_index != sc_b
  641.       @savefile_windows[@file_index].selected = false
  642.       @file_index = sc_b
  643.       @savefile_windows[sc_b].selected = true
  644.       $game_system.se_play($data_system.cursor_se)
  645.       Mouse.click_unlock
  646.     end
  647.  
  648.     self_update
  649.   end
  650. end
  651.  
  652.  
  653. class Arrow_Enemy
  654.   if @self_alias == nil
  655.     alias self_update update
  656.     @self_alias = true
  657.   end
  658.   def update
  659.     mouse_x, mouse_y = Mouse.get_mouse_pos
  660.     idx = 0
  661.     for i in $game_troop.enemies do
  662.       if i.exist?
  663.         top_x = i.screen_x - self.ox
  664.         top_y = i.screen_y - self.oy
  665.         bottom_x = top_x + self.src_rect.width
  666.         bottom_y = top_y + self.src_rect.height
  667.         if (mouse_x > top_x - $敌人选框扩大) and (mouse_y > top_y - $敌人选框扩大) and
  668.            (mouse_x < bottom_x + $敌人选框扩大) and (mouse_y < bottom_y + $敌人选框扩大)
  669.           if @index != idx
  670.             $game_system.se_play($data_system.cursor_se)
  671.             @index = idx
  672.           end
  673.         end
  674.       end
  675.       idx += 1
  676.     end
  677.     self_update
  678.   end
  679. end
  680. class Arrow_Actor
  681.   if @self_alias == nil
  682.     alias self_update update
  683.     @self_alias = true
  684.   end
  685.   def update
  686.     mouse_x, mouse_y = Mouse.get_mouse_pos
  687.     idx = 0
  688.     for i in $game_party.actors do
  689.       if i.exist?
  690.         top_x = i.screen_x - self.ox
  691.         top_y = i.screen_y - self.oy
  692.         bottom_x = top_x + self.src_rect.width
  693.         bottom_y = top_y + self.src_rect.height
  694.         if (mouse_x > top_x - $角色选框扩大) and (mouse_y > top_y - $角色选框扩大) and
  695.            (mouse_x < bottom_x + $角色选框扩大) and (mouse_y < bottom_y + $角色选框扩大)
  696.           if @index != idx
  697.             $game_system.se_play($data_system.cursor_se)
  698.             @index = idx
  699.           end
  700.         end
  701.       end
  702.       idx += 1
  703.     end
  704.     self_update
  705.   end
  706. end
  707. class Game_Player
  708.   if @self_alias == nil
  709.     alias self_update update
  710.     @self_alias = true
  711.   end
  712.   def update
  713.     update_point_movement
  714.     self_update
  715.   end
  716.   def update_point_movement
  717.     return if !$game_temp.move_position || moving?
  718.     tx = $game_temp.move_position[0]; ty = $game_temp.move_position[1]
  719.     direction = find_direction(tx, ty)
  720.     if direction == 0 || Input.dir8 > 0
  721.       $game_temp.move_position = nil
  722.       return
  723.     end
  724.     move_straight(direction)
  725.   end
  726.   #--------------------------------------------------------------------------
  727.   def move_straight(direction)
  728.     # 此处修改了,不到终点不触发
  729.     @direction = direction
  730.     if !passable?(@x, @y, direction)
  731.       x_sc = @x + (direction == 6 ? 1 : direction == 4 ? -1 : 0)
  732.       y_sc = @y + (direction == 2 ? 1 : direction == 8 ? -1 : 0)
  733.       end_sc = (x_sc != $game_temp.move_position[0] ||
  734.       y_sc != $game_temp.move_position[1])
  735.       $game_temp.move_position = nil
  736.       return if end_sc
  737.       check_event_trigger_here([0])
  738.       check_event_trigger_there([0,1,2])
  739.       return
  740.     end
  741.     super(direction)
  742.   end
  743.   #--------------------------------------------------------------------------
  744.   alias xr_new_mouse_check_event_trigger_here check_event_trigger_here
  745.   def check_event_trigger_here(triggers)
  746.     return false if Mouse.trigger?(Mouse::LEFT)
  747.     return xr_new_mouse_check_event_trigger_here(triggers)
  748.   end
  749.   #--------------------------------------------------------------------------
  750.   alias xr_new_mouse_check_event_trigger_there check_event_trigger_there
  751.   def check_event_trigger_there(triggers)
  752.     return false if Mouse.trigger?(Mouse::LEFT)
  753.     return xr_new_mouse_check_event_trigger_there(triggers)
  754.   end
  755. end
  756. Mouse.init
  757. END { Mouse.exit }
  758. #==============================================================================
  759. # 本脚本来自[url]www.66RPG.com[/url],使用和转载请保留此信息
  760. #==============================================================================

Lv2.观梦者

梦石
0
星屑
345
在线时间
73 小时
注册时间
2018-4-25
帖子
6
2
 楼主| 发表于 6 天前 | 只看该作者
我又修改了一下,现在会预判走不到的地方,不进行移动,同时保留了绕过楼梯的功能。
  1. #==============================================================================
  2. # 〓 鼠标点击自寻路 〓      Integration: 芯☆淡茹水
  3. #==============================================================================
  4. #  鼠标脚本,来自 [url]www.66RPG.com[/url] , 未署名。
  5. #==============================================================================
  6. # GET事件的名字
  7. class Game_Event < Game_Character
  8.   def scname
  9.     @event.name
  10.   end
  11.   def scsw1
  12.     @event.pages[0].condition.switch1_id
  13.   end
  14. end
  15. #==============================================================================
  16. class Game_Temp; attr_accessor :move_position; end
  17. #==============================================================================
  18. class Game_Map
  19.   #--------------------------------------------------------------------------
  20.   def distance(x1, y1, x2, y2)
  21.     return delta_x(x1, x2).abs + delta_y(y1, y2).abs
  22.   end
  23.   #--------------------------------------------------------------------------
  24.   def loop_horizontal?
  25.     return false
  26.   end
  27.   #--------------------------------------------------------------------------
  28.   def loop_vertical?
  29.     return false
  30.   end
  31.   #--------------------------------------------------------------------------
  32.   def delta_x(x1, x2)
  33.     result = x1 - x2
  34.     if loop_horizontal? && result.abs > width / 2
  35.       result += result < 0 ? width : -width
  36.     end
  37.     return result
  38.   end
  39.   #--------------------------------------------------------------------------
  40.   def delta_y(y1, y2)
  41.     result = y1 - y2
  42.     if loop_vertical? && result.abs > height / 2
  43.       result += result < 0 ? height : -height
  44.     end
  45.     return result
  46.   end
  47. end
  48. #==============================================================================
  49. class Game_Character
  50.   #--------------------------------------------------------------------------
  51.   alias xr_mv_initialize initialize
  52.   def initialize
  53.     xr_mv_initialize
  54.     @search_limit = 99
  55.   end
  56.   #--------------------------------------------------------------------------
  57.   def delta_x_from(x)
  58.     return $game_map.delta_x(@x, x)
  59.   end
  60.   #--------------------------------------------------------------------------
  61.   def delta_y_from(y)
  62.     return $game_map.delta_y(@y, y)
  63.   end
  64.   #--------------------------------------------------------------------------
  65.   def move_straight(direction)
  66.     return if direction == 0
  67.     @direction = direction
  68.     passable?(@x, @y, direction) && move_forward
  69.   end
  70.   #--------------------------------------------------------------------------
  71.   # 判断是否有阻障
  72.   def is_block?(sc_x, sc_y, *sc_arg)
  73.     $game_map.events.each do |key, value|
  74.       if sc_x == value.x and sc_y == value.y and sc_arg.include?(value.scname)
  75.         return false if value.scsw1 != 34 ||
  76.         (!sc_arg.include?("上楼") && !sc_arg.include?("下楼"))
  77.       end
  78.     end
  79.     return true
  80.   end
  81.   #--------------------------------------------------------------------------
  82.   def find_direction(x, y)
  83.     return 0 if @x == x && @y == y
  84.     goal_x = x; goal_y = y
  85.     map_width = $game_map.width
  86.     node_list = []; open_list = []; closed_list = []
  87.     start = {}; best = start
  88.     start[:parent] = nil; start[:x] = @x; start[:y] = @y; start[:g] = 0
  89.     start[:xr] = $game_map.distance(start[:x], start[:y], goal_x, goal_y);
  90.     node_list.push(start)
  91.     open_list.push(start[:y] * map_width + start[:x])
  92.     while node_list.size > 0
  93.       best_index = 0
  94.       node_list.size.times do |i|
  95.         best_index = i if node_list[i][:xr] < node_list[best_index][:xr]
  96.       end
  97.       current = node_list[best_index]
  98.       x1 = current[:x]; y1 = current[:y]
  99.       pos1 = y1 * map_width + x1
  100.       g1 = current[:g]
  101.       node_list.delete(current)
  102.       open_list.delete(pos1)
  103.       closed_list << pos1
  104.       if current[:x] == goal_x && current[:y] == goal_y
  105.         best = current
  106.         break
  107.       end
  108.       next if g1 >= @search_limit
  109.       4.times do |j|
  110.         direction = 2 + j * 2
  111.         x2 = x1 + (direction == 6 ? 1 : direction == 4 ? -1 : 0)
  112.         y2 = y1 + (direction == 2 ? 1 : direction == 8 ? -1 : 0)
  113.         pos2 = y2 * map_width + x2
  114.         next if !is_block?(x1, y1, "上楼") && is_block?(start[:x], start[:y], "上楼")
  115.         next if !is_block?(x1, y1, "下楼") && is_block?(start[:x], start[:y], "下楼")
  116.         next if closed_list.include?(pos2)
  117.         next if (!passable?(x1, y1, direction))
  118.         g2 = g1 + 1
  119.         index2 = open_list.index(pos2)
  120.         if index2 == nil || g2 < node_list[index2][:g]
  121.           if index2 != nil
  122.             neighbor = node_list[index2]
  123.           else
  124.             neighbor = {}; node_list << neighbor; open_list << pos2
  125.           end
  126.           neighbor[:parent] = current
  127.           neighbor[:x] = x2
  128.           neighbor[:y] = y2
  129.           neighbor[:g] = g2
  130.           neighbor[:xr] = g2 + $game_map.distance(x2, y2, goal_x, goal_y)
  131.           if !best || neighbor[:xr] - neighbor[:g] < best[:xr] - best[:g]
  132.              best = neighbor
  133.           end
  134.         end
  135.       end
  136.     end
  137.     node = best
  138.     end_path = [node[:x], node[:y]]
  139.     while node[:parent] && node[:parent] != start
  140.       node = node[:parent]
  141.     end
  142.     return 0 if $game_map.distance(goal_x, goal_y, end_path[0], end_path[1]) > 1
  143.     delta_x1 = $game_map.delta_x(node[:x], start[:x])
  144.     delta_y1 = $game_map.delta_y(node[:y], start[:y])
  145.     if delta_y1 > 0
  146.       return 2
  147.     elsif delta_x1 < 0
  148.       return 4
  149.     elsif delta_x1 > 0
  150.       return 6
  151.     elsif delta_y1 < 0
  152.       return 8
  153.     end
  154.     delta_x2 = delta_x_from(goal_x)
  155.     delta_y2 = delta_y_from(goal_y)
  156.     if delta_x2.abs > delta_y2.abs
  157.       return delta_x2 > 0 ? 4 : 6
  158.     elsif delta_y2 != 0
  159.       return delta_y2 > 0 ? 8 : 2
  160.     end
  161.     return 0
  162.   end
  163. end
  164. #==============================================================================
  165. class Position_hints < Sprite
  166.   #--------------------------------------------------------------------------
  167.   def initialize(viewport)
  168.     super(viewport)
  169.     @x = @y = 0
  170.     @data_state = nil
  171.     @flash_count = 0
  172.     self.ox = 16; self.oy = 32
  173.     self.visible = false
  174.     self.bitmap = Bitmap.new(32,32)
  175.     self.bitmap.fill_rect(0,0,32,32,Color.new(255,255,255,120))
  176.   end
  177.   #--------------------------------------------------------------------------
  178.   def dispose
  179.     self.bitmap.dispose
  180.     super
  181.   end
  182.   #--------------------------------------------------------------------------
  183.   def state_changed?
  184.     return @data_state != $game_temp.move_position
  185.   end
  186.   #--------------------------------------------------------------------------
  187.   def update
  188.     super
  189.     update_state
  190.     update_flash
  191.     update_position
  192.   end
  193.   #--------------------------------------------------------------------------
  194.   def update_state
  195.     return unless state_changed?
  196.     self.visible = ($game_temp.move_position != nil)
  197.     if $game_temp.move_position
  198.       @x = $game_temp.move_position[0]; @y = $game_temp.move_position[1]
  199.       @flash_count = 0
  200.       update_flash
  201.       update_position
  202.     end
  203.     @data_state = $game_temp.move_position ? $game_temp.move_position.clone : nil
  204.   end
  205.   #--------------------------------------------------------------------------
  206.   def update_flash
  207.     return if !self.visible
  208.     @flash_count = (@flash_count + 1) % 40
  209.     if @flash_count < 20
  210.       opacity = (20 - @flash_count) * 8
  211.     else
  212.       opacity = (@flash_count - 20) * 8
  213.     end
  214.     self.opacity = opacity
  215.   end
  216.   #--------------------------------------------------------------------------
  217.   def update_position
  218.     return if !self.visible
  219.     self.x = (@x * 128 - $game_map.display_x + 3) / 4 + 16
  220.     self.y = (@y * 128 - $game_map.display_y + 3) / 4 + 32
  221.     self.z = self.y - 1
  222.   end
  223. end
  224. #==============================================================================
  225. class Spriteset_Map
  226.   #--------------------------------------------------------------------------
  227.   alias xr_new_mouse_initialize initialize
  228.   def initialize
  229.     xr_new_mouse_initialize
  230.     @position_hints = Position_hints.new(@viewport1)
  231.   end
  232.   #--------------------------------------------------------------------------
  233.   alias xr_new_mouse_dispose dispose
  234.   def dispose
  235.     @position_hints.dispose
  236.     xr_new_mouse_dispose
  237.   end
  238.   #--------------------------------------------------------------------------
  239.   alias xr_new_mouse_update update
  240.   def update
  241.     @position_hints && @position_hints.update
  242.     xr_new_mouse_update
  243.   end
  244. end
  245. #==============================================================================
  246. class Scene_Map
  247.   #--------------------------------------------------------------------------
  248.   alias xr_new_mouse_update update
  249.   def update
  250.     xr_new_mouse_update
  251.     (Mouse.trigger?(Mouse::LEFT) || Mouse.press?(Mouse::LEFT)) && set_move_position
  252.   end
  253.   #--------------------------------------------------------------------------
  254.   def player_can_move?
  255.     return false if $game_temp.message_window_showing
  256.     return false if $game_system.map_interpreter.running?
  257.     return false if $game_temp.player_transferring
  258.     return !$game_player.move_route_forcing
  259.   end
  260.   #--------------------------------------------------------------------------
  261.   def set_move_position
  262.     return unless player_can_move?
  263.     cx, cy = Mouse.mouse_cd_pos
  264.     $game_temp.move_position = [cx, cy]
  265.   end
  266.   #--------------------------------------------------------------------------
  267.   alias xr_new_mouse_transfer_player transfer_player
  268.   def transfer_player
  269.     $game_temp.move_position = nil
  270.     xr_new_mouse_transfer_player
  271.   end
  272. end
  273. #==============================================================================
  274. # 本脚本来自[url]www.66RPG.com[/url],使用和转载请保留此信息
  275. #==============================================================================
  276. #以下两个用来调整战斗时的手感问题,可以自己试试。
  277. $敌人选框扩大 = 20
  278. $角色选框扩大 = 30
  279. #==============================================================================
  280. # API调用
  281. #==============================================================================
  282. $ShowCursor = Win32API.new("user32", "ShowCursor", 'i', 'l')
  283. $GetCursorPos = Win32API.new("user32", "GetCursorPos", 'p', 'i')
  284. $ScreenToClient = Win32API.new("user32", "ScreenToClient", 'ip', 'i')
  285. $GetActiveWindow = Win32API.new("user32", "GetActiveWindow", nil, 'l')
  286. $Window_HWND = $GetActiveWindow.call
  287. $GetKeyState = Win32API.new("user32", "GetKeyState", 'i', 'i')
  288. #$FindWindow = Win32API.new("user32", "FindWindow", 'pp', 'i')
  289. #$HookStart  = Win32API.new("mouse_hook.dll", "HookStart", 'i', nil)
  290. #$HookEnd  = Win32API.new("mouse_hook.dll", "HookEnd", nil, nil)
  291. #$GetMouseStatus  = Win32API.new("mouse_hook.dll", "GetMouseStatus", 'i', 'i')
  292. #$Window_HWND = $FindWindow.call(nil, 'mousetry')
  293. #==============================================================================
  294. module Mouse  
  295.   LEFT = 0x01
  296.   RIGHT = 0x02

  297.   def self.init(sprite = nil)
  298. #   $HookStart.call($Window_HWND)
  299.     $ShowCursor.call(0)

  300.     @show_cursor = false

  301.     @mouse_sprite = Sprite.new
  302.     @mouse_sprite.z = 99999
  303.     @mouse_sprite.bitmap = Bitmap.new('Graphics/Icons/SCMouseIcon.png')
  304.     #修改为自己的路径↑
  305.     #@mouse_sprite.bitmap.fill_rect(Rect.new(0, 0, 32, 32), Color.new(0, 0, 0))

  306.     @left_press = false
  307.     @right_press = false
  308.     @left_trigger = false
  309.     @right_trigger = false
  310.     @left_repeat = false
  311.     @right_repeat = false
  312.     @click_lock = false

  313.     update
  314.   end
  315.   def self.exit
  316.     @mouse_sprite.bitmap.dispose
  317.     @mouse_sprite.dispose
  318.     @show_cursor = true
  319. #    $HookEnd.call
  320.     $ShowCursor.call(1)
  321.   end
  322.   def self.mouse_debug
  323.     return @mouse_debug.bitmap
  324.   end
  325.   def self.update
  326.     @mouse_sprite.visible = $xiaolv20

  327.     left_down = $GetKeyState.call(0x01)
  328.     right_down = $GetKeyState.call(0x02)

  329.     @click_lock = false
  330.     mouse_x, mouse_y = self.get_mouse_pos
  331.     if @mouse_sprite != nil
  332.       @mouse_sprite.x = mouse_x
  333.       @mouse_sprite.y = mouse_y
  334.     end
  335.     if left_down[7] == 1
  336.       @left_repeat = (not @left_repeat)
  337.       @left_trigger = (not @left_press)
  338.       @left_press = true
  339.     else
  340.       @left_press = false
  341.       @left_trigger = false
  342.       @left_repeat = false
  343.     end
  344.     if right_down[7] == 1
  345.       @right_repeat = (not @right_repeat)
  346.       @right_trigger = (not @right_press)
  347.       @right_press = true
  348.     else
  349.       @right_press = false
  350.       @right_trigger = false
  351.       @right_repeat = false
  352.     end
  353.   end
  354.   def self.get_mouse_pos
  355.     return 0,0 unless $xiaolv20
  356.     point_var = [0, 0].pack('ll')
  357.     if $GetCursorPos.call(point_var) != 0
  358.       if $ScreenToClient.call($Window_HWND, point_var) != 0
  359.         x, y = point_var.unpack('ll')
  360.         if (x < 0) or (x > 10000) then x = 0 end
  361.         if (y < 0) or (y > 10000) then y = 0 end
  362.         if x > 640 then x = 640 end
  363.         if y > 480 then y = 480 end
  364.         return x, y
  365.       else
  366.         return 0, 0
  367.       end
  368.     else
  369.       return 0, 0
  370.     end
  371.   end
  372.   def self.mouse_cd_pos
  373.     x, y = self.get_mouse_pos
  374.     x /= 32; y /= 32
  375.     x += $game_map.display_x / 128
  376.     y += $game_map.display_y / 128
  377.     return x, y
  378.   end
  379.   def self.press?(mouse_code)
  380.     return false unless $xiaolv20
  381.     if mouse_code == LEFT
  382.       if @click_lock
  383.         return false
  384.       else
  385.         return @left_press
  386.       end
  387.     elsif mouse_code == RIGHT
  388.       return @right_press
  389.     else
  390.       return false
  391.     end
  392.   end
  393.   def self.trigger?(mouse_code)
  394.     return false unless $xiaolv20
  395.     if mouse_code == LEFT
  396.       if @click_lock
  397.         return false
  398.       else
  399.         return @left_trigger
  400.       end
  401.     elsif mouse_code == RIGHT
  402.       return @right_trigger
  403.     else
  404.       return false
  405.     end
  406.   end
  407.   def self.repeat?(mouse_code)
  408.     return false unless $xiaolv20
  409.     if mouse_code == LEFT
  410.       if @click_lock
  411.         return false
  412.       else
  413.         return @left_repeat
  414.       end
  415.     elsif mouse_code == RIGHT
  416.       return @right_repeat
  417.     else
  418.       return false
  419.     end
  420.   end
  421.   def self.click_lock?
  422.     return @click_lock
  423.   end
  424.   def self.click_lock
  425.     @click_lock = true
  426.   end
  427.   def self.click_unlock
  428.     @click_lock = false
  429.   end
  430. end
  431. $xiaolv20 = true
  432. module Input
  433.   if @self_update == nil
  434.     @self_update = method('update')
  435.     @self_press = method('press?')
  436.     @self_trigger = method('trigger?')
  437.     @self_repeat = method('repeat?')
  438.   end
  439.   def self.update
  440.     @self_update.call
  441.     Mouse.update
  442.   end
  443.   def self.press?(key_code)
  444.     if @self_press.call(key_code)
  445.       return true
  446.     end
  447.     if key_code == C
  448.       return Mouse.press?(Mouse::LEFT)
  449.     elsif key_code == B
  450.       return Mouse.press?(Mouse::RIGHT)
  451.     else
  452.       return @self_press.call(key_code)
  453.     end
  454.   end
  455.   def self.trigger?(key_code)
  456.     if @self_trigger.call(key_code)
  457.       return true
  458.     end
  459.     if key_code == C
  460.       return Mouse.trigger?(Mouse::LEFT)
  461.     elsif key_code == B
  462.       return Mouse.trigger?(Mouse::RIGHT)
  463.     else
  464.       return @self_trigger.call(key_code)
  465.     end
  466.   end
  467.   def self.repeat?(key_code)
  468.     if @self_repeat.call(key_code)
  469.       return true
  470.     end
  471.     if key_code == C
  472.       return Mouse.repeat?(Mouse::LEFT)
  473.     elsif key_code == B
  474.       return Mouse.repeat?(Mouse::RIGHT)
  475.     else
  476.       return @self_repeat.call(key_code)
  477.     end
  478.   end
  479. end
  480. class Window_Selectable
  481.   if @self_alias == nil
  482.     alias self_update update
  483.     @self_alias = true
  484.   end
  485.   def update
  486.     #self.cursor_rect.empty
  487.     self_update
  488.     if self.active and @item_max > 0
  489.       index_var = @index
  490.       tp_index = @index
  491.       mouse_x, mouse_y = Mouse.get_mouse_pos
  492.       mouse_not_in_rect = true
  493.       for i in 0...@item_max
  494.         @index = i
  495.         update_cursor_rect
  496.         top_x = self.cursor_rect.x + self.x + 16
  497.         top_y = self.cursor_rect.y + self.y + 16
  498.         bottom_x = top_x + self.cursor_rect.width
  499.         bottom_y = top_y + self.cursor_rect.height
  500.         if (mouse_x > top_x) and (mouse_y > top_y) and
  501.            (mouse_x < bottom_x) and (mouse_y < bottom_y)
  502.           mouse_not_in_rect = false
  503.           if tp_index != @index
  504.             tp_index = @index
  505.             $game_system.se_play($data_system.cursor_se)
  506.           end
  507.           break
  508.         end
  509.       end
  510.       if mouse_not_in_rect
  511.         @index = index_var
  512.         update_cursor_rect
  513.         Mouse.click_lock
  514.       else
  515.         Mouse.click_unlock               
  516.       end
  517.     end
  518.   end
  519. end
  520. class Window_NameInput
  521.   if @self_alias == nil
  522.     alias self_update update
  523.     @self_alias = true
  524.   end
  525.   def update
  526.     #self.cursor_rect.empty
  527.     self_update
  528.     if self.active
  529.       index_var = @index
  530.       mouse_x, mouse_y = Mouse.get_mouse_pos
  531.       mouse_not_in_rect = true
  532.       for i in (0...CHARACTER_TABLE.size).to_a.push(180)
  533.         @index = i
  534.         update_cursor_rect
  535.         top_x = self.cursor_rect.x + self.x + 16
  536.         top_y = self.cursor_rect.y + self.y + 16
  537.         bottom_x = top_x + self.cursor_rect.width
  538.         bottom_y = top_y + self.cursor_rect.height
  539.         #
  540.         if (mouse_x > top_x) and (mouse_y > top_y) and
  541.            (mouse_x < bottom_x) and (mouse_y < bottom_y)
  542.           mouse_not_in_rect = false
  543.           break
  544.         end
  545.       end
  546.       if mouse_not_in_rect
  547.         @index = index_var
  548.         update_cursor_rect
  549.         Mouse.click_lock
  550.       else
  551.         Mouse.click_unlock
  552.       end
  553.     end
  554.   end
  555. end
  556. class Window_InputNumber
  557.   if @self_alias == nil
  558.     alias self_update update
  559.     @self_alias = true
  560.   end
  561.   def update
  562.     #self.cursor_rect.empty
  563.     self_update
  564.     mouse_x, mouse_y = Mouse.get_mouse_pos
  565.     if self.active and @digits_max > 0
  566.       index_var = @index
  567.       mouse_not_in_rect = true
  568.       for i in 0...@digits_max
  569.         @index = i
  570.         update_cursor_rect
  571.         top_x = self.cursor_rect.x + self.x + 16
  572.         bottom_x = top_x + self.cursor_rect.width
  573.         #
  574.         if (mouse_x > top_x) and (mouse_x < bottom_x)
  575.           mouse_not_in_rect = false
  576.           break
  577.         end
  578.       end
  579.       if mouse_not_in_rect
  580.         @index = index_var
  581.         update_cursor_rect
  582.         Mouse.click_lock
  583.       else
  584.         Mouse.click_unlock
  585.       end
  586.     end
  587.     if @last_mouse_y == nil
  588.       @last_mouse_y = mouse_y
  589.     end
  590.     check_pos = (@last_mouse_y - mouse_y).abs
  591.     if check_pos > 10
  592.       $game_system.se_play($data_system.cursor_se)
  593.       place = 10 ** (@digits_max - 1 - @index)
  594.       n = @number / place % 10
  595.       @number -= n * place
  596.       n = (n + 1) % 10 if mouse_y < @last_mouse_y
  597.       n = (n + 9) % 10 if mouse_y > @last_mouse_y
  598.       @number += n * place
  599.       refresh
  600.       @last_mouse_y = mouse_y
  601.     end
  602.   end
  603. end



  604. class Scene_File
  605.   if @self_alias == nil
  606.     alias self_update update
  607.     @self_alias = true
  608.   end
  609.   def update
  610.     # 此处做了修改,存读档请按左右键翻页
  611.     sc_top = @help_window.height
  612.     sc_height = (480 - sc_top) / 4

  613.     mouse_x, mouse_y = Mouse.get_mouse_pos
  614.     Mouse.click_lock if mouse_y <= sc_top
  615.     sc_a = @file_index - @file_index % 4
  616.     sc_b = -1

  617.     for i in 0..3
  618.       if (mouse_y > sc_top + (i * sc_height)) and (mouse_y < sc_top + ((i + 1) * sc_height))
  619.         sc_b = sc_a + i
  620.         break
  621.       end
  622.     end

  623.     if sc_b != -1 and @file_index != sc_b
  624.       @savefile_windows[@file_index].selected = false
  625.       @file_index = sc_b
  626.       @savefile_windows[sc_b].selected = true
  627.       $game_system.se_play($data_system.cursor_se)
  628.       Mouse.click_unlock
  629.     end

  630.     self_update
  631.   end
  632. end


  633. class Arrow_Enemy
  634.   if @self_alias == nil
  635.     alias self_update update
  636.     @self_alias = true
  637.   end
  638.   def update
  639.     mouse_x, mouse_y = Mouse.get_mouse_pos
  640.     idx = 0
  641.     for i in $game_troop.enemies do
  642.       if i.exist?
  643.         top_x = i.screen_x - self.ox
  644.         top_y = i.screen_y - self.oy
  645.         bottom_x = top_x + self.src_rect.width
  646.         bottom_y = top_y + self.src_rect.height
  647.         if (mouse_x > top_x - $敌人选框扩大) and (mouse_y > top_y - $敌人选框扩大) and
  648.            (mouse_x < bottom_x + $敌人选框扩大) and (mouse_y < bottom_y + $敌人选框扩大)
  649.           if @index != idx
  650.             $game_system.se_play($data_system.cursor_se)
  651.             @index = idx
  652.           end
  653.         end
  654.       end
  655.       idx += 1
  656.     end
  657.     self_update
  658.   end
  659. end
  660. class Arrow_Actor
  661.   if @self_alias == nil
  662.     alias self_update update
  663.     @self_alias = true
  664.   end
  665.   def update
  666.     mouse_x, mouse_y = Mouse.get_mouse_pos
  667.     idx = 0
  668.     for i in $game_party.actors do
  669.       if i.exist?
  670.         top_x = i.screen_x - self.ox
  671.         top_y = i.screen_y - self.oy
  672.         bottom_x = top_x + self.src_rect.width
  673.         bottom_y = top_y + self.src_rect.height
  674.         if (mouse_x > top_x - $角色选框扩大) and (mouse_y > top_y - $角色选框扩大) and
  675.            (mouse_x < bottom_x + $角色选框扩大) and (mouse_y < bottom_y + $角色选框扩大)
  676.           if @index != idx
  677.             $game_system.se_play($data_system.cursor_se)
  678.             @index = idx
  679.           end
  680.         end
  681.       end
  682.       idx += 1
  683.     end
  684.     self_update
  685.   end
  686. end
  687. class Game_Player
  688.   if @self_alias == nil
  689.     alias self_update update
  690.     @self_alias = true
  691.   end
  692.   def update
  693.     update_point_movement
  694.     self_update
  695.   end
  696.   def update_point_movement
  697.     return if !$game_temp.move_position || moving?
  698.     tx = $game_temp.move_position[0]; ty = $game_temp.move_position[1]
  699.     direction = find_direction(tx, ty)
  700.     if direction == 0 || Input.dir8 > 0
  701.       $game_temp.move_position = nil
  702.       return
  703.     end
  704.     move_straight(direction)
  705.   end
  706.   #--------------------------------------------------------------------------
  707.   def move_straight(direction)
  708.     @direction = direction
  709.     if !passable?(@x, @y, direction)
  710.       # x_sc = @x + (direction == 6 ? 1 : direction == 4 ? -1 : 0)
  711.       # y_sc = @y + (direction == 2 ? 1 : direction == 8 ? -1 : 0)
  712.       # end_sc = (x_sc != $game_temp.move_position[0] ||
  713.       # y_sc != $game_temp.move_position[1])
  714.       $game_temp.move_position = nil
  715.       # return if end_sc
  716.       check_event_trigger_here([0])
  717.       check_event_trigger_there([0,1,2])
  718.       return
  719.     end
  720.     super(direction)
  721.   end
  722.   #--------------------------------------------------------------------------
  723.   alias xr_new_mouse_check_event_trigger_here check_event_trigger_here
  724.   def check_event_trigger_here(triggers)
  725.     return false if Mouse.trigger?(Mouse::LEFT)
  726.     return xr_new_mouse_check_event_trigger_here(triggers)
  727.   end
  728.   #--------------------------------------------------------------------------
  729.   alias xr_new_mouse_check_event_trigger_there check_event_trigger_there
  730.   def check_event_trigger_there(triggers)
  731.     return false if Mouse.trigger?(Mouse::LEFT)
  732.     return xr_new_mouse_check_event_trigger_there(triggers)
  733.   end
  734. end
  735. Mouse.init
  736. END { Mouse.exit }
  737. #==============================================================================
  738. # 本脚本来自[url]www.66RPG.com[/url],使用和转载请保留此信息
  739. #==============================================================================
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2025-1-24 06:24

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表