查看: 2244|回复: 21

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

[复制链接]
梦石
0
星屑
518
在线时间
141 小时
注册时间
2016-12-17
回帖
33
发表于 2017-2-14 15:29:20 | 显示全部楼层 |阅读模式

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

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

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

就是NPC面朝的方向会不断改变 若然NPC某个范围的视线内看到玩家的话将会游戏结束
请问这样的游戏能使用事件制作吗?若不能的话会有这样的脚本吗?
梦石
0
星屑
3557
在线时间
2337 小时
注册时间
2015-8-25
回帖
928

开拓者

发表于 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
回复

使用道具 举报

梦石
0
星屑
3372
在线时间
1123 小时
注册时间
2015-12-24
回帖
236
发表于 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
回复

使用道具 举报

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

开拓者

发表于 2017-2-14 18:08:57 | 显示全部楼层
兩個腳本一起用www

[pre lang="ruby"]=begin
      RGSS3
      
      ★ 距離によるセルフスイッチ自動切り替え ★
      
      イベントのセルフスイッチをプレイヤーとの距離によって
      自動的に切り替えます。
      
      ● 使い方 ●========================================================
      イベントの名前に以下の記述を行ってください。
         SDS:<A,B,C,D>
      A,B,C,Dにはそれぞれのセルフスイッチが切り替わるプレイヤーとの距離を
      数値で設定します。
      距離によるセルフスイッチ切り替えを行わないスイッチには
      0 を設定してください。
      --------------------------------------------------------------------
      各セルフスイッチの距離設定に2種類のオプションを付加することが可能です。
      必要な場合は距離を示す数値の直後に以下のキーワードを付加してください。
      -r => スイッチの切り替わり判定が逆になります。
            設定距離より離れたらON, 近づいたらOFF。
      -o => プレイヤーとの距離によりONには自動で切り替わりますが、
         OFFには自動で切り替わらなくなります。
      --------------------------------------------------------------------
      例) SDS:<0,3-o,6,8-o-r>
      セルフスイッチAに対しては何も行わない。
      
      プレイヤーとの距離が3マス以内の場合、セルフスイッチBをON。
      プレイヤーとの距離が3マスより大きい場合は何もしない。
      
      プレイヤーとの距離が6マス以内の場合、セルフスイッチCをON。
      プレイヤーとの距離が6マスより大きい場合、セルフスイッチCをOFF。
      
      プレイヤーとの距離が8マス以内の場合は何もしない。
      プレイヤーとの距離が8マスより大きい場合、セルフスイッチDをON。
      ====================================================================
      
      ver1.00
      
      Last Update : 2012/06/16
      06/16 : 新規
      
      ろかん   http://kaisou-ryouiki.sakura.ne.jp/
=end

$rsi ||= {}
$rsi["距離によるセルフスイッチ自動切り替え"] = true

class RPG::Event
  def get_distance_switches_conf
    match = @name.scan(/SDS:<(.*)>/)
    result = []
    if match.first
      match.first.first.split(",").each{|split_data|
        result << get_distance_switch_data(split_data)
      }
    end
    result
  end
  def get_distance_switch_data(split_data)
    option = 0
    if split_data.include?('-r')
      option += 1
      split_data.delete!('-r')
    end
    if split_data.include?('-o')
      option += 2
      split_data.delete!('-o')
    end
    [split_data.to_i, option]
  end
end
  
class Game_Event < Game_Character
  SELF_KEY = ['A','B','C','D']
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  alias _refresh_distance_switch refresh
  def refresh
    set_distance_switch unless @switch_distances
    _refresh_distance_switch
  end
  #--------------------------------------------------------------------------
  # ● 距離によるスイッチ切り替え情報の初期化
  #--------------------------------------------------------------------------
  def set_distance_switch
    @switch_distances = @event.get_distance_switches_conf
  end
  #--------------------------------------------------------------------------
  # ● プレイヤーからの距離を取得
  #--------------------------------------------------------------------------
  def distance_from_player
    distance_x_from($game_player.x).abs + distance_y_from($game_player.y).abs
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  alias _update_distance_switch update
  def update
    update_switch unless @switch_distances.empty?
    _update_distance_switch
  end
  #--------------------------------------------------------------------------
  # ● 距離によるスイッチ切り替え更新
  #--------------------------------------------------------------------------
  def update_switch
    distance = distance_from_player
    @switch_distances.each_with_index{|conf_data, index|
      unless conf_data[0].zero?
        case conf_data[1]
        when 0
          result = distance <= conf_data[0]
        when 1
          result = distance > conf_data[0]
        when 2
          result = distance <= conf_data[0]
          next unless result
        when 3
          result = distance > conf_data[0]
          next unless result
        end
        $game_self_switches[[@map_id, @event.id, SELF_KEY[index]]] = result
      end
    }
  end
end
[/pre]

[pre lang="ruby"]#==============================================================================
# ■ RGSS3 距離によるセルフスイッチ自動切り替え拡張
#          向いている方向へも依存 Ver1.01 by 星潟
#------------------------------------------------------------------------------
# 指定したイベントに対し、向いている方向依存で
# 強制的に視界外として判定するようにします。
#==============================================================================
# ★設定例(イベントの名前に記入)
#------------------------------------------------------------------------------
# <SBD:0,3>
#------------------------------------------------------------------------------
# 向いている方向に依存したセルフスイッチ自動切り替えの対象となります。
# また、横方向への反応に対しては特に補正を行いません。
# 縦方向へは3タイル分まで切り替え判定を行います。
#------------------------------------------------------------------------------
# <SBD:1,4>
#------------------------------------------------------------------------------
# 向いている方向に依存したセルフスイッチ自動切り替えの対象となります。
# また、1タイル分横方向に対して補正を行います。
# 縦方向へは4タイル分まで判定を行います。
# (真横にいる場合には反応させたい時等に有効)
#------------------------------------------------------------------------------
# <SBD:-1,6>
#------------------------------------------------------------------------------
# 向いている方向に依存したセルフスイッチ自動切り替えの対象となります。
# また、横方向への反応に対して-1の補正を行います。
# 縦方向へは6タイル分まで判定を行います。
#------------------------------------------------------------------------------
# <SBD:-2,8>
#------------------------------------------------------------------------------
# 向いている方向に依存したセルフスイッチ自動切り替えの対象となります。
# また、横方向への反応に対して-2の補正を行います。
# 縦方向へは8タイル分まで判定を行います。
# (目の前にいるプレイヤーもスルーします。高台にいる敵等向け?)
#==============================================================================
module S_B_D
  
  #視界判定を有効にする場合のキーワードを設定。
  
  N = "SBD"
  
  #視界範囲外判定の場合のプレイヤーからの距離を設定。
  #通常ありえない値を入力。(800×800マップでも1600離れる事はあり得ない)
  
  D = 1600
  
end
class RPG::Event
  #--------------------------------------------------------------------------
  # 視界判定フラグの取得
  #--------------------------------------------------------------------------
  def get_d_by_d
    /<#{S_B_D::N}[::](\S+),(\S+)>/ =~ @name ? [$1.to_i,$2.to_i] : false
  end
end
class Game_Event < Game_Character
  #--------------------------------------------------------------------------
  # 距離によるスイッチ切り替え情報の初期化
  #--------------------------------------------------------------------------
  alias set_distance_switch_ex set_distance_switch
  def set_distance_switch
    set_distance_switch_ex
    @sd_by_d = @event.get_d_by_d
  end
  #--------------------------------------------------------------------------
  # プレイヤーからの距離を取得
  #--------------------------------------------------------------------------
  alias distance_from_player_extra distance_from_player
  def distance_from_player
    flag = false
    if @sd_by_d
      case self.direction
      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])
      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])
      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])
      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])
      end
    end
    flag ? S_B_D::D : distance_from_player_extra
  end
end[/pre]

点评

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

评分

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

查看全部评分

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

使用道具 举报

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

感谢 我使用这个了
回复

使用道具 举报

梦石
0
星屑
518
在线时间
141 小时
注册时间
2016-12-17
回帖
33
 楼主| 发表于 2017-2-16 10:37:36 | 显示全部楼层
QQ蚊子湯 发表于 2017-2-14 18:08
兩個腳本一起用www

=begin

这个我也借来用了 感谢
回复

使用道具 举报

梦石
0
星屑
518
在线时间
141 小时
注册时间
2016-12-17
回帖
33
 楼主| 发表于 2017-2-16 10:38:16 | 显示全部楼层
七重 发表于 2017-2-14 16:27
有个这样的思路。

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

感谢大大回答
回复

使用道具 举报

梦石
1
星屑
7574
在线时间
2650 小时
注册时间
2013-8-23
回帖
2152

开拓者

发表于 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 认可答案

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部