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

Project1

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

[已经解决] 请问如何制作不能被NPC对上眼的游戏?

[复制链接]

Lv2.观梦者

梦石
0
星屑
518
在线时间
141 小时
注册时间
2016-12-17
帖子
52
跳转到指定楼层
1
发表于 2017-2-14 15:29:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 rainaz 于 2017-2-14 16:46 编辑

就是NPC面朝的方向会不断改变 若然NPC某个范围的视线内看到玩家的话将会游戏结束
请问这样的游戏能使用事件制作吗?若不能的话会有这样的脚本吗?

Lv3.寻梦者

梦石
0
星屑
3574
在线时间
2338 小时
注册时间
2015-8-25
帖子
960

开拓者

2
发表于 2017-2-14 16:27:04 | 只看该作者
有个这样的思路。

并行一个事件,记录npc的x,y坐标。记录玩家的x,y坐标。
(有多少npc就需要多少个事件。)

如果npc面向上,就判断玩家和npc的x是否相同。如果相同,就判断玩家的y是否少于npc的y.是的话,即是被发现。

其他四方向也是如此类推。

点评

8楼倒是已经提供了一个功能相当完善的脚本了。既考虑到障碍,也有扇形视野。  发表于 2017-2-16 18:58
上面提出的思路没有考虑到障碍的因素,确实是不怎么好的方案。后来也考虑过,如果要做视线功能,确实是要把范围都划好,每次移动都判断一次。  发表于 2017-2-16 18:55
可以考虑在转换方向的时候生成所有能看到的点,在玩家移动的时候判断玩家坐标是否在这个范围内。  发表于 2017-2-16 15:16
如果想要优化效率的话,就只在玩家和npc移动的时侯调用判断就好了。  发表于 2017-2-14 16:29
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3372
在线时间
1123 小时
注册时间
2015-12-24
帖子
246
3
发表于 2017-2-14 16:47:01 | 只看该作者
本帖最后由 翠靈月 于 2017-2-14 16:49 编辑

如果不考虑遮蔽物之类的东西
先假设NPC座标为6,11
触发方式设置为并行事件
设置四个条件判断
$game_map.events[@event_id].direction == 2 and $game_player.x == 6 and $game_player.y > 11
表示 当此事件面向下且玩家X座标为6、Y座标>11 (也就是和事件在同一X轴且在该事件下方)时触发
$game_map.events[@event_id].direction == 8 and $game_player.x == 6 and $game_player.y < 11
表示 当此事件面向上且玩家X座标为6、Y座标<11 (也就是和事件在同一X轴且在该事件上方)时触发
$game_map.events[@event_id].direction == 4 and $game_player.y == 11 and $game_player.x < 6
表示 当此事件面向左且玩家Y座标为11、X座标<6 (也就是和事件在同一Y轴且在该事件左方)时触发
$game_map.events[@event_id].direction == 6 and $game_player.y == 11 and $game_player.x > 6
表示 当此事件面向右且玩家Y座标为11、X座标>6 (也就是和事件在同一Y轴且在该事件右方)时触发

这样?

点评

先谢谢你  发表于 2017-2-15 11:55
还没有空测试,这样的话想问一下若然NPC设定固定路线来回跑,是否只需要像上面的例子中设定分支就可以呢?因为已经知道NPC接下来的几个坐标  发表于 2017-2-15 11:54
话说我刚才才想到这方法只能用于定点NPC,如果NPC会移动的话就得代入变量了  发表于 2017-2-15 00:12
也许有更精简的写法,不过我只会这种土法炼钢方式...Orz  发表于 2017-2-14 17:18
以前面的例子来说,要设定为NPC面向下三格内范围的话我会在后面加上and $game_player.y < 14  发表于 2017-2-14 17:18
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
644
在线时间
830 小时
注册时间
2016-7-24
帖子
649

开拓者

4
发表于 2017-2-14 18:08:57 | 只看该作者
兩個腳本一起用www

RUBY 代码复制
  1. =begin
  2.       RGSS3
  3.       
  4.       ★ 距離によるセルフスイッチ自動切り替え ★
  5.       
  6.       イベントのセルフスイッチをプレイヤーとの距離によって
  7.       自動的に切り替えます。
  8.       
  9.       ● 使い方 ●========================================================
  10.       イベントの名前に以下の記述を行ってください。
  11.          SDS:<A,B,C,D>
  12.       A,B,C,Dにはそれぞれのセルフスイッチが切り替わるプレイヤーとの距離を
  13.       数値で設定します。
  14.       距離によるセルフスイッチ切り替えを行わないスイッチには
  15.       0 を設定してください。
  16.       --------------------------------------------------------------------
  17.       各セルフスイッチの距離設定に2種類のオプションを付加することが可能です。
  18.       必要な場合は距離を示す数値の直後に以下のキーワードを付加してください。
  19.       -r => スイッチの切り替わり判定が逆になります。
  20.             設定距離より離れたらON, 近づいたらOFF。
  21.       -o => プレイヤーとの距離によりONには自動で切り替わりますが、
  22.          OFFには自動で切り替わらなくなります。
  23.       --------------------------------------------------------------------
  24.       例) SDS:<0,3-o,6,8-o-r>
  25.       セルフスイッチAに対しては何も行わない。
  26.       
  27.       プレイヤーとの距離が3マス以内の場合、セルフスイッチBをON。
  28.       プレイヤーとの距離が3マスより大きい場合は何もしない。
  29.       
  30.       プレイヤーとの距離が6マス以内の場合、セルフスイッチCをON。
  31.       プレイヤーとの距離が6マスより大きい場合、セルフスイッチCをOFF。
  32.       
  33.       プレイヤーとの距離が8マス以内の場合は何もしない。
  34.       プレイヤーとの距離が8マスより大きい場合、セルフスイッチDをON。
  35.       ====================================================================
  36.       
  37.       ver1.00
  38.       
  39.       Last Update : 2012/06/16
  40.       06/16 : 新規
  41.       
  42.       ろかん   [url]http://kaisou-ryouiki.sakura.ne.jp/[/url]
  43. =end
  44.  
  45. $rsi ||= {}
  46. $rsi["距離によるセルフスイッチ自動切り替え"] = true
  47.  
  48. class RPG::Event
  49.   def get_distance_switches_conf
  50.     match = @name.scan(/SDS:<(.*)>/)
  51.     result = []
  52.     if match.first
  53.       match.first.first.split(",").each{|split_data|
  54.         result << get_distance_switch_data(split_data)
  55.       }
  56.     end
  57.     result
  58.   end
  59.   def get_distance_switch_data(split_data)
  60.     option = 0
  61.     if split_data.include?('-r')
  62.       option += 1
  63.       split_data.delete!('-r')
  64.     end
  65.     if split_data.include?('-o')
  66.       option += 2
  67.       split_data.delete!('-o')
  68.     end
  69.     [split_data.to_i, option]
  70.   end
  71. end
  72.  
  73. class Game_Event < Game_Character
  74.   SELF_KEY = ['A','B','C','D']
  75.   #--------------------------------------------------------------------------
  76.   # ● リフレッシュ
  77.   #--------------------------------------------------------------------------
  78.   alias _refresh_distance_switch refresh
  79.   def refresh
  80.     set_distance_switch unless @switch_distances
  81.     _refresh_distance_switch
  82.   end
  83.   #--------------------------------------------------------------------------
  84.   # ● 距離によるスイッチ切り替え情報の初期化
  85.   #--------------------------------------------------------------------------
  86.   def set_distance_switch
  87.     @switch_distances = @event.get_distance_switches_conf
  88.   end
  89.   #--------------------------------------------------------------------------
  90.   # ● プレイヤーからの距離を取得
  91.   #--------------------------------------------------------------------------
  92.   def distance_from_player
  93.     distance_x_from($game_player.x).abs + distance_y_from($game_player.y).abs
  94.   end
  95.   #--------------------------------------------------------------------------
  96.   # ● フレーム更新
  97.   #--------------------------------------------------------------------------
  98.   alias _update_distance_switch update
  99.   def update
  100.     update_switch unless @switch_distances.empty?
  101.     _update_distance_switch
  102.   end
  103.   #--------------------------------------------------------------------------
  104.   # ● 距離によるスイッチ切り替え更新
  105.   #--------------------------------------------------------------------------
  106.   def update_switch
  107.     distance = distance_from_player
  108.     @switch_distances.each_with_index{|conf_data, index|
  109.       unless conf_data[0].zero?
  110.         case conf_data[1]
  111.         when 0
  112.           result = distance <= conf_data[0]
  113.         when 1
  114.           result = distance > conf_data[0]
  115.         when 2
  116.           result = distance <= conf_data[0]
  117.           next unless result
  118.         when 3
  119.           result = distance > conf_data[0]
  120.           next unless result
  121.         end
  122.         $game_self_switches[[@map_id, @event.id, SELF_KEY[index]]] = result
  123.       end
  124.     }
  125.   end
  126. end


RUBY 代码复制
  1. #==============================================================================
  2. # ■ RGSS3 距離によるセルフスイッチ自動切り替え拡張
  3. #          向いている方向へも依存 Ver1.01 by 星潟
  4. #------------------------------------------------------------------------------
  5. # 指定したイベントに対し、向いている方向依存で
  6. # 強制的に視界外として判定するようにします。
  7. #==============================================================================
  8. # ★設定例(イベントの名前に記入)
  9. #------------------------------------------------------------------------------
  10. # <SBD:0,3>
  11. #------------------------------------------------------------------------------
  12. # 向いている方向に依存したセルフスイッチ自動切り替えの対象となります。
  13. # また、横方向への反応に対しては特に補正を行いません。
  14. # 縦方向へは3タイル分まで切り替え判定を行います。
  15. #------------------------------------------------------------------------------
  16. # <SBD:1,4>
  17. #------------------------------------------------------------------------------
  18. # 向いている方向に依存したセルフスイッチ自動切り替えの対象となります。
  19. # また、1タイル分横方向に対して補正を行います。
  20. # 縦方向へは4タイル分まで判定を行います。
  21. # (真横にいる場合には反応させたい時等に有効)
  22. #------------------------------------------------------------------------------
  23. # <SBD:-1,6>
  24. #------------------------------------------------------------------------------
  25. # 向いている方向に依存したセルフスイッチ自動切り替えの対象となります。
  26. # また、横方向への反応に対して-1の補正を行います。
  27. # 縦方向へは6タイル分まで判定を行います。
  28. #------------------------------------------------------------------------------
  29. # <SBD:-2,8>
  30. #------------------------------------------------------------------------------
  31. # 向いている方向に依存したセルフスイッチ自動切り替えの対象となります。
  32. # また、横方向への反応に対して-2の補正を行います。
  33. # 縦方向へは8タイル分まで判定を行います。
  34. # (目の前にいるプレイヤーもスルーします。高台にいる敵等向け?)
  35. #==============================================================================
  36. module S_B_D
  37.  
  38.   #視界判定を有効にする場合のキーワードを設定。
  39.  
  40.   N = "SBD"
  41.  
  42.   #視界範囲外判定の場合のプレイヤーからの距離を設定。
  43.   #通常ありえない値を入力。(800×800マップでも1600離れる事はあり得ない)
  44.  
  45.   D = 1600
  46.  
  47. end
  48. class RPG::Event
  49.   #--------------------------------------------------------------------------
  50.   # 視界判定フラグの取得
  51.   #--------------------------------------------------------------------------
  52.   def get_d_by_d
  53.     /<#{S_B_D::N}[::](\S+),(\S+)>/ =~ @name ? [$1.to_i,$2.to_i] : false
  54.   end
  55. end
  56. class Game_Event < Game_Character
  57.   #--------------------------------------------------------------------------
  58.   # 距離によるスイッチ切り替え情報の初期化
  59.   #--------------------------------------------------------------------------
  60.   alias set_distance_switch_ex set_distance_switch
  61.   def set_distance_switch
  62.     set_distance_switch_ex
  63.     @sd_by_d = @event.get_d_by_d
  64.   end
  65.   #--------------------------------------------------------------------------
  66.   # プレイヤーからの距離を取得
  67.   #--------------------------------------------------------------------------
  68.   alias distance_from_player_extra distance_from_player
  69.   def distance_from_player
  70.     flag = false
  71.     if @sd_by_d
  72.       case self.direction
  73.       when 2;flag = (($game_player.y < self.y or distance_x_from($game_player.x).abs > distance_y_from($game_player.y).abs + @sd_by_d[0]) or distance_y_from($game_player.y).abs > @sd_by_d[1])
  74.       when 4;flag = (($game_player.x > self.x or distance_x_from($game_player.x).abs + @sd_by_d[0] < distance_y_from($game_player.y).abs) or distance_x_from($game_player.x).abs > @sd_by_d[1])
  75.       when 6;flag = (($game_player.x < self.x or distance_x_from($game_player.x).abs + @sd_by_d[0] < distance_y_from($game_player.y).abs) or distance_x_from($game_player.x).abs > @sd_by_d[1])
  76.       when 8;flag = (($game_player.y > self.y or distance_x_from($game_player.x).abs > distance_y_from($game_player.y).abs + @sd_by_d[0]) or distance_y_from($game_player.y).abs > @sd_by_d[1])
  77.       end
  78.     end
  79.     flag ? S_B_D::D : distance_from_player_extra
  80.   end
  81. end

点评

上面的是根据坐标来打开独立开关,下面的是设定视线范围吗?我测试看看,谢谢你  发表于 2017-2-15 11:56

评分

参与人数 1星屑 +100 收起 理由
RaidenInfinity + 100 认可答案

查看全部评分

2016/07/17 加入RPG製作,勿忘初衷!
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
518
在线时间
141 小时
注册时间
2016-12-17
帖子
52
5
 楼主| 发表于 2017-2-16 10:37:08 | 只看该作者
翠靈月 发表于 2017-2-14 16:47
如果不考虑遮蔽物之类的东西
先假设NPC座标为6,11
触发方式设置为并行事件

感谢 我使用这个了
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
518
在线时间
141 小时
注册时间
2016-12-17
帖子
52
6
 楼主| 发表于 2017-2-16 10:37:36 | 只看该作者
QQ蚊子湯 发表于 2017-2-14 18:08
兩個腳本一起用www

=begin

这个我也借来用了 感谢
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
518
在线时间
141 小时
注册时间
2016-12-17
帖子
52
7
 楼主| 发表于 2017-2-16 10:38:16 | 只看该作者
七重 发表于 2017-2-14 16:27
有个这样的思路。

并行一个事件,记录npc的x,y坐标。记录玩家的x,y坐标。

感谢大大回答
回复 支持 反对

使用道具 举报

Lv4.逐梦者 (版主)

梦石
1
星屑
6626
在线时间
2650 小时
注册时间
2013-8-23
帖子
2315

开拓者

8
发表于 2017-2-16 12:58:12 | 只看该作者
本帖最后由 鑫晴 于 2017-2-16 13:01 编辑

LE线形视野脚本的XP2.2加VX2.21和ACE2.21版本全发布
https://rpg.blue/forum.php?mod=viewthread&tid=238914


其实在VA图书馆里面有收录视野脚本
注:帖子的第一个脚本是VA的,后面的是VX和XP

点评

脚本有效 感谢你  发表于 2017-2-19 14:28

评分

参与人数 1星屑 +100 收起 理由
RaidenInfinity + 100 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-17 05:22

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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