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

Project1

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

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

[复制链接]

Lv1.梦旅人

梦石
0
星屑
143
在线时间
62 小时
注册时间
2015-5-24
帖子
56
跳转到指定楼层
1
发表于 2017-5-11 15:35:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 梦想始终会醒 于 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

Lv5.捕梦者

梦石
0
星屑
36462
在线时间
10800 小时
注册时间
2009-3-15
帖子
4815
2
发表于 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
回复 支持 反对

使用道具 举报

Lv1.梦旅人

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

点评

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

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
143
在线时间
62 小时
注册时间
2015-5-24
帖子
56
4
 楼主| 发表于 2017-5-11 20:10:09 | 只看该作者
soulsaga 发表于 2017-5-11 18:55
def move_toward_player
    # 求得与主角的坐标差
    sx = @x - $game_player.x

我还是新手阿.
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
36462
在线时间
10800 小时
注册时间
2009-3-15
帖子
4815
5
发表于 2017-5-11 21:37:41 | 只看该作者
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

评分

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

查看全部评分

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
143
在线时间
62 小时
注册时间
2015-5-24
帖子
56
6
 楼主| 发表于 2017-5-12 07:55:21 | 只看该作者
soulsaga 发表于 2017-5-11 21:37
def move_left(turn_enabled = true)
    # 面向左
    if turn_enabled

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

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
12612
在线时间
908 小时
注册时间
2014-10-24
帖子
321
7
发表于 2017-5-12 09:42:26 | 只看该作者
脑洞再开
如果是NPC远离玩家操纵角色固定时间或固定步数后不再逃离,改为主动接近,脚本应该如何做呢

点评

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

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-27 10:33

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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