Project1

标题: 如何判断1号事件是否接触到角色正在播放的动画 [打印本页]

作者: ProfesstionR    时间: 2010-7-3 06:51
标题: 如何判断1号事件是否接触到角色正在播放的动画
本帖最后由 ProfesstionR 于 2010-7-5 13:52 编辑

ACT写范围...不好控制
所以,如何判断1号事件是否接触到角色正在播放的动画
就是象素接触,动画里透明的算没碰到,不透明的1号事件接触一点点都算碰到

这怎么写?
作者: 雪_“‘    时间: 2010-7-3 08:38
不知道LZ是不是这个意思..LZ可以把1号事件调并行处理,然后用坐标判断与主角的距离,如果在主角攻击范围内,而主角又按了攻击建或者是什么健,那就执行事件内容,不用按健的话就直接执行内容也可以...不知道能不能帮你....
作者: 火ZHI意志    时间: 2010-7-3 09:44
建议LZ先用RPGXP地图编辑中每一格的长度,然后再画图上精确确定攻击动画中
攻击的场合与被攻击的场合的坐标距离长短,拼成动画,
这样的话攻击动画的最远距离到达的一定是怪物的前面而不是穿过去
然后按LS的话照办
作者: 火ZHI意志    时间: 2010-7-3 09:46
LS 的方法具体应用的话我给你个教程:
假设我们要做一个如下图的攻击:
○=主角
●=攻击范围
 ●
○●●
 ●

//攻击时,才呼叫事件判断
操作变数:[0001:1x]代入,主角Y座标
操作变数:[0002:1y]代入,主角X座标
操作开关:[0001:攻击中]设为 开 //开关是用作避面不在攻击的时候被判断为击中
条件分歧:主角面向上 //向前攻击要判断主角方向
操作变数:[0002:1y]加,1 //通过计算得出攻击范围
操作变数:[0003:2x]代入,变数[0001]的值
操作变数:[0004:2y]代入,变数[0002]的值
操作变数:[0004:2y]加,1
飞往指定标记:1号
:分歧结束
条件分歧:主角面向上
操作变数:[0002:1y]减,1
操作变数:[0003:2x]代入,变数[0001]的值
操作变数:[0004:2y]代入,变数[0002]的值
操作变数:[0004:2y]减,1
建立记号:1号
操作变数:[0005:3x]代入,变数[0001]的值
操作变数:[0005:3x]减,1
操作变数:[0006:3y]代入,变数[0002]的值
操作变数:[0007:4x]代入,变数[0001]的值
操作变数:[0007:4x]加,1
操作变数:[0008:4y]代入,变数[0002]的值
:分歧结束
条件分歧:主角面向左
操作变数:[0001:1x]减,1
操作变数:[0003:2x]代入,变数[0001]的值
操作变数:[0004:2y]代入,变数[0002]的值
操作变数:[0003:2x]减,1
飞往指定标记:2号
:分歧结束
条件分歧:主角面向上
操作变数:[0001:1x]加,1
操作变数:[0003:2x]代入,变数[0001]的值
操作变数:[0004:2y]代入,变数[0002]的值
操作变数:[0003:2x]加,1
建立记号:2号
操作变数:[0005:3x]代入,变数[0001]的值
操作变数:[0006:3y]代入,变数[0002]的值
操作变数:[0006:3y]减,1
操作变数:[0007:4x]代入,变数[0001]的值
操作变数:[0008:4y]代入,变数[0002]的值
操作变数:[0008:4y]加,1
:分歧结束
等待:0.3秒 //调整攻击之间的时间,和让怪物有时间去"看清楚"自己是否被击中
操作开关:[0001:攻击中]设为 关

//怪物与攻击重迭判定,在怪物事件定期并列执行
操作变数:[0009:怪物x]代入,这个事件Y座标
操作变数:[0010:怪物y]代入,这个事件Y座标
条件分歧:开关[0001:攻击中]为 开
条件分歧:变数[0009:怪物x]为V[0001]相同
条件分歧:变数[0010:怪物y]为V[0002]相同
(怪物被击中)
:分歧结束
:分歧结束
条件分歧:变数[0009:怪物x]为V[0003]相同
条件分歧:变数[0008:怪物y]为V[0004]相同
(怪物被击中)
:分歧结束
:分歧结束
条件分歧:变数[0009:怪物x]为V[0005]相同
条件分歧:变数[0010:怪物y]为V[0006]相同
(怪物被击中)
:分歧结束
:分歧结束
条件分歧:变数[0009:怪物x]为V[0007]相同
条件分歧:变数[0010:怪物y]为V[0008]相同
(怪物被击中)
:分歧结束
:分歧结束

怪物攻击主角的命中判断也是这样做,只不过是相反。
作者: ProfesstionR    时间: 2010-7-3 10:02
http://rpg.blue/forum.php?mod=vi ... &extra=page%3D1

LS先看看,我用脚本的...
作者: 紫苏    时间: 2010-7-4 02:30
http://rpg.blue/forum.php?mod=vi ... &extra=page%3D3

参考这贴,不是简单几句脚本就能解决的
作者: ProfesstionR    时间: 2010-7-4 06:40
本帖最后由 ProfesstionR 于 2010-7-4 06:43 编辑

XP动画的象素接触该怎么检测,我会写象素接触,但我不知道怎么才能读取动画里正在播放那一贞的长和宽...以及X,Y
作者: 紫苏    时间: 2010-7-4 09:07
id = 1
frame_id = 0
cell_index = 0
data_index = 1
p $data_animations[id].frames[frame_id].
cell_data[cell_index, data_index]

id = 动画编号(从 1 开始)
frame_id = 帧编号(从 0 开始)
cell_index = 单元编号(从 0 开始)
data_index 的范围是 0..7,表示单元的各信息(0:式样、1:X 座标,2:Y 座标,3:放大率,4:旋转角度,5:左右反转,6:不透明度,7:合成方式)。式样是 Maker 显示的号码减去 1 的数字。-1 意味着该单元缺如。

从开始播放动画时检测碰撞,每帧刷新,宽度和高度是通过放大率决定的,100% 时是 192 * 192
作者: ProfesstionR    时间: 2010-7-4 11:36
本帖最后由 ProfesstionR 于 2010-7-4 12:10 编辑

紫苏大..能写具体点吗.....如何读取角色正在播放的动画ID以及正在播放那一贞,还有X号动画第Y贞的单元总数?
作者: 紫苏    时间: 2010-7-4 12:28
本帖最后由 紫苏 于 2010-7-4 12:31 编辑

# 锁定 1 号事件,下面的 0 是事件编号 - 1
spr = $scene.instance_eval("@spriteset").
  instance_eval("@character_sprites")[0]
ani = spr.instance_eval("@_animation")
dur = spr.instance_eval(
"@_animation_duration")

if(ani) # 如果当前正在播放动画
p ani.id, # 动画 ID
  ani.frame_max - dur # 当前帧
end

有了当前正在播放的帧的数据,就可以用楼上上的方法获取动画的数据

以上仅针对地图中的动画,战斗中另有循环动画,则不是这样写的了
作者: IamI    时间: 2010-7-4 12:31
其实在Sprite上抓交汇才是最实在的……但是速度极端慢就是,所以必须折中
作者: ProfesstionR    时间: 2010-7-4 12:34
# 锁定 1 号事件,下面的 0 是事件编号 - 1
spr = $scene.instance_eval("@spriteset").
  instance_eval(" ...
紫苏 发表于 2010-7-4 12:28

那1号事件用0表示,角色用$game_player表示吗

作者: 紫苏    时间: 2010-7-4 12:37
回复 ProfesstionR 的帖子

角色是数组中最后一个元素,所以用 -1 即可
作者: ProfesstionR    时间: 2010-7-4 17:03
在新工程中倒是可以
但是
我那脚本的Spriteset_Map不一样,不兼容,该如何改
    # 生成角色活动块
    @character_sprites = {}
    for i in $game_map.events.keys.sort
      add_event($game_map.events[i])
    end
    @character_sprites[$game_player] = Sprite_Character.new(@viewport1, $game_player)
  #--------------------------------------------------------------------------
  # ● 添加事件
  #--------------------------------------------------------------------------
  def add_event(event)
    @character_sprites[event] = Sprite_Character.new(@viewport1, event)
  end

该怎么改
作者: 紫苏    时间: 2010-7-4 22:23
你这个就是把数组改成了散列表,那就需要把 [ ] 内的索引改为:
1、事件 $game_map.events[事件编号]
2、角色 $game_player
作者: ProfesstionR    时间: 2010-7-5 07:20
谢谢了,解决了
作者: DeathKing    时间: 2010-7-5 11:32
额,由于报告了错误的认可链接,我把分给评了,XP区斑竹把类分一下。

请看20楼:
http://rpg.blue/forum.php?mod=vi ... page%3D1&page=2




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