Project1

标题: 图文更新-很难的事件坐标判断[300分] [打印本页]

作者: ☆流星☆~~~    时间: 2009-4-5 08:00
提示: 作者被禁止或删除 内容自动屏蔽
作者: tommay    时间: 2009-4-5 08:08
用事件的话比较复杂,如果用脚本写可能比较容易
作者: ☆流星☆~~~    时间: 2009-4-5 20:01
提示: 作者被禁止或删除 内容自动屏蔽
作者: IamI    时间: 2009-4-5 20:17
帮你做了个集成,不过这上面只实现了1和2,3这个MS太麻烦
插入脚本
class Interpreter
  def something(id)
    $t = false
    event = $game_map.events[id]
    if event.y == $game_player.y
      if event.x < $game_player.x and $game_player.direction == 4
        $t = true
      elsif event.x > $game_player.x and $game_player.direction == 6
        $t = true
      end
    elsif event.x == $game_player.x
      if event.y < $game_player.y and $game_player.direction == 8
        $t = true  
      elsif event.y > $game_player.y and $game_player.direction == 2
        $t = true
      end
    end
    return $t
  end
end

事件的时候这样
条件分歧,脚本,『something(id)』
执行
分歧结束
不包括『』号,ID是事件ID
作者: ☆流星☆~~~    时间: 2009-4-5 20:28
提示: 作者被禁止或删除 内容自动屏蔽
作者: IamI    时间: 2009-4-5 20:48
  1. class Interpreter
  2. def something(id)
  3.    $t = false
  4.    event = $game_map.events[id]
  5.    if event.y == $game_player.y
  6.      if event.x < $game_player.x and $game_player.direction == 4
  7.        $t = true
  8.      elsif event.x > $game_player.x and $game_player.direction == 6
  9.        $t = true
  10.      end
  11.    elsif event.x == $game_player.x
  12.      if event.y < $game_player.y and $game_player.direction == 8
  13.        $t = true  
  14.      elsif event.y > $game_player.y and $game_player.direction == 2
  15.        $t = true
  16.      end
  17.    end
  18.    
  19.    if event.x == $game_player.x
  20.      for i in [event.y,$game_player.y].min+2..[event.y,$game_player.y].max
  21.        $t = false if $game_player.passable?(event.x,i-1,2) == false
  22.      end
  23.    end
  24.    if event.y == $game_player.y
  25.      for i in [event.x,$game_player.x].min+2..[event.x,$game_player.x].max
  26.        $t = false if $game_player.passable?(i-1,event.y,6) == false
  27.      end
  28.    end
  29.    return $t
  30. end
  31. end
复制代码

应该是有Bug的……只不过我是没有耐心去调试了
以后再也不接这种逻辑任务了囧
作者: 越前リョーマ    时间: 2009-4-5 21:01
3不理解。
1、2的话应该可以吧。

1的话要以这个事件的坐标为判断,但又必须和2同时执行。
大概就是,首先代入主角的X1和Y1,代入事件的X2和Y2,如果X1=X2或Y1=Y2(应该不会重合吧,重合也一样啦……),那么再判断面向,若X1>X2,也就是说那个NPC在主角的坐标,再用条件分歧判断主角是否是朝左的。

依此类推。

作者: ☆流星☆~~~    时间: 2009-4-5 21:11
提示: 作者被禁止或删除 内容自动屏蔽
作者: 越前リョーマ    时间: 2009-4-5 21:25
以下引用☆流星☆~~~于2009-4-5 13:11:04的发言:

。。。LS 的 LS,哎。- -,有BUG,要走到NPC跟前才嫩判断通过。

LS:
我说明详细好了:
1主角面向这个事件
2这个事件与主角在同1条线上(也就是X坐标1样,或Y坐标1样)
3主角与这个事件之间没有 不可穿头的图块  和 别的事件(润许穿透没打勾)。

3的详细说明:
这个事件 与 角色 在同1条线上了,且角色面向此事件,事件可以不面向。
从角色 到 事件 之间的连线 ,没有障碍物。障碍物指 不可穿透的图块
不可穿透的图块代表 墙 之类的东西。
也就是说,角色不仅面对事件,而且事件 在角色面向 前 部分,从事件到角色没有任何东西阻挡。

有兴趣的话可以一个一个坐标去试…… = =
附带事件脚本一个:
  1. 通行判定:
  2. $game_player.passable?(x,y,方向)
复制代码

作者: 一柳阴风    时间: 2009-4-5 23:05
1和2自不必说了,
3这个情况不怕麻烦的话,用事件也可以的...
在每个地图导入时,率先更新N个变量,该组变量用来表征在每个地图块上的穿透性。
然后...对其进行判断...
疯狂了点,但若是地图不多,地图不大的话,行之有效。
作者: ☆流星☆~~~    时间: 2009-4-6 01:14
提示: 作者被禁止或删除 内容自动屏蔽
作者: ☆流星☆~~~    时间: 2009-4-6 05:10
提示: 作者被禁止或删除 内容自动屏蔽
作者: 紫苏    时间: 2009-4-6 10:58
事件中这样用:
visionTo(11) 判断角色能否看到 11 号事件
visionTo(4, 6) 判断六号事件是否能看到 4 号事件

class Interpreter

  # --------------------------------
  # eventID: 目标事件的 ID
  # this   : 从什么 ID 的事件判断视线,不传值则默认为角色本身
  # ---------------------------------
  def visionTo(eventID, this = -1)
    dest = $game_map.events[eventID]
    src = this == -1 ? $game_player : $game_map.events[this]
    return true if dest.x == src.x and dest.y == src.y
    if dest.x == src.x
      range = dest.y < src.y ? (dest.y + 1)...src.y : (src.y + 1)...dest.y
      for i in range
        event = $game_map.events[$game_map.check_event(dest.x, i)]
        return false if event != nil && !event.through
        return false if !$game_map.passable?(dest.x, i, 0)
      end
      return dest.y > src.y && src.direction == 2 ||
        dest.y < src.y && src.direction == 8
    elsif dest.y == src.y
      range = dest.x < src.x ? (dest.x + 1)...src.x : (src.x + 1)...dest.x
      for i in range
        event = $game_map.events[$game_map.check_event(i, dest.y)]
        return false if event != nil and !event.through
        return false if !$game_map.passable?(i, dest.y, 0)
      end
      return dest.x > src.x && src.direction == 6 ||
        dest.x < src.x && src.direction == 4
    else
      return false
    end
  end

end


上面这个脚本判断的是图块是否四方向都不能通行,如果有一个方向可通行也算能看见,如果需要修改可以给$game_map.passable? 的最后一个参数传递不同的值判断不同的通行方向~
  #     d          : 方向 (0,2,4,6,8,10)
  #                  ※ 0,10 = 全方向不能通行的情况的判定 (跳跃等)
  #     self_event : 自己 (判定事件可以通行的情况下)
[LINE]1,#dddddd[/LINE]系统信息:本贴由楼主认可为正确答案,66RPG感谢您的热情解答~




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