Project1

标题: 如何做到飞鸟到了夜间时回巢休息的效果? [打印本页]

作者: 文雅夕露    时间: 2017-12-12 21:25
标题: 如何做到飞鸟到了夜间时回巢休息的效果?
这是个飞鸟的事件,白天的时候就是在地图上随机飞行。



但到了夜间,变量等于3的时候就会回巢(地图固定的位置)休息。
因为随机移动的影响所以无法计算它具体的位置,
请教该怎么设置才能实现效果?



作者: yang1zhi    时间: 2017-12-12 21:30
使用自动寻路脚本,论坛应该可以搜索得到。
不过事件要是多,地图要是大,是会变卡的。
作者: guoxiaomi    时间: 2017-12-12 23:52
飞鸟应该是穿透的,所以不需要寻路,直接飞到目的地就OK。
关于自定义路线的方法:
先写这样的一个函数,具体的内容照抄 move_toward_player,

  1. class Game_Character
  2.   def move_toward_pos(x, y)
  3.     ...
  4.   end
  5. end
复制代码

然后设置事件的移动模式:自定义,脚本:move_toward_pos(10, 10)

就会飞回 10, 10 的位置,同样也可以在里面进行一些其他的路线设置。



作者: SailCat    时间: 2017-12-13 00:16
事件向移动呗

事件向移动:使用方法为,将移动路线改为自定义,然后在脚本里写"move_type_toward_event(事件ID)
那个事件ID就是你的巢穴ID,它会自己回去的,因为鸟是穿透的

RUBY 代码复制
  1. class Game_Character[/font]
  2.   #--------------------------------------------------------------------------
  3.   # ● 移动类型 : 接近事件
  4.   #    event_id : 事件编号
  5.   #--------------------------------------------------------------------------
  6.   def move_type_toward_event(event_id, sight = 20, ai = 6)
  7.     # 求得与事件坐标的差
  8.     sx = @x - $game_map.events[event_id].x
  9.     sy = @y - $game_map.events[event_id].y
  10.     # 求得差的绝对值
  11.     abs_sx = sx > 0 ? sx : -sx
  12.     abs_sy = sy > 0 ? sy : -sy
  13.     # 如果方圆超过了视野
  14.     if abs_sx ** 2 + abs_sy ** 2 >= sight ** 2
  15.       # 随机
  16.       move_random
  17.       return
  18.     end
  19.     # 随机 0~5 的分支
  20.     case rand(ai)
  21.     when 0..3  # 接近事件
  22.       move_toward_event(event_id)
  23.     when 4  # 随机
  24.       move_random
  25.     when 5  # 前进一步
  26.       move_forward
  27.     end
  28.   end
  29.   #--------------------------------------------------------------------------
  30.   # ● 接近事件
  31.   #    event_id : 事件编号
  32.   #--------------------------------------------------------------------------
  33.   def move_toward_event(event_id)
  34.     # 求得与事件的坐标差
  35.     sx = @x - $game_map.events[event_id].x
  36.     sy = @y - $game_map.events[event_id].y
  37.     # 坐标相等情况下
  38.     if sx == 0 and sy == 0
  39.       return
  40.     end
  41.     # 求得差的绝对值
  42.     abs_sx = sx.abs
  43.     abs_sy = sy.abs
  44.     # 横距离与纵距离相等的情况下
  45.     if abs_sx == abs_sy
  46.       # 随机将边数增加 1
  47.       rand(2) == 0 ? abs_sx += 1 : abs_sy += 1
  48.     end
  49.     # 横侧距离长的情况下
  50.     if abs_sx > abs_sy
  51.       # 左右方向优先。向事件移动
  52.       sx > 0 ? move_left : move_right
  53.       if not moving? and sy != 0
  54.         sy > 0 ? move_up : move_down
  55.       end
  56.     # 竖侧距离长的情况下
  57.     else
  58.       # 上下方向优先。向事件移动
  59.       sy > 0 ? move_up : move_down
  60.       if not moving? and sx != 0
  61.         sx > 0 ? move_left : move_right
  62.       end
  63.     end
  64.   end
  65. end




作者: defisym    时间: 2017-12-13 19:21
没有必要处理的那么复杂
判定主角和鸟巢的距离,在小于一定阈值的时候在夜晚的时候将白天的鸟儿销毁(保险起见可以先让他们远离主角移动)
同时在主角刚好看不见的地方创建归巢的鸟儿(移动),由于创建的点是你手动设定的,所以移动路线也是可以手动设定的,只需要设定两到三个起始位置和回家路线并且随机调用即可
合理调整阈值就可以了,这种处理方式相对来说要更加节约机能,实现起来也更简单一些
当然遇到那种无聊一直追着鸟走的就没办法了(比如说我(逃)
作者: yang1zhi    时间: 2017-12-13 19:53
简单点的就是显示个切换时间的图片,然后把白天的事件全都消掉,然后图片消失
作者: 芯☆淡茹水    时间: 2017-12-13 21:16
本帖最后由 芯☆淡茹水 于 2017-12-13 21:18 编辑

    这个效果有点233,

随手改造了一下:
RUBY 代码复制
  1. #==============================================================================
  2. class Game_Event < Game_Character
  3.   #变量ID
  4.   VAR_ID = 1
  5.   #变量值(大于或等于:停止)
  6.   VAR_NUM = 3
  7.   #--------------------------------------------------------------------------
  8.   def is_bird?
  9.     return false if @list.nil? || @list[0].code != 108
  10.     return @list[0].parameters[0].match(/<Location:(\S+)>/) != nil
  11.   end
  12.   #--------------------------------------------------------------------------
  13.   def target_location
  14.     return [0,0] if @list.nil? || @list[0].code != 108
  15.     return [0,0] if !@list[0].parameters[0].match(/<Location:(\S+)>/)
  16.     data = $1.split(",")
  17.     return [data[0].to_i,data[1].to_i]
  18.   end
  19.   #--------------------------------------------------------------------------
  20.   def land?
  21.     return is_bird? && $game_variables[VAR_ID] >= VAR_NUM
  22.   end
  23. end
  24. #==============================================================================
  25. class Game_Character
  26.   #--------------------------------------------------------------------------
  27.   alias xrdata_move_type_random move_type_random
  28.   def move_type_random
  29.     if self.is_a?(Game_Event) && land?
  30.       moveto_target
  31.       return
  32.     end
  33.     xrdata_move_type_random
  34.   end
  35.   #--------------------------------------------------------------------------
  36.   def moveto_target
  37.     sx = @x - target_location[0]
  38.     sy = @y - target_location[1]
  39.     # 坐标相等情况下
  40.     if sx == 0 and sy == 0
  41.       key = [$game_map.map_id, @id, "A"]
  42.       $game_self_switches[key] = $game_map.need_refresh = true
  43.       return
  44.     end
  45.     # 求得差的绝对值
  46.     abs_sx = sx.abs
  47.     abs_sy = sy.abs
  48.     # 横距离与纵距离相等的情况下
  49.     if abs_sx == abs_sy
  50.       # 随机将边数增加 1
  51.       rand(2) == 0 ? abs_sx += 1 : abs_sy += 1
  52.     end
  53.     # 横侧距离长的情况下
  54.     if abs_sx > abs_sy
  55.       # 左右方向优先。向主角移动
  56.       sx > 0 ? move_left : move_right
  57.       if not moving? and sy != 0
  58.         sy > 0 ? move_up : move_down
  59.       end
  60.     # 竖侧距离长的情况下
  61.     else
  62.       # 上下方向优先。向主角移动
  63.       sy > 0 ? move_up : move_down
  64.       if not moving? and sx != 0
  65.         sx > 0 ? move_left : move_right
  66.       end
  67.     end
  68.   end
  69. end
  70. #==============================================================================



需要在飞行事件的飞行状态那一页,事件第一行注释:<Location:x,y>
表示需要停止时飞向的坐标(没注释就不能停止飞)。飞到目标自动打开独立开关A。
然后两个事件页设置如下(注意停止时需要 并行处理)









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