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

Project1

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

[已经过期] 让事件开启后,角色随机方向退后一步?

[复制链接]

Lv3.寻梦者

梦石
0
星屑
1556
在线时间
626 小时
注册时间
2010-8-5
帖子
451
跳转到指定楼层
1
发表于 2015-10-8 17:36:08 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
下面是我的鼠标脚本。因为目前有一个问题:鼠标开启事件的时候,如果角色是贴着NPC的,那么只要鼠标打开事件一次,那么这个事件就会无线循环
另外,现在开启事件的话, 是距离7以内的事件直接打开。但是难免会有角色贴着NPC的情况。那么上面的问题就来了,
然后我个人想个方法,就是让他开启事件后,让角色随机方向退后一步[与NPC拉开距离].....原谅我这神逻辑,当然有其他的解决方法更好啦
RUBY 代码复制
  1. #==============================================================================
  2. # ■ Game_Player
  3. #------------------------------------------------------------------------------
  4. #  处理主角的类。事件启动的判定、以及地图的滚动等功能。
  5. # 本类的实例请参考 $game_player。
  6. #==============================================================================
  7.  
  8. class Game_Player < Game_Character
  9.   if @self_alias == nil
  10.     alias self_update update
  11.     @self_alias = true
  12.   end
  13.   #--------------------------------------------------------------------------
  14.   # X☆R 添加:鼠标指向位置是否是NPC
  15.   #--------------------------------------------------------------------------
  16.   def get_npc
  17.     x, y = Mouse.get_mouse_pos
  18.     for event in $game_map.events.values
  19.       #next if event.character_name == ""
  20.       if x > event.screen_x - 16 and x < event.screen_x + 16 and
  21.        y > event.screen_y - 64 and y < event.screen_y
  22.         return event
  23.       end
  24.     end
  25.     return nil
  26.   end
  27.   #--------------------------------------------------------------------------
  28.   # ● 完整鼠标系统
  29.   #--------------------------------------------------------------------------
  30.   def update
  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.     seek_path
  40.     # 当持续按下鼠标左键时
  41.     if Mouse.press?(0x01)
  42.       return if !System.whether_move
  43.       @count = 20 if @count.nil?
  44.       @count -= 1
  45.       if @count <= 0
  46.         @self_state = 2
  47.         @count = nil
  48.       end
  49.       follow(true) if @self_state != 2 and @count < 18
  50.     elsif Mouse.trigger?(0x02)
  51.       @self_state = 0
  52.       follow(false)
  53.     else
  54.       @count = 20
  55.     end
  56.     # 移动
  57.     if @self_state == 1
  58.       player_move
  59.     elsif @paths != nil and @self_state == 2
  60.       follow(true)
  61.     end
  62.     # 别名
  63.     self_update
  64.   end
  65.   #--------------------------------------------------------------------------
  66.   # ● 搜索路径
  67.   #--------------------------------------------------------------------------
  68.   def seek_path
  69.     # 获取鼠标在画面的坐标
  70.     x, y = Mouse.get_mouse_pos
  71.     # 当按下鼠标左键时
  72.     if Mouse.trigger?(0x01)
  73.       # 禁止移动的情况下返回
  74.       return if !System.whether_move
  75.       # 排除各种无效的情况
  76.       unless $game_system.map_interpreter.running? or
  77.         @move_route_forcing or $game_temp.message_window_showing
  78.         # 获取目标点
  79.         trg_x = (x + $game_map.display_x / 4) / 32
  80.         trg_y = (y + $game_map.display_y / 4) / 32
  81.         # 目标点不可以通行的情况下返回
  82.         return unless target_passable?(trg_x,trg_y)
  83.         # 初始化未开启事件
  84.         @event = nil
  85.         # 判断是否可以打开事件
  86.         event_start = check_event_custom_start(x, y)
  87.         # 若不能开启事件
  88.         if !event_start
  89.           # 初始化
  90.           @paths = []
  91.           @steps = 0
  92.           @self_state = 1
  93.           # 若存在未开启事件
  94.           if @event != nil
  95.             trg_x,trg_y = @event.x,@event.y
  96.           end
  97.           # 若目标不为自身则开始寻路
  98.           if trg_x != self.x or trg_y != self.y
  99.             # 添加点击动画
  100.             add_animation if @event.nil?
  101.             # 获得路径
  102.             @paths = Find_Path.new.find_player_short_path(trg_x, trg_y, x, y)
  103.           end
  104.         else
  105.           # 角色面向事件
  106.           self.turn_toward_player(@event) if !@event.nil? and !self.moving?
  107.           @steps = @paths = nil
  108.         end
  109.       end
  110.     end
  111.   end
  112.   #--------------------------------------------------------------------------
  113.   # ● 可以通行判定
  114.   #     x : X 坐标
  115.   #     y : Y 坐标
  116.   #--------------------------------------------------------------------------
  117.   def target_passable?(x, y)
  118.     # 获取地图通行表
  119.     passages = $data_tilesets[$game_map.tileset_id].passages
  120.     # 从层按从上到下的顺序调查循环
  121.     for i in [2, 1, 0]
  122.       # 取得元件 ID
  123.       tile_id = $game_map.data[x, y, i]
  124.       # 取得元件 ID 失败
  125.       if tile_id == nil
  126.         # 不能通行
  127.         return false
  128.       # 如果全方向的障碍物的接触被设置的情况下
  129.       elsif passages[tile_id] & 0x0f == 0x0f
  130.         # 不能通行
  131.         return false
  132.       # 这以外的优先度为 0 的情况下
  133.       elsif $game_map.priorities[tile_id] == 0
  134.         # 可以通行
  135.         return true
  136.       end
  137.     end
  138.     # 可以通行
  139.     return true
  140.   end
  141.   #--------------------------------------------------------------------------
  142.   # ● 判断是否可以打开事件
  143.   #--------------------------------------------------------------------------
  144.   def check_event_custom_start(x, y)
  145.     # 循环检查所有事件
  146.     for event in $game_map.events.values
  147.       bitmap = RPG::Cache.character(event.character_name,event.character_hue)
  148.       cw = bitmap.width / 8#event.animation_frame
  149.       ch = bitmap.height / 8#event.direction_frame
  150.       _x = event.screen_x
  151.       _y = event.screen_y
  152.       d = event.direction
  153.       case event.direction_frame
  154.       when 4
  155.         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
  156.       when 8
  157.         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
  158.       end
  159.       if x >= _x - cw / 2 and x <= _x + cw / 2 and y >= _y - ch and y <= _y and
  160.         bitmap.get_pixel(x - _x + cw / 2 + event.pattern * cw, y - _y + ch + sy * ch).alpha > 0
  161.         for i in 0...event.list.size
  162.           if ["Item", "Npc"].include?(event.list[i].parameters[0])
  163.             way_x = self.x - event.x
  164.             way_y = self.y - event.y
  165.             if way_x.abs + way_y.abs <= 8 and !self.moving?
  166.               # 矫正主角姿势
  167.               self.straighten
  168.               # 角色面向事件
  169.  
  170.               # 开启事件
  171.               event.start
  172.               return true
  173.               self.pattern
  174.             else
  175.               @event = event
  176.               return self.moving? ? true : false
  177.             end
  178.           end
  179.         end
  180.       end
  181.     end
  182.     return false
  183.   end
  184.   #--------------------------------------------------------------------------
  185.   # ● 添加鼠标点击动画
  186.   #--------------------------------------------------------------------------
  187.   def add_animation
  188.     x, y = Mouse.get_mouse_pos
  189.     animation = Sprite.new
  190.     animation.visible = false
  191.     animation.bitmap = Bitmap.new("UI/鼠标效果序列图")
  192.     map_x = x - 10 + $game_map.display_x / 4
  193.     map_y = y - 5 + $game_map.display_y / 4
  194.     animation.src_rect.set(0, 0, 24, 13)
  195.     $鼠标效果.push([animation,0,map_x,map_y])
  196.   end
  197.   #--------------------------------------------------------------------------
  198.   # ● 开始移动
  199.   #--------------------------------------------------------------------------
  200.   def player_move
  201.     # 排除无效情况
  202.     unless moving? or $game_system.map_interpreter.running? or
  203.       @move_route_forcing or $game_temp.message_window_showing
  204.       # 若没有完成路径
  205.       if @steps != nil and @paths != nil and @steps <= @paths.size
  206.         # 判断路径
  207.         case @paths[@steps]
  208.         when 6
  209.           move_right
  210.           @steps += 1
  211.         when 4
  212.           move_left
  213.           @steps += 1
  214.         when 2
  215.           move_down
  216.           @steps += 1
  217.         when 8
  218.           move_up
  219.           @steps += 1
  220.         when 1
  221.           move_lower_left
  222.           @steps += 1
  223.         when 3
  224.           move_lower_right
  225.           @steps += 1
  226.         when 7
  227.           move_upper_left
  228.           @steps += 1
  229.         when 9
  230.           move_upper_right
  231.           @steps += 1
  232.         end
  233.         # 若存在未开启事件
  234.         if @event != nil
  235.           way_x = self.x - @event.x
  236.           way_y = self.y - @event.y
  237.           if way_x.abs + way_y.abs <= 8
  238.             # 角色面向事件
  239.             self.turn_toward_player(@event)
  240.             # 矫正主角姿势
  241.             self.straighten
  242.             # 开启事件
  243.             @event.start
  244.             # 终止路径
  245.             @paths = nil
  246.             return
  247.           end
  248.         end
  249.       end
  250.     end
  251.   end
  252.   #--------------------------------------------------------------------------
  253.   # ● 跟随/转向
  254.   #--------------------------------------------------------------------------
  255.   def follow(move = true)
  256.     # 禁止移动的情况下返回
  257.     return if !System.whether_move
  258.     # 选择主角的情况下
  259.     if $select_player
  260.       for i in $鼠标效果
  261.         Picture.dispose(i[0])
  262.       end
  263.       return
  264.     end
  265.     # 鼠标在移动或者转向的情况下
  266.     x, y = Mouse.get_mouse_pos
  267.     # 鼠标在移动中的情况下
  268.     if @mouse_x != x or @mouse_y != y or @display_x != $game_map.display_x or @display_y != $game_map.display_y
  269.       # 添加点击动画
  270.       add_animation if move
  271.       # 获取角色位置
  272.       self_x = self.screen_x
  273.       self_y = self.screen_y
  274.       # 排除无效情况
  275.       unless moving? or $game_system.map_interpreter.running? or
  276.         @move_route_forcing or $game_temp.message_window_showing
  277.         if x > self_x
  278.           if y - self_y > - 0.4 * (x - self_x) and y - self_y < 0.4 * (x - self_x)
  279.             move_right if move
  280.             @direction = 6
  281.           end
  282.           if y - self_y > 0.4 * (x - self_x) and y - self_y < 2.4 * (x - self_x)
  283.             move_lower_right if move
  284.             @direction = 3
  285.           end
  286.           if y - self_y < - 0.4 * (x - self_x) and y - self_y > - 2.4 * (x - self_x)
  287.             move_upper_right if move
  288.             @direction = 9
  289.           end
  290.           if y - self_y > 2.4 * (x - self_x)
  291.             move_down if move
  292.             @direction = 2
  293.           end
  294.           if y - self_y < - 2.4 * (x - self_x)
  295.             move_up if move
  296.             @direction = 8
  297.           end
  298.         end
  299.         if x < self_x
  300.           if y - self_y > - 0.4 * (self_x - x) and y - self_y < 0.4 * (self_x - x)
  301.             move_left if move
  302.             @direction = 4
  303.           end
  304.           if y - self_y > 0.4 * (self_x - x) and y - self_y < 2.4 * (self_x - x)
  305.             move_lower_left if move
  306.             @direction = 1
  307.           end
  308.           if y - self_y < - 0.4 * (self_x - x) and y - self_y > - 2.4 * (self_x - x)
  309.             move_upper_left if move
  310.             @direction = 7
  311.           end
  312.           if y - self_y > 2.4 * (self_x - x)
  313.             move_down if move
  314.             @direction = 2
  315.           end
  316.           if y - self_y < - 2.4 * (self_x - x)
  317.             move_up if move
  318.             @direction = 8
  319.           end
  320.         end
  321.       end
  322.       # 记忆变量
  323.       @mouse_x,@mouse_y = Mouse.get_mouse_pos
  324.       @display_x = $game_map.display_x
  325.       @display_y = $game_map.display_y
  326.     end
  327.   end
  328. end
头像被屏蔽

Lv1.梦旅人 (禁止访问)

梦石
0
星屑
88
在线时间
631 小时
注册时间
2014-8-4
帖子
3600
2
发表于 2015-10-8 19:01:40 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1556
在线时间
626 小时
注册时间
2010-8-5
帖子
451
3
 楼主| 发表于 2015-10-9 00:07:32 | 只看该作者
冷峻逸 发表于 2015-10-8 19:01
我的能力只能做到这样

其实方向无所谓,主要是事件开启完后,能让角色不和NPC接触。。。LS莭方法的话,会很麻烦、、因为NPC多的话。。。。。。。
回复 支持 反对

使用道具 举报

Lv4.逐梦者

水月·镜花

梦石
10
星屑
403
在线时间
1181 小时
注册时间
2005-10-22
帖子
1183

开拓者

4
发表于 2015-10-9 07:20:57 手机端发表。 | 只看该作者
我做ADV的时候也是利用角色触碰。

重复触发的事件要重复执行,可以用独立开关。首先在事件内容最后,设置移动路线-角色后退一步-等待移动结束,然后打开独立开关。第二步新建一个事件页,出现条件为独立开关打开时。这样第一页处理完,这个事件会跑到第二页而不会重复执行第一页。最后设置第二页事件内容为自动执行,关闭独立开关,这样事件就可以重新等待触发了。
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1232
在线时间
1017 小时
注册时间
2011-4-30
帖子
1516
5
发表于 2015-10-9 15:51:25 | 只看该作者
搜索  .start
试着把这些中的注释掉,看看能不能达到效果。
比如  event.start 改成 #event.start
手机作答,错了勿怪���
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-9-20 10:36

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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