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

Project1

 找回密码
 注册会员
搜索
12
返回列表 发新帖
楼主: jiahui5592986
打印 上一主题 下一主题

[已经解决] 如何让鼠标点击事件直接打开

[复制链接]

Lv3.寻梦者

梦石
0
星屑
1556
在线时间
626 小时
注册时间
2010-8-5
帖子
451
11
 楼主| 发表于 2014-9-21 11:11:26 | 只看该作者
芯☆淡茹水 发表于 2014-9-18 16:23
—-—!  给出的非鼠标脚本,但是好歹也能弄。
不知道你的工程读取事件行走图的路径,不能用像素判断,只能 ...

有个BUG。如果设置一个NPC。内容是显示文章。

现在,在一定范围内点击是触发了。
BUT。。显示的文章点击后[也就是文章显示完毕]
主角就自动跑NPC跟前去了。

意思就是,点击事件后。触发了事件内容。但是事件内容结束后。角色又跑到了事件旁边。

能否让事件内容结束后,角色还是原来的位置【点击NPC时候的位置,也就是不移动】
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
33434
在线时间
5108 小时
注册时间
2012-11-19
帖子
4878

开拓者

12
发表于 2014-9-21 13:41:59 | 只看该作者
这样试下:
  1. #==============================================================================
  2. # ■ Game_Player
  3. #------------------------------------------------------------------------------
  4. #  处理主角的类。事件启动的判定、以及地图的滚动等功能。
  5. # 本类的实例请参考 $game_player。
  6. #==============================================================================

  7. class Game_Player < Game_Character
  8.   if @self_alias == nil
  9.     alias self_update update
  10.     @self_alias = true
  11.   end
  12.   #--------------------------------------------------------------------------
  13.   # X☆R 添加:鼠标指向位置是否是NPC
  14.   #--------------------------------------------------------------------------
  15.   def get_npc
  16.     x, y = Mouse.get_mouse_pos
  17.     for event in $game_map.events.values
  18.       next if event.character_name == ""
  19.       if x > event.screen_x - 16 and x < event.screen_x + 16 and
  20.        y > event.screen_y - 64 and y < event.screen_y
  21.         return event
  22.       end
  23.     end
  24.     return nil
  25.   end
  26.   #--------------------------------------------------------------------------
  27.   # ● 完整鼠标系统
  28.   #--------------------------------------------------------------------------
  29.   def update
  30.    
  31.     # X☆R 添加:点击鼠标左键,并且距离小于 7 ,启动事件。
  32.     if Mouse.trigger?(0x01)
  33.       if get_npc != nil and (self.x-get_npc.x).abs + (self.y-get_npc.y).abs < 7
  34.         get_npc.start
  35.         return
  36.       end
  37.     end
  38.    
  39.     # 搜索路径
  40.     seek_path
  41.    
  42.     # 当持续按下鼠标左键时
  43.     if Mouse.press?(0x01)
  44.       return if !System.whether_move
  45.       @count = 20 if @count.nil?
  46.       @count -= 1
  47.       if @count <= 0
  48.         @self_state = 2
  49.         @count = nil
  50.       end
  51.       follow(true) if @self_state != 2 and @count < 18
  52.     elsif Mouse.trigger?(0x02)
  53.       @self_state = 0
  54.       follow(false)
  55.     else
  56.       @count = 20
  57.     end
  58.     # 移动
  59.     if @self_state == 1
  60.       player_move
  61.     elsif @paths != nil and @self_state == 2
  62.       follow(true)
  63.     end
  64.     # 别名
  65.     self_update
  66.   end
  67.   #--------------------------------------------------------------------------
  68.   # ● 搜索路径
  69.   #--------------------------------------------------------------------------
  70.   def seek_path
  71.     # 获取鼠标在画面的坐标
  72.     x, y = Mouse.get_mouse_pos
  73.     # 当按下鼠标左键时
  74.     if Mouse.trigger?(0x01)
  75.       # 禁止移动的情况下返回
  76.       return if !System.whether_move
  77.       # 排除各种无效的情况
  78.       unless $game_system.map_interpreter.running? or
  79.         @move_route_forcing or $game_temp.message_window_showing
  80.         # 获取目标点
  81.         trg_x = (x + $game_map.display_x / 4) / 32
  82.         trg_y = (y + $game_map.display_y / 4) / 32
  83.         # 目标点不可以通行的情况下返回
  84.         return unless target_passable?(trg_x,trg_y)
  85.         # 初始化未开启事件
  86.         @event = nil
  87.         # 判断是否可以打开事件
  88.         event_start = check_event_custom_start(x, y)
  89.         # 若不能开启事件
  90.         if !event_start
  91.           # 初始化
  92.           @paths = []
  93.           @steps = 0
  94.           @self_state = 1
  95.           # 若存在未开启事件
  96.           if @event != nil
  97.             trg_x,trg_y = @event.x,@event.y
  98.           end
  99.           # 若目标不为自身则开始寻路
  100.           if trg_x != self.x or trg_y != self.y
  101.             # 添加点击动画
  102.             add_animation if @event.nil?
  103.             # 获得路径
  104.             @paths = Find_Path.new.find_player_short_path(trg_x, trg_y, x, y)
  105.           end
  106.         else
  107.           # 角色面向事件
  108.           self.turn_toward_player(@event) if [email protected]? and !self.moving?
  109.           @steps = @paths = nil
  110.         end
  111.       end
  112.     end
  113.   end
  114.   #--------------------------------------------------------------------------
  115.   # ● 可以通行判定
  116.   #     x : X 坐标
  117.   #     y : Y 坐标
  118.   #--------------------------------------------------------------------------
  119.   def target_passable?(x, y)
  120.     # 获取地图通行表
  121.     passages = $data_tilesets[$game_map.tileset_id].passages
  122.     # 从层按从上到下的顺序调查循环
  123.     for i in [2, 1, 0]
  124.       # 取得元件 ID
  125.       tile_id = $game_map.data[x, y, i]
  126.       # 取得元件 ID 失败
  127.       if tile_id == nil
  128.         # 不能通行
  129.         return false
  130.       # 如果全方向的障碍物的接触被设置的情况下
  131.       elsif passages[tile_id] & 0x0f == 0x0f
  132.         # 不能通行
  133.         return false
  134.       # 这以外的优先度为 0 的情况下
  135.       elsif $game_map.priorities[tile_id] == 0
  136.         # 可以通行
  137.         return true
  138.       end
  139.     end
  140.     # 可以通行
  141.     return true
  142.   end
  143.   #--------------------------------------------------------------------------
  144.   # ● 判断是否可以打开事件
  145.   #--------------------------------------------------------------------------
  146.   def check_event_custom_start(x, y)
  147.     # 循环检查所有事件
  148.     for event in $game_map.events.values
  149.       bitmap = RPG::Cache.character(event.character_name,event.character_hue)
  150.       cw = bitmap.width / 9#event.animation_frame
  151.       ch = bitmap.height / 8#event.direction_frame
  152.       _x = event.screen_x
  153.       _y = event.screen_y
  154.       d = event.direction
  155.       case event.direction_frame
  156.       when 4
  157.         sy = d > 8 ? 2 : d > 7 ? 3 : d > 6 ? 3 : d > 5 ? 2 : d > 3 ? 1 : d > 2 ? 0 : d > 1 ? 0 : d > 0 ? 1 : 5
  158.       when 8
  159.         sy = d > 8 ? 7 : d > 7 ? 3 : d > 6 ? 6 : d > 5 ? 2 : d > 3 ? 1 : d > 2 ? 5 : d > 1 ? 0 : d > 0 ? 4 : 5
  160.       end
  161.       if x >= _x - cw / 2 and x <= _x + cw / 2 and y >= _y - ch and y <= _y and
  162.         bitmap.get_pixel(x - _x + cw / 2 + event.pattern * cw, y - _y + ch + sy * ch).alpha > 0
  163.         for i in 0...event.list.size
  164.           if ["Item", "Npc"].include?(event.list[i].parameters[0])
  165.             way_x = self.x - event.x
  166.             way_y = self.y - event.y
  167.             if way_x.abs + way_y.abs <= 8 and !self.moving?
  168.               # 矫正主角姿势
  169.               self.straighten
  170.               # 角色面向事件

  171.               # 开启事件
  172.               event.start
  173.               return true
  174.               self.pattern
  175.             else
  176.               @event = event
  177.               return self.moving? ? true : false
  178.             end
  179.           end
  180.         end
  181.       end
  182.     end
  183.     return false
  184.   end
  185.   #--------------------------------------------------------------------------
  186.   # ● 添加鼠标点击动画
  187.   #--------------------------------------------------------------------------
  188.   def add_animation
  189.     x, y = Mouse.get_mouse_pos
  190.     animation = Sprite.new
  191.     animation.visible = false
  192.     animation.bitmap = Bitmap.new("UI/鼠标效果序列图")
  193.     map_x = x - 10 + $game_map.display_x / 4
  194.     map_y = y - 5 + $game_map.display_y / 4
  195.     animation.src_rect.set(0, 0, 24, 13)
  196.     $鼠标效果.push([animation,0,map_x,map_y])
  197.   end
  198.   #--------------------------------------------------------------------------
  199.   # ● 开始移动
  200.   #--------------------------------------------------------------------------
  201.   def player_move
  202.     # 排除无效情况
  203.     unless moving? or $game_system.map_interpreter.running? or
  204.       @move_route_forcing or $game_temp.message_window_showing
  205.       # 若没有完成路径
  206.       if @steps != nil and @paths != nil and @steps <= @paths.size
  207.         # 判断路径
  208.         case @paths[@steps]
  209.         when 6
  210.           move_right
  211.           @steps += 1
  212.         when 4
  213.           move_left
  214.           @steps += 1
  215.         when 2
  216.           move_down
  217.           @steps += 1
  218.         when 8
  219.           move_up
  220.           @steps += 1
  221.         when 1
  222.           move_lower_left
  223.           @steps += 1
  224.         when 3
  225.           move_lower_right
  226.           @steps += 1
  227.         when 7
  228.           move_upper_left
  229.           @steps += 1
  230.         when 9
  231.           move_upper_right
  232.           @steps += 1
  233.         end
  234.         # 若存在未开启事件
  235.         if @event != nil
  236.           way_x = self.x - @event.x
  237.           way_y = self.y - @event.y
  238.           if way_x.abs + way_y.abs <= 8
  239.             # 角色面向事件
  240.             self.turn_toward_player(@event)
  241.             # 矫正主角姿势
  242.             self.straighten
  243.             # 开启事件
  244.             @event.start
  245.             # 终止路径
  246.             @paths = nil
  247.             return
  248.           end
  249.         end
  250.       end
  251.     end
  252.   end
  253.   #--------------------------------------------------------------------------
  254.   # ● 跟随/转向
  255.   #--------------------------------------------------------------------------
  256.   def follow(move = true)
  257.     # 禁止移动的情况下返回
  258.     return if !System.whether_move
  259.     # 选择主角的情况下
  260.     if $select_player
  261.       for i in $鼠标效果
  262.         Picture.dispose(i[0])
  263.       end
  264.       return
  265.     end
  266.     # 鼠标在移动或者转向的情况下
  267.     x, y = Mouse.get_mouse_pos
  268.     # 鼠标在移动中的情况下
  269.     if @mouse_x != x or @mouse_y != y or @display_x != $game_map.display_x or @display_y != $game_map.display_y
  270.       # 添加点击动画
  271.       add_animation if move
  272.       # 获取角色位置
  273.       self_x = self.screen_x
  274.       self_y = self.screen_y
  275.       # 排除无效情况
  276.       unless moving? or $game_system.map_interpreter.running? or
  277.         @move_route_forcing or $game_temp.message_window_showing
  278.         if x > self_x
  279.           if y - self_y > - 0.4 * (x - self_x) and y - self_y < 0.4 * (x - self_x)
  280.             move_right if move
  281.             @direction = 6
  282.           end
  283.           if y - self_y > 0.4 * (x - self_x) and y - self_y < 2.4 * (x - self_x)
  284.             move_lower_right if move
  285.             @direction = 3
  286.           end
  287.           if y - self_y < - 0.4 * (x - self_x) and y - self_y > - 2.4 * (x - self_x)
  288.             move_upper_right if move
  289.             @direction = 9
  290.           end
  291.           if y - self_y > 2.4 * (x - self_x)
  292.             move_down if move
  293.             @direction = 2
  294.           end
  295.           if y - self_y < - 2.4 * (x - self_x)
  296.             move_up if move
  297.             @direction = 8
  298.           end
  299.         end
  300.         if x < self_x
  301.           if y - self_y > - 0.4 * (self_x - x) and y - self_y < 0.4 * (self_x - x)
  302.             move_left if move
  303.             @direction = 4
  304.           end
  305.           if y - self_y > 0.4 * (self_x - x) and y - self_y < 2.4 * (self_x - x)
  306.             move_lower_left if move
  307.             @direction = 1
  308.           end
  309.           if y - self_y < - 0.4 * (self_x - x) and y - self_y > - 2.4 * (self_x - x)
  310.             move_upper_left if move
  311.             @direction = 7
  312.           end
  313.           if y - self_y > 2.4 * (self_x - x)
  314.             move_down if move
  315.             @direction = 2
  316.           end
  317.           if y - self_y < - 2.4 * (self_x - x)
  318.             move_up if move
  319.             @direction = 8
  320.           end
  321.         end
  322.       end
  323.       # 记忆变量
  324.       @mouse_x,@mouse_y = Mouse.get_mouse_pos
  325.       @display_x = $game_map.display_x
  326.       @display_y = $game_map.display_y
  327.     end
  328.   end
  329. end
复制代码
xp vx va mv  va mz 各类型脚本/插件定制
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-14 18:58

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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