Project1

标题: 请问如何制作不能被NPC对上眼的游戏? [打印本页]

作者: rainaz    时间: 2017-2-14 15:29
标题: 请问如何制作不能被NPC对上眼的游戏?
本帖最后由 rainaz 于 2017-2-14 16:46 编辑

就是NPC面朝的方向会不断改变 若然NPC某个范围的视线内看到玩家的话将会游戏结束
请问这样的游戏能使用事件制作吗?若不能的话会有这样的脚本吗?
作者: 七重    时间: 2017-2-14 16:27
有个这样的思路。

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

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

其他四方向也是如此类推。
作者: 翠靈月    时间: 2017-2-14 16:47
本帖最后由 翠靈月 于 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轴且在该事件右方)时触发

这样?
作者: QQ蚊子湯    时间: 2017-2-14 18:08
兩個腳本一起用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

作者: rainaz    时间: 2017-2-16 10:37
翠靈月 发表于 2017-2-14 16:47
如果不考虑遮蔽物之类的东西
先假设NPC座标为6,11
触发方式设置为并行事件

感谢 我使用这个了
作者: rainaz    时间: 2017-2-16 10:37
QQ蚊子湯 发表于 2017-2-14 18:08
兩個腳本一起用www

=begin

这个我也借来用了 感谢
作者: rainaz    时间: 2017-2-16 10:38
七重 发表于 2017-2-14 16:27
有个这样的思路。

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

感谢大大回答
作者: 鑫晴    时间: 2017-2-16 12:58
本帖最后由 鑫晴 于 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




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1