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

Project1

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

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

[复制链接]

Lv2.观梦者

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

开拓者

跳转到指定楼层
1
发表于 2016-10-25 20:11:39 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式

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

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

x
如何判断人物所朝方向上紧挨着一个事件,如果确定是紧挨着一个事件,就把1号开关打开,如果不是紧挨着一个事件,就把1号开关关闭。

Lv2.观梦者

梦石
0
星屑
280
在线时间
1374 小时
注册时间
2005-10-16
帖子
5113

贵宾

5
发表于 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。这样我们角色面前一格的坐标就的出来了,再运用一下“:”这个三目运算符,角色面前一格的坐标就是
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?

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

点评

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

使用道具 举报

Lv2.观梦者

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

开拓者

4
 楼主| 发表于 2016-10-26 20:13:48 | 只看该作者
谢谢两位大侠,搞定了
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1358
在线时间
1295 小时
注册时间
2012-8-4
帖子
749
3
发表于 2016-10-26 19:43:41 | 只看该作者
本帖最后由 夜狠简单 于 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

点评

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

评分

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

查看全部评分

回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
33488
在线时间
5108 小时
注册时间
2012-11-19
帖子
4878

开拓者

2
发表于 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 各类型脚本/插件定制
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-27 08:40

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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