查看: 2721|回复: 12

[已经解决] 如何判断人物所朝方向上紧挨着一个事件

[复制链接]
梦石
0
星屑
625
在线时间
130 小时
注册时间
2015-4-2
回帖
58

开拓者

发表于 2016-10-25 20:11:39 | 显示全部楼层 |阅读模式

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

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

×
如何判断人物所朝方向上紧挨着一个事件,如果确定是紧挨着一个事件,就把1号开关打开,如果不是紧挨着一个事件,就把1号开关关闭。
梦石
0
星屑
34459
在线时间
5096 小时
注册时间
2012-11-19
回帖
4715

开拓者

发表于 2016-10-26 18:26:04 | 显示全部楼层
  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
复制代码

点评

有个end是和do一起的  发表于 2016-10-26 19:44
YSC
感觉是不是开头少了东西,有2个end,只有一个if  发表于 2016-10-26 19:43
YSC
还是有问题  发表于 2016-10-26 19:40
在6行前面加 $game_variables[1] ||= false  发表于 2016-10-26 19:38
YSC
大侠是不写漏了一点点,会报错  发表于 2016-10-26 19:31

评分

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

查看全部评分

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

使用道具 举报

梦石
0
星屑
1788
在线时间
1313 小时
注册时间
2012-8-4
回帖
724
发表于 2016-10-26 19:43:41 | 显示全部楼层
本帖最后由 夜狠简单 于 2016-10-26 20:32 编辑

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

点评

这只判断了上方有事件的情况。  发表于 2016-10-28 07:03
YSC
是写在公共事件里,然后并行处理么?  发表于 2016-10-26 19:52

评分

参与人数 1星屑 +90 收起 理由
RyanBern + 90 塞糖

查看全部评分

回复

使用道具 举报

梦石
0
星屑
625
在线时间
130 小时
注册时间
2015-4-2
回帖
58

开拓者

 楼主| 发表于 2016-10-26 20:13:48 | 显示全部楼层
谢谢两位大侠,搞定了
回复

使用道具 举报

梦石
0
星屑
275
在线时间
1373 小时
注册时间
2005-10-16
回帖
5038

贵宾

发表于 2016-10-28 07:08:07 | 显示全部楼层
本帖最后由 亿万星辰 于 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。这样我们角色面前一格的坐标就的出来了,再运用一下“:”这个三目运算符,角色面前一格的坐标就是
[pre lang="ruby"]$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))[/pre]
看着挺长,不过还好事件中条件分歧里的那个脚本栏里能输不少字……
接着就是把这一串坐标放到$game_map.check_event这个方法的参数里,得到
[pre lang="ruby"]$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)))[/pre]

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

[pre lang="ruby"]!$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?[/pre]
这样判断为“真”的情况就是说面前真的有事件,如果为“假”则说面面前空无一物。
最后公共并行事件里以这个作为事件操作--条件分歧--脚本的判断内容,然后在处理中打开对应的开关就好了。

点评

YSC
我已经把前面的方法拓展到4个方向都可以进行判定了。不过还是非常感谢大侠提供的方法。  发表于 2016-10-28 15:35
我只个搬答案的
叔叔我已经当爹了~
婚后闪人了……
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部