查看: 2813|回复: 13

[已经解决] 【奇发异想】关于主角靠近NPC自动接近

[复制链接]
梦石
0
星屑
143
在线时间
62 小时
注册时间
2015-5-24
回帖
44
发表于 2017-5-11 15:35:06 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 梦想始终会醒 于 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
复制代码

@芯☆淡茹水 @芯☆淡茹水 还是艾特大佬前辈.

点评

你把$game_player 改成$game_map.events[事件id] 就行了啊,然后角色调用这个方法。  发表于 2017-5-11 18:40
梦石
0
星屑
39236
在线时间
11155 小时
注册时间
2009-3-15
回帖
4768
发表于 2017-5-11 18:55:41 | 显示全部楼层
本帖最后由 soulsaga 于 2017-5-11 20:15 编辑

我不懂脚本..

点评

之前看错了  发表于 2017-5-11 20:04
原来你是要靠近NPC啊..之前  发表于 2017-5-11 20:03
感谢,你修改的是修正走路方向. 但是并没有预期的效果.  发表于 2017-5-11 19:54
回复

使用道具 举报

梦石
0
星屑
143
在线时间
62 小时
注册时间
2015-5-24
回帖
44
 楼主| 发表于 2017-5-11 19:56:14 | 显示全部楼层
@芯☆淡茹水
但是我不知道怎么获取事件ID阿.
每次调用都是不同ID. 又不能用全局变量修改. 不能随时修改事件ID阿.

点评

循环当前地图所有事件..哪个最近主角且距离小於一定值就接近如何?  发表于 2017-5-11 20:04
回复

使用道具 举报

梦石
0
星屑
143
在线时间
62 小时
注册时间
2015-5-24
回帖
44
 楼主| 发表于 2017-5-11 20:10:09 | 显示全部楼层
soulsaga 发表于 2017-5-11 18:55
def move_toward_player
    # 求得与主角的坐标差
    sx = @x - $game_player.x

我还是新手阿.
回复

使用道具 举报

梦石
0
星屑
39236
在线时间
11155 小时
注册时间
2009-3-15
回帖
4768
发表于 2017-5-11 21:37:41 | 显示全部楼层
[pre lang="ruby"]def move_left(turn_enabled = true)
    # 面向左
    if turn_enabled
      turn_left
    end
    # 可以通行的情況下
    if passable?(@x, @y, 4)
      # 面向左
      turn_left
      # 更新座標
      @x -= 1
      # 增加步數
      increase_steps
      move_toward_npc
    # 不能通行的情況下
    else
      # 接觸事件的啟動判定
      check_event_trigger_touch(@x-1, @y)
    end
  end[/pre]
调用以下方法
其他方向移动也是照样样加个方法
[pre lang="ruby"]# ● 接近NPC
  #--------------------------------------------------------------------------
  def move_toward_npc
    nsx = []
    nsy = []
    tsx = []
    tsy = []
    nxy = []
    #p $game_map.events[1]
    for i in 1..$game_map.events.id.size-1
    nsx.push(@x.abs - $game_map.events.x.abs)
    nsy.push(@y.abs - $game_map.events.y.abs)
    tsx.push($game_map.events.x)
    tsy.push($game_map.events.y)
  end
    for i in 0..nsx.size-1
    nxy.push(nsx+nsy)
  end
    for i in 0..nxy.size-1
    if nxy == nxy.min
    #npcxy = i
    tnpcx = tsx
    tnpcy = tsy
    break
    end
    end
    # 求得与npc的坐标差
    sx = @x - tnpcx
    sy = @y - tnpcy
    #p tnpcy
    # 坐标相等情况下
    if sx == 0 and sy == 0
      return
    end
    # 求得差的绝对值
    abs_sx = sx.abs
    abs_sy = sy.abs
    # 横距离与纵距离相等的情况下
    if abs_sx == abs_sy
      # 随机将边数增加 1
      rand(2) == 0 ? abs_sx += 1 : abs_sy += 1
    end
    # 横侧距离长的情况下
    if abs_sx <= 2
      # 左右方向优先。向NPC移动
      sx > 0 ? move_left : move_right
      if not moving? and sy != 0
        sy > 0 ? move_up : move_down
      end
    # 竖侧距离长的情况下
    elsif abs_sy <= 2
      # 上下方向优先。向NPC移动
      sy > 0 ? move_up : move_down
      if not moving? and sx != 0
        sx > 0 ? move_left : move_right
      end
    end
  end[/pre]

评分

参与人数 1梦石 +1 收起 理由
RyanBern + 1 认可答案

查看全部评分

回复

使用道具 举报

梦石
0
星屑
143
在线时间
62 小时
注册时间
2015-5-24
回帖
44
 楼主| 发表于 2017-5-12 07:55:21 | 显示全部楼层
soulsaga 发表于 2017-5-11 21:37
def move_left(turn_enabled = true)
    # 面向左
    if turn_enabled

非常感谢前辈不烦的写了一些代码,刚调用方法是成功的. 学习了.
回复

使用道具 举报

梦石
0
星屑
14802
在线时间
1014 小时
注册时间
2014-10-24
回帖
325
发表于 2017-5-12 09:42:26 | 显示全部楼层
脑洞再开
如果是NPC远离玩家操纵角色固定时间或固定步数后不再逃离,改为主动接近,脚本应该如何做呢

点评

远离  发表于 2017-5-12 11:04
大概就是靠近玩家和远玩家组合再加些判断吧?  发表于 2017-5-12 11:04
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部