Project1

标题: 如何判断人物所朝方向上紧挨着一个事件 [打印本页]

作者: YSC    时间: 2016-10-25 20:11
标题: 如何判断人物所朝方向上紧挨着一个事件
如何判断人物所朝方向上紧挨着一个事件,如果确定是紧挨着一个事件,就把1号开关打开,如果不是紧挨着一个事件,就把1号开关关闭。

作者: 芯☆淡茹水    时间: 2016-10-26 18:26
  1. $game_map.events.values.each do |e|
  2.   if $game_player.x == e.x and ($game_player.y - 1) == e.y
  3.     $game_variables[1] = true
  4.     return
  5.   end
  6.   $game_variables[1] = false if $game_variables[1]
  7. end
复制代码

作者: 夜狠简单    时间: 2016-10-26 19:43
本帖最后由 夜狠简单 于 2016-10-26 20:32 编辑

你把芯大的脚本写成这样

并行事件,用F9可以查看效果
芯大提供了方法。具体的可以用我写的这个试试
RUBY 代码复制
  1. #检查角色所朝方向上紧挨着一个事件
  2. #事件指令 输入 Map_events_coordinate.new
  3. class Map_events_coordinate
  4.   def initialize
  5.   #用values取地图上所有事件的内容数值,如果取事件ID用keys
  6.   #Hash 表中是没有顺序的,所以排列会无顺序可言
  7.   $game_map.events.values.each{ |e|
  8.   #8、2、4、6分别对应上下左右,所以不知道兼容八方向脚本不
  9.   coordinate={2=>[0,1],4=>[-1,0],6=>[1,0],8=>[0,-1]}
  10.   #判断人物所朝方向上紧挨着一个事件,如果确定就把一号开关打开
  11.    if e.x==$game_player.x+coordinate[$game_player.direction][0] &&
  12.       e.y==$game_player.y+coordinate[$game_player.direction][1]
  13.       $game_switches[1] = true
  14.       return
  15.    else#不存在的情况下一号开关关闭
  16.       $game_switches[1] = false if $game_switches[1]
  17.    end}
  18.   end
  19. end

作者: YSC    时间: 2016-10-26 20:13
谢谢两位大侠,搞定了
作者: 亿万星辰    时间: 2016-10-28 07:08
本帖最后由 亿万星辰 于 2016-10-28 11:20 编辑

系统分析一下这个问题
1、眼看到这个问题,就要先考虑下它涉及到的一些知识点:
朝向、坐标、事件判断
2、逐一分析知识点:
朝向:角色共有四个朝向,有对应的方法可调用:$game_player.direction;
坐标:左上角为原点,↘方向为XY坐标正方向同样也有对应的方法可以调用让我们来获取角色的坐标:$game_player.x, $game_player.y;
事件判断:如何判断某个坐标处是否存在一个事件,系统正好也提供了这个方法$game_map.check_event(x, y),返回值为事件ID,无事件则返回nil;
3、有了这些东西,我们可以清点一下思路了。我们要判断角色是否面对着一个事件,其实就是:根据角色朝向不同计算出角色面前一格坐标内是否存在一个事件,具体来看:
首先我们要获取到角色面前这一格的坐标,而角色的方向又有四种可能,细想一下其实可以把x坐标和y坐标单独开来分析,如果角色面朝左则角色当前的x坐标-1,朝右就+1;同理y轴方向朝上的话-1,朝下就+1。这样我们角色面前一格的坐标就的出来了,再运用一下“:”这个三目运算符,角色面前一格的坐标就是
RUBY 代码复制
  1. $game_player.x+($game_player.direction == 6 ? 1 : ($game_player.direction == 4 ? -1 : 0)),$game_player.y + ($game_player.direction == 2 ? 1 : ($game_player.direction == 8 ? -1 : 0))

看着挺长,不过还好事件中条件分歧里的那个脚本栏里能输不少字……
接着就是把这一串坐标放到$game_map.check_event这个方法的参数里,得到
RUBY 代码复制
  1. $game_map.check_event($game_player.x+($game_player.direction == 6 ? 1 : ($game_player.direction == 4 ? -1 : 0)),$game_player.y + ($game_player.direction == 2 ? 1 : ($game_player.direction == 8 ? -1 : 0)))


当然还要记得我们的初衷是判断面前是否有一个事件,所以最终就是这样的

RUBY 代码复制
  1. !$game_map.check_event($game_player.x+($game_player.direction == 6 ? 1 : ($game_player.direction == 4 ? -1 : 0)),$game_player.y + ($game_player.direction == 2 ? 1 : ($game_player.direction == 8 ? -1 : 0))).nil?

这样判断为“真”的情况就是说面前真的有事件,如果为“假”则说面面前空无一物。
最后公共并行事件里以这个作为事件操作--条件分歧--脚本的判断内容,然后在处理中打开对应的开关就好了。




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