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

Project1

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

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

[复制链接]

Lv4.逐梦者

梦石
0
星屑
8498
在线时间
775 小时
注册时间
2017-11-10
帖子
1231
跳转到指定楼层
1
发表于 2017-12-12 21:25:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

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



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


一个只会简单事件的Rm新人,脚本完全不懂。只求做个简单的游戏完成自己的游戏之梦而已。
第一个游戏已经完成,等待各素材的完成和测试。

Lv4.逐梦者

梦石
0
星屑
12157
在线时间
4435 小时
注册时间
2014-4-11
帖子
5955

开拓者

2
发表于 2017-12-12 21:30:10 | 只看该作者
使用自动寻路脚本,论坛应该可以搜索得到。
不过事件要是多,地图要是大,是会变卡的。
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (版主)

梦石
1
星屑
23999
在线时间
3339 小时
注册时间
2011-7-8
帖子
3926

开拓者

3
发表于 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 网络脚本 *
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (版主)

遠航の猫咪

梦石
3
星屑
23201
在线时间
2387 小时
注册时间
2005-10-15
帖子
1166

开拓者

4
发表于 2017-12-13 00:16:50 | 只看该作者
事件向移动呗

事件向移动:使用方法为,将移动路线改为自定义,然后在脚本里写"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



点评

明白,感谢前辈。  发表于 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] 到本站一游。
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
5039
在线时间
1780 小时
注册时间
2012-7-3
帖子
1799

开拓者

5
发表于 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开心呀
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
12157
在线时间
4435 小时
注册时间
2014-4-11
帖子
5955

开拓者

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

点评

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

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
33489
在线时间
5108 小时
注册时间
2012-11-19
帖子
4878

开拓者

7
发表于 2017-12-13 21:16:01 | 只看该作者
本帖最后由 芯☆淡茹水 于 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。
然后两个事件页设置如下(注意停止时需要 并行处理)




点评

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

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-27 14:46

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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