骑马与砍杀中文站论坛

 找回密码
 注册(Register!)

QQ登录

只需一步,快速开始

搜索
购买CDKEY 小黑盒加速器
查看: 1200|回复: 1

[经验与教程] 关于通过顶点顶画构造场景内的计时器和延时触发的做法

[复制链接]

212

主题

1032

回帖

1048

积分

子爵[版主]

Rank: 7Rank: 7Rank: 7

UID
2893127
第纳尔
14847
精华
0
互助
93
荣誉
21
贡献
325
魅力
1382
注册时间
2017-11-5
鲜花(431) 鸡蛋(0)
发表于 2023-5-4 23:48:37 | 显示全部楼层 |阅读模式
本帖最后由 vegetto 于 2023-5-5 10:41 编辑

前言:https://bbs.mountblade.com.cn/thread-2096174-1-1.html首先到我此贴学习下顶点动画的基础理论。
以及一些简单实例https://bbs.mountblade.com.cn/thread-2097626-1-1.html深化一下顶点动画的运用理解。


我们在场景中控制一个事件的进程,比如推进剧情,ai行为变化,以及魔法题材的技能cd控制等等,离不开构造一个slot或全局变量使得根据时间有一定变化增量,并且在一定取值区间变化,区间内取值可能会进行循环,可能会人为划分不同的取值或取值分区间用于判断一类事件控制进程中不同的状态。
比如说假如某agent的300号slot取值在0, 200,控制技能进程,0为不释放技能,因为触发技能的条件使得取值为1(假设这个条件为按了m键)时,取值自动从1-200变化,200后重新归0,且假设取值为100时产生由add missle发射itm_dandao的弹道进而释放伤害(即产生伤害的施法前摇为总时间的一半时)。
那么按照正常的slot控制写法可以这么写:
(get_player_agent_no, ":var_0"),   
(agent_get_slot, ":var_18", ":var_0", 300),   
(try_begin),                                               
    (eq, ":var_18", 0),
     (key_clicked, key_m),   
    (agent_set_slot, ":var_0", 300, 1),
(else_try),
    (is_between, ":var_18", 1, 200),                  #300号slot为1时,开始进行1-200值域的+1变化,+1的时间另行触发器调节
    (val_add, ":var_18", 1),
    (agent_set_slot, ":var_3", 300, ":var_18"),
    (try_begin),  
         (eq, ":var_18", 100),                                   #300号slot为100的取值时则,面前发射dandao的箭矢类物品
        (agent_get_position, pos1, ":var_0"),            
        (position_move_z, pos1, 150),
        (position_move_y, pos1, 20),
        (add_missile, ":var_0", 1, 64000, 0, 0, "itm_dandao", 0),
    (try_end),  
(else_try),
    (eq, ":var_18", 200),
    (agent_set_slot, ":var_0", 300, 0),
(try_end),               


但是如果从顶点动画控制理论考虑,我们可以建立一个叫spr_xxx的场景物辅助,它的外形特征不在我们正常的游戏视野内出现(可采用隐形、透明贴图、位移到特别高或地下处等等手段)。


假设上面的1-200的slot变化控制方法执行完一次值域变化的总时间接近2秒,并且条件还是按m键触发。
根据spr_xxx根据进程控制的阶段类别,构造0-200, 210-400两个顶点动画帧时刻区间,

(get_player_agent_no, ":var_10"),   
(scene_prop_get_instance, ":var_0", "spr_xxx", 0),
(2616, ":var_1", ":var_0"),
(try_begin),
        (key_clicked, key_m),   
        (try_begin),
            (neg|gt, ":var_1", 400),
            (ge, ":var_1", 210),            
        (else_try),
            (2611, ":var_0", 210, 400, 2000),
        (try_end),                                 #以上try范围内表示按一次m键如果spr xxx的当前动画帧时刻不在210-400这个区间,则在210-400这个区间循环顶点动画,每次完成循环的时间为2秒
(else_try),
         (eq, ":var_1", 400),
         (2612, ":var_0", 0, 200, 2000),       #以上表示如果m键执行一次210-400区间的顶点动画到末尾帧时刻400时,转接0-200区间的循环顶点动画,类似于游戏人物的待机(idle)准备动作,看我理论总贴有提及过
(try_end),
(try_begin),
           (eq, ":var_1", 300),   #或   (is_between, ":var_1", 300, 320),最好给一个短区间,理由看下面总结的内容。
           (agent_get_position, pos1, ":var_10"),            
           (position_move_z, pos1, 150),
           (position_move_y, pos1, 20),
           (add_missile, ":var_10", 1, 64000, 0, 0, "itm_dandao", 0),
(try_end),


所以总结上面代码的道理就是:
spr xxx 在210-400区间的帧时刻动画状态即类似上面slot控制方法的slot为1-200取值的技能执行阶段,而0-200区间的帧时刻动画状态类似slot控制方法的slot为0的不释放技能的待机状态.
而选定实际造成攻击的瞬时点则为动画帧时刻在210-400的中间态即300的状态,但是推荐此采用短区间判断不用瞬时值判断,比如300-320这种,因为表面上按照我上面综合理论贴的前期导入设置关键帧0-1对应的帧数时刻是0-10,但是系统会将两个关键帧根据你的游戏帧数和播放时间和总帧数的比例进行匀速变化,也就是会在0-1的关键帧之间构造出5,6,7,8等等等的非openbrf里模型可显示的帧时刻状态,所以有的时候当你的顶点动画做的帧数不精细帧数较少但是却让它强制进行较长时间的播放时,系统就会根据自己的解析,在相邻的关键帧之间构造奇怪的中间形态进而产生扭曲的模型,比如轮子动画,如果你的轮子动画不精细但强制播放总时间较长,系统运气好还能分析出关键帧n到n+1是进行模型旋转产生的顶点动态变化,但大多时候直接把n关键帧状态的模型压扁扭曲缩小再放大膨胀到n+1关键帧的模型状态。然后对于骑砍里可以控制自动变化状态的代码,程序抓中间变化量是根据游戏帧数来的,比如我让动画从0播放到200的帧时刻,由于播放总时间较小,每次帧时刻+1的平均时间远低于0.000,0.000,0.000这个触发器条件的微秒级抓取能力(特别的,如果场景运行内容复杂占资源导致掉帧,抓取能力还会下降),那么0-200的动画区间播放时你可以找到eq 100的情况却抓不到eq 110的情况,所以根据顶点动画中间态的时刻值抓取要根据由动画播放时间与总关键帧比例形成的动画精细程度和游戏运行帧数而取一个小区间,而300-320是根据我一般的经验,游戏60帧的抓取能力算的。所以从这个角度只是给你们解释一下这个操作的弊端,实际上对中间帧的获取用的更多的方法是下面这个。
对于中间帧的抓取也可以用中间范围二次判断,为更佳的考虑,其实类比游戏的攻击和施法前后摇概念,对于动画产生时点效果的将区间进一步拆分,比如判断动画帧时刻大于300时,再转接其他的动画区间比如410-500给定一个短播放时间(如果考虑攻击具有短时间的多段伤害,或者更细一步把动作分为前摇后摇和收尾),因为op号2611去强制模型播放210-400的动画可能取不到中间值,但是210和400这个首尾值一定可以eq抓取到值,此时以410-500作为攻击动画后摇区间,则抓取410便是攻击的瞬时动画时刻,到500进行攻击后摇的过渡完再回归转接310-400区间的收尾动画。或者简单点,直接将210-400拆分为210-290前摇+300-400后摇两区间进行衔接播放(即:播210-290判断到eq290,则播300-400,此时300为播放区间的起帧时刻为eq易抓取的状态来执行时点事件产生攻击)。







评分

参与人数 2第纳尔 +20 互助 +2 魅力 +4 收起 理由
幼稚园殺手 + 10 + 1 + 4 文章不错,继续努力!
agjib + 10 + 1 您的帖子很有价值!

查看全部评分

0

主题

6

回帖

2

积分

平民

Rank: 1

UID
3603963
第纳尔
2
精华
0
互助
0
荣誉
0
贡献
0
魅力
0
注册时间
2024-1-13
鲜花(0) 鸡蛋(0)
发表于 2024-2-18 17:55:14 | 显示全部楼层
学习一下
您需要登录后才可以回帖 登录 | 注册(Register!)

本版积分规则

Archiver|手机版|小黑屋|骑马与砍杀中文站

GMT+8, 2024-11-19 08:23 , Processed in 0.127834 second(s), 20 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

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