查看: 3068|回复: 17

[已经解决] 如何做到飞鸟到了夜间时回巢休息的效果?

[复制链接]
梦石
0
星屑
8498
在线时间
775 小时
注册时间
2017-11-10
回帖
1074
发表于 2017-12-12 21:25:25 | 显示全部楼层 |阅读模式

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

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

×
这是个飞鸟的事件,白天的时候就是在地图上随机飞行。



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


一个只会简单事件的Rm新人,脚本完全不懂。只求做个简单的游戏完成自己的游戏之梦而已。
第一个游戏已经完成,等待各素材的完成和测试。
梦石
0
星屑
12161
在线时间
4435 小时
注册时间
2014-4-11
回帖
5616

开拓者

发表于 2017-12-12 21:30:10 | 显示全部楼层
使用自动寻路脚本,论坛应该可以搜索得到。
不过事件要是多,地图要是大,是会变卡的。
回复

使用道具 举报

梦石
1
星屑
24088
在线时间
3339 小时
注册时间
2011-7-8
回帖
3862

开拓者

发表于 2017-12-12 23:52:16 | 显示全部楼层
飞鸟应该是穿透的,所以不需要寻路,直接飞到目的地就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 的位置,同样也可以在里面进行一些其他的路线设置。


评分

参与人数 1赞 +1 收起 理由
文雅夕露 + 1 塞糖

查看全部评分

熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复

使用道具 举报

遠航の猫咪

梦石
3
星屑
26947
在线时间
2423 小时
注册时间
2005-10-15
回帖
987

开拓者

发表于 2017-12-13 00:16:50 | 显示全部楼层
事件向移动呗

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

[pre lang="ruby"]class Game_Character
  #--------------------------------------------------------------------------
  # ● 移动类型 : 接近事件
  #    event_id : 事件编号
  #--------------------------------------------------------------------------
  def move_type_toward_event(event_id, sight = 20, ai = 6)
    # 求得与事件坐标的差
    sx = @x - $game_map.events[event_id].x
    sy = @y - $game_map.events[event_id].y
    # 求得差的绝对值
    abs_sx = sx > 0 ? sx : -sx
    abs_sy = sy > 0 ? sy : -sy
    # 如果方圆超过了视野
    if abs_sx ** 2 + abs_sy ** 2 >= sight ** 2
      # 随机
      move_random
      return
    end
    # 随机 0~5 的分支
    case rand(ai)
    when 0..3  # 接近事件
      move_toward_event(event_id)
    when 4  # 随机
      move_random
    when 5  # 前进一步
      move_forward
    end
  end
  #--------------------------------------------------------------------------
  # ● 接近事件
  #    event_id : 事件编号
  #--------------------------------------------------------------------------
  def move_toward_event(event_id)
    # 求得与事件的坐标差
    sx = @x - $game_map.events[event_id].x
    sy = @y - $game_map.events[event_id].y
    # 坐标相等情况下
    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 > abs_sy
      # 左右方向优先。向事件移动
      sx > 0 ? move_left : move_right
      if not moving? and sy != 0
        sy > 0 ? move_up : move_down
      end
    # 竖侧距离长的情况下
    else
      # 上下方向优先。向事件移动
      sy > 0 ? move_up : move_down
      if not moving? and sx != 0
        sx > 0 ? move_left : move_right
      end
    end
  end
end[/pre]


点评

明白,感谢前辈。  发表于 2017-12-13 20:15
那个是因为ai=6造成的随机效果,设置为4就可以了,即move_type_toward_event(事件ID,100,4)  发表于 2017-12-13 20:10
具体执行操作时,会围绕这鸟巢事件飞,并不会在鸟巢停下...  发表于 2017-12-13 19:46

评分

参与人数 3星屑 +70 赞 +3 收起 理由
RyanBern + 70 + 1 认可答案
文雅夕露 + 1 精品文章
guoxiaomi + 1 塞糖

查看全部评分

SailCat (小猫子·要开心一点) 共上站 24 次,发表过 11 篇文章 上 次 在: [2006年01月28日11:41:18 星期六] 从 [162.105.120.91] 到本站一游。
回复

使用道具 举报

梦石
0
星屑
5037
在线时间
1780 小时
注册时间
2012-7-3
回帖
1749

开拓者

发表于 2017-12-13 19:21:14 | 显示全部楼层
没有必要处理的那么复杂
判定主角和鸟巢的距离,在小于一定阈值的时候在夜晚的时候将白天的鸟儿销毁(保险起见可以先让他们远离主角移动)
同时在主角刚好看不见的地方创建归巢的鸟儿(移动),由于创建的点是你手动设定的,所以移动路线也是可以手动设定的,只需要设定两到三个起始位置和回家路线并且随机调用即可
合理调整阈值就可以了,这种处理方式相对来说要更加节约机能,实现起来也更简单一些
当然遇到那种无聊一直追着鸟走的就没办法了(比如说我(逃)

点评

嗯,设定两到三个不同位置不同移动路线的事件点,随机触发其中一个,这个数量只要玩家不刻意盯着看一般都发现不了_(:з」∠)_  发表于 2017-12-13 20:46
大概明白了,就是让主角靠近鸟巢时触发鸟巢旁的事件,让鸟回来吧...  发表于 2017-12-13 20:21
夜晚的时候首先将白天的事件在主角视野外的时候销毁,随后在主角来到鸟巢附近的时候激活回巢事件,回巢事件被激活的时候在主角的视野外  发表于 2017-12-13 20:06
说白了就是手动设定1~2个回家的事件,并且在主角离鸟巢足够近的时候触发,如果玩家不是非常刻意的追着鸟看的话不会在意它并不是全局寻路的  发表于 2017-12-13 20:05
不太明白前辈说的意思...  发表于 2017-12-13 19:44
Project Ktr进行中:
   
------------------
→SRPG开发之六-天气与地形互动
→→围观
→→→去Lofter围观
------------------
离经叛道的扯淡者/伪独立游戏爱好者/Decade Studio(?)/造轮子真TM开心呀
回复

使用道具 举报

梦石
0
星屑
12161
在线时间
4435 小时
注册时间
2014-4-11
回帖
5616

开拓者

发表于 2017-12-13 19:53:47 | 显示全部楼层
简单点的就是显示个切换时间的图片,然后把白天的事件全都消掉,然后图片消失

点评

其实这个是最有效率且冲突最小的。我就常这么干,不过既然楼下有好方法,用那个吧。  发表于 2017-12-14 10:49
这做法好懒...  发表于 2017-12-13 20:21
回复

使用道具 举报

梦石
0
星屑
34459
在线时间
5096 小时
注册时间
2012-11-19
回帖
4715

开拓者

发表于 2017-12-13 21:16:01 | 显示全部楼层
本帖最后由 芯☆淡茹水 于 2017-12-13 21:18 编辑

    这个效果有点233,

随手改造了一下:
[pre lang="ruby"]#==============================================================================
class Game_Event < Game_Character
  #变量ID
  VAR_ID = 1
  #变量值(大于或等于:停止)
  VAR_NUM = 3
  #--------------------------------------------------------------------------
  def is_bird?
    return false if @list.nil? || @list[0].code != 108
    return @list[0].parameters[0].match(/<Location:(\S+)>/) != nil
  end
  #--------------------------------------------------------------------------
  def target_location
    return [0,0] if @list.nil? || @list[0].code != 108
    return [0,0] if !@list[0].parameters[0].match(/<Location:(\S+)>/)
    data = $1.split(",")
    return [data[0].to_i,data[1].to_i]
  end
  #--------------------------------------------------------------------------
  def land?
    return is_bird? && $game_variables[VAR_ID] >= VAR_NUM
  end
end
#==============================================================================
class Game_Character
  #--------------------------------------------------------------------------
  alias xrdata_move_type_random move_type_random
  def move_type_random
    if self.is_a?(Game_Event) && land?
      moveto_target
      return
    end
    xrdata_move_type_random
  end
  #--------------------------------------------------------------------------
  def moveto_target
    sx = @x - target_location[0]
    sy = @y - target_location[1]
    # 坐标相等情况下
    if sx == 0 and sy == 0
      key = [$game_map.map_id, @id, "A"]
      $game_self_switches[key] = $game_map.need_refresh = true
      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 > abs_sy
      # 左右方向优先。向主角移动
      sx > 0 ? move_left : move_right
      if not moving? and sy != 0
        sy > 0 ? move_up : move_down
      end
    # 竖侧距离长的情况下
    else
      # 上下方向优先。向主角移动
      sy > 0 ? move_up : move_down
      if not moving? and sx != 0
        sx > 0 ? move_left : move_right
      end
    end
  end
end
#==============================================================================[/pre]


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

2.PNG

点评

-.-!  发表于 2017-12-13 22:40

评分

参与人数 2星屑 +70 赞 +1 收起 理由
RyanBern + 70 认可答案
文雅夕露 + 1 感谢前辈优化

查看全部评分

xp vx va mv  va mz 各类型脚本/插件定制
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部