Project1

标题: 【奇发异想】关于主角靠近NPC自动接近 [打印本页]

作者: 梦想始终会醒    时间: 2017-5-11 15:35
标题: 【奇发异想】关于主角靠近NPC自动接近
本帖最后由 梦想始终会醒 于 2017-5-11 15:43 编辑

今天突然奇发异想.
RM的自定义中, 拥有的是 NPC 靠近 主角. 和 远离 主角.

那否也可以让主角接近NPC时,靠近NPC. (已知鼠标系统有这个算法.)
但是是否也可以从下面的代码从中修改出主角接近NPC时,靠近NPC?

  1. def move_toward_player
  2.     # 求得与主角的坐标差
  3.     sx = @x - $game_player.x
  4.     sy = @y - $game_player.y
  5.     # 坐标相等情况下
  6.     if sx == 0 and sy == 0
  7.       return
  8.     end
  9.     # 求得差的绝对值
  10.     abs_sx = sx.abs
  11.     abs_sy = sy.abs
  12.     # 横距离与纵距离相等的情况下
  13.     if abs_sx == abs_sy
  14.       # 随机将边数增加 1
  15.       rand(2) == 0 ? abs_sx += 1 : abs_sy += 1
  16.     end
  17.     # 横侧距离长的情况下
  18.     if abs_sx > abs_sy
  19.       # 左右方向优先。向主角移动
  20.       sx > 0 ? move_left : move_right
  21.       if not moving? and sy != 0
  22.         sy > 0 ? move_up : move_down
  23.       end
  24.     # 竖侧距离长的情况下
  25.     else
  26.       # 上下方向优先。向主角移动
  27.       sy > 0 ? move_up : move_down
  28.       if not moving? and sx != 0
  29.         sx > 0 ? move_left : move_right
  30.       end
  31.     end
  32.   end
复制代码

@芯☆淡茹水 @芯☆淡茹水 还是艾特大佬前辈.
作者: soulsaga    时间: 2017-5-11 18:55
本帖最后由 soulsaga 于 2017-5-11 20:15 编辑

我不懂脚本..
作者: 梦想始终会醒    时间: 2017-5-11 19:56
@芯☆淡茹水
但是我不知道怎么获取事件ID阿.
每次调用都是不同ID. 又不能用全局变量修改. 不能随时修改事件ID阿.
作者: 梦想始终会醒    时间: 2017-5-11 20:10
soulsaga 发表于 2017-5-11 18:55
def move_toward_player
    # 求得与主角的坐标差
    sx = @x - $game_player.x

我还是新手阿.
作者: soulsaga    时间: 2017-5-11 21:37
RUBY 代码复制
  1. def move_left(turn_enabled = true)
  2.     # 面向左
  3.     if turn_enabled
  4.       turn_left
  5.     end
  6.     # 可以通行的情況下
  7.     if passable?(@x, @y, 4)
  8.       # 面向左
  9.       turn_left
  10.       # 更新座標
  11.       @x -= 1
  12.       # 增加步數
  13.       increase_steps
  14.       move_toward_npc
  15.     # 不能通行的情況下
  16.     else
  17.       # 接觸事件的啟動判定
  18.       check_event_trigger_touch(@x-1, @y)
  19.     end
  20.   end

调用以下方法
其他方向移动也是照样样加个方法
RUBY 代码复制
  1. # ● 接近NPC
  2.   #--------------------------------------------------------------------------
  3.   def move_toward_npc
  4.     nsx = []
  5.     nsy = []
  6.     tsx = []
  7.     tsy = []
  8.     nxy = []
  9.     #p $game_map.events[1]
  10.     for i in 1..$game_map.events.id.size-1
  11.     nsx.push(@x.abs - $game_map.events[i].x.abs)
  12.     nsy.push(@y.abs - $game_map.events[i].y.abs)
  13.     tsx.push($game_map.events[i].x)
  14.     tsy.push($game_map.events[i].y)
  15.   end
  16.     for i in 0..nsx.size-1
  17.     nxy.push(nsx[i]+nsy[i])
  18.   end
  19.     for i in 0..nxy.size-1
  20.     if nxy[i] == nxy.min
  21.     #npcxy = i
  22.     tnpcx = tsx[i]
  23.     tnpcy = tsy[i]
  24.     break
  25.     end
  26.     end
  27.     # 求得与npc的坐标差
  28.     sx = @x - tnpcx
  29.     sy = @y - tnpcy
  30.     #p tnpcy
  31.     # 坐标相等情况下
  32.     if sx == 0 and sy == 0
  33.       return
  34.     end
  35.     # 求得差的绝对值
  36.     abs_sx = sx.abs
  37.     abs_sy = sy.abs
  38.     # 横距离与纵距离相等的情况下
  39.     if abs_sx == abs_sy
  40.       # 随机将边数增加 1
  41.       rand(2) == 0 ? abs_sx += 1 : abs_sy += 1
  42.     end
  43.     # 横侧距离长的情况下
  44.     if abs_sx <= 2
  45.       # 左右方向优先。向NPC移动
  46.       sx > 0 ? move_left : move_right
  47.       if not moving? and sy != 0
  48.         sy > 0 ? move_up : move_down
  49.       end
  50.     # 竖侧距离长的情况下
  51.     elsif abs_sy <= 2
  52.       # 上下方向优先。向NPC移动
  53.       sy > 0 ? move_up : move_down
  54.       if not moving? and sx != 0
  55.         sx > 0 ? move_left : move_right
  56.       end
  57.     end
  58.   end

作者: 梦想始终会醒    时间: 2017-5-12 07:55
soulsaga 发表于 2017-5-11 21:37
def move_left(turn_enabled = true)
    # 面向左
    if turn_enabled

非常感谢前辈不烦的写了一些代码,刚调用方法是成功的. 学习了.
作者: 雾影药师    时间: 2017-5-12 09:42
脑洞再开
如果是NPC远离玩家操纵角色固定时间或固定步数后不再逃离,改为主动接近,脚本应该如何做呢




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