Project1

标题: 怎样用事件判定法术范围 [打印本页]

作者: TLF    时间: 2009-6-6 18:49
标题: 怎样用事件判定法术范围
就是在ARPG施用一个法术时判定周围的事件(不确定的)受到HP减少的影响,用事件可以办到么……

[LINE]1,#dddddd[/LINE]此贴于 2009-6-11 3:44:37 被版主darkten提醒,请楼主看到后对本贴做出回应。 [LINE]1,#dddddd[/LINE]版务信息:本贴由楼主自主结贴~
作者: 66rpg学习    时间: 2009-6-6 18:51
提示: 作者被禁止或删除 内容自动屏蔽
作者: TLF    时间: 2009-6-6 18:53
以下引用66rpg学习于2009-6-6 10:51:11的发言:

没听太明白,是在ARPG中 制作一个有范围的魔法吗

比如一次攻击 5个敌人?


对,不过ARPG中一个敌人就是一个事件
作者: 66rpg学习    时间: 2009-6-6 18:57
提示: 作者被禁止或删除 内容自动屏蔽
作者: TLF    时间: 2009-6-6 19:00
以下引用66rpg学习于2009-6-6 10:57:22的发言:


以下引用TLF于2009-6-6 10:53:32的发言:


以下引用66rpg学习于2009-6-6 10:51:11的发言:

没听太明白,是在ARPG中 制作一个有范围的魔法吗

比如一次攻击 5个敌人?



对,不过ARPG中一个敌人就是一个事件




我这就出门
理论操作:
必须设置技能范围
攻击时,技能造成地面一个范围可以2维数组,就象SLG的攻击范围
然后循环检查当前地图所有事件的坐标
  在此地面范围内的事件 受到伤害。


明白可是太简单了……。。我还弄不懂什么叫2维数组,什么叫SLG呢,能不能有更好的方法?。。
作者: 如梦    时间: 2009-6-6 19:07
假设先判断一个敌人,该敌人的坐标代入变量3和4,假设一个炸弹爆炸了,爆炸范围是4格,炸弹的坐标代入变量1和2,以下用并行事件判断该敌人是不是在爆炸范围内,是的话就扣血。多个敌人可以循环判断敌人事件的ID
($game_variables[1]-$game_variables[3]).abs <= 4 and ($game_variables[2]-$game_variables[4]).abs <= 4
作者: longhun9958    时间: 2009-6-6 19:11
提示: 作者被禁止或删除 内容自动屏蔽
作者: TLF    时间: 2009-6-6 19:24
以下引用如梦于2009-6-6 11:07:58的发言:

假设先判断一个敌人,该敌人的坐标代入变量3和4,假设一个炸弹爆炸了,爆炸范围是4格,炸弹的坐标代入变量1和2,以下用并行事件判断该敌人是不是在爆炸范围内,是的话就扣血。多个敌人可以循环判断敌人事件的ID
($game_variables[1]-$game_variables[3]).abs <= 4 and ($game_variables[2]-$game_variables[4]).abs <= 4


[本贴由作者于 2009-6-6 11:11:14 最后编辑]

多个敌人可以循环判断敌人事件的ID    这个怎么做?

还有($game_variables[1]-$game_variables[3]).abs <= 4 and ($game_variables[2]-$game_variables[4]).abs <= 4
这个是直接用条件分歧里的脚本调用还是……
作者: 如梦    时间: 2009-6-6 19:38
直接用条件分歧里的脚本调用,

比如敌人事件编号为1~10,炸弹是11号事件,1~10号公共事件是1~10号敌人的扣血事件
for i in 1..10
x  = $game_map.events[11].x
y  = $game_map.events[11].y
x1 = $game_map.events.x
y1 = $game_map.events.y
if (x - x1).abs <= 4 and (y - y1).abs <= 4
   $game_temp.common_event_id = i
   break
end
end
作者: TLF    时间: 2009-6-6 21:58
以下引用如梦于2009-6-6 11:38:01的发言:

直接用条件分歧里的脚本调用,

比如敌人事件编号为1~10,炸弹是11号事件,1~10号公共事件是1~10号敌人的扣血事件
for i in 1..10
x  = $game_map.events[11].x
y  = $game_map.events[11].y
x1 = $game_map.events.x
y1 = $game_map.events.y
if (x - x1).abs <= 4 and (y - y1).abs <= 4
  $game_temp.common_event_id = i
  break
end
end


[本贴由作者于 2009-6-6 11:39:38 最后编辑]


有点问题,如果敌人数量众多,那么要每一个都创建一个扣血事件?。
作者: TLF    时间: 2009-6-7 02:58
寻求更好的答案中%……
作者: SeRiKa    时间: 2009-6-7 03:02
提示: 作者被禁止或删除 内容自动屏蔽
作者: TLF    时间: 2009-6-7 03:23
以下引用SeRiKa于2009-6-6 19:02:51的发言:


以下引用如梦于2009-6-6 11:38:01的发言:
if (x - x1).abs <= 4 and (y - y1).abs <= 4


这个是正方型的范围吧?




我做过2003的纯事件ARPG

首先XP的事件办不到的是 获取指定地点ID编号
http://rpg.blue/viewthread.php?tid=126457 这地址的第2问 等人来解决- -

例:  ■
   ■■■
■■○■■
   ■■■
     ■    四周的范围

方案1:代入圆的坐标后 依次获取方块地点所含有的事件ID

方案2:■■■  循环判断敌事件是否在方型范围内 ,之后在对剩余4个判断是否存在事件
      ■○■                 ■■■■
      ■■■ 这个方案可用于○■■■■之类技能
                             ■■■■
总之用计算次数少的来(电脑不卡就随便了...)
                             
得到事件ID后,转换成 敌编号 (如果设置的一样就不需要了)

有了敌编号就按攻击单个事件的算法算
注:每获得1个敌编号立即对其计算攻击,或者你可以先存在什么地方之后一起计算

具体操作很是复杂- -,有耐心就用事件慢慢做吧



[本贴由作者于 2009-6-6 19:13:22 最后编辑]


-。- 我已经感受到了……可是ARPG缺了这个可不爽。。。 如果事件不能,脚本会好么
作者: SeRiKa    时间: 2009-6-7 03:33
提示: 作者被禁止或删除 内容自动屏蔽
作者: TLF    时间: 2009-6-7 03:34
以下引用SeRiKa于2009-6-6 19:33:06的发言:

用默认脚本 提取指定地点事件ID的话 如果没有事件 返回的是1长串东西- -

对这1串东西 要怎么判断呢?


- -难道说脚本和事件结合起来用?。。。

我头大了……。。。
作者: SeRiKa    时间: 2009-6-7 05:43
提示: 作者被禁止或删除 内容自动屏蔽
作者: TLF    时间: 2009-6-7 14:37
以下引用SeRiKa于2009-6-6 21:43:25的发言:

哦- -

可以 在获取指定位置事件ID之前把1个空白事件移动过去
判断的时候如果是这个事件ID就跳过

a = $game_map.check_event(x, y)
$game_variables[?] = a




↑这是什么



[本贴由作者于 2009-6-6 21:50:51 最后编辑]


有没有相关的范例什么的……听你说这个我很晕
作者: 紫苏    时间: 2009-6-9 12:05
首先XP的事件办不到的是 获取指定地点ID编号
http://rpg.blue/viewthread.php?tid=126457 这地址的第2问 等人来解决- -

把 check_event 修改为:
  def check_event(x, y)
    for event in $game_map.events.values
      if event.x == x and event.y == y
        return event.id
      end
    end
    return 0
  end
这样在 (x, y) 找不到事件就会返回 0~
没有 return 0 这一行的话,check_event 在 (x, y) 处找不到事件就会返回函数中最后一个计算的表达式的值,也就 for 循环那一行,而这一行的值就是 $game_map.events 这个对象数组

例:  ■
   ■■■
■■○■■
   ■■■
     ■    四周的范围

方案1:代入圆的坐标后 依次获取方块地点所含有的事件ID
这不是圆,而是 45 度的正方形,判断范围的方法是 |x1 - x2| + |y1 - y2| <= n
用 sqrt 判断圆的话,实际得到的范围更像这样:
   ■■■
■■■■■
■■○■■
■■■■■
   ■■■
[LINE]1,#dddddd[/LINE]
TLF的问题,可以在 Interpreter 中定义一个方法,获取本事件周围特定范围内的所有事件的数组,之后就可以做一个循环对这个数组内的敌人进行扣血的计算~先插入:
class Interpreter
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #     range : 范围(单位:格)
  #--------------------------------------------------------------------------
  def getEventsWithin(range)
    # 保存最后要返回的事件
    ret_events = []
    # 地图上所有的事件
    map_events = $game_map.events
    # 本事件
    this = map_events[@event_id]
    # 本事件坐标
    x, y = this.x, this.y
    # 循环检查地图上所有的事件是否在范围内
    map_events.each_value do |i|
      # 跳过本事件
      next if i == this
      # 如果在范围内就添加到最后要返回的事件数组中
      ret_events.push(i) if (x - i.x).abs + (y - i.y).abs <= range
    end
    # 返回
    return ret_events
  end
end
然后就可以在事件脚本中调用:
enemies = getEventsWithin(5)
# 枚举数组中的元素(在范围内的敌人),对其 hp 或其他属性进行增加
for e in enemies
   e.hp -= 多少多少
end
[LINE]1,#dddddd[/LINE]版主对此帖的认可:『很不错的解说,感激你在提问区做出的贡献,请再接再厉...』,积分『+350』。 [LINE]1,#dddddd[/LINE]系统信息:本贴由楼主认可为正确答案,66RPG感谢您的热情解答~




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