骑马与砍杀中文站论坛

 找回密码
 注册(Register!)

QQ登录

只需一步,快速开始

搜索
购买CDKEY 衣谷三国
查看: 1581|回复: 1

[功能与代码] 做类似《传奇》游戏的动态头顶特效文字头衔(贴图+代码)

[复制链接]

215

主题

1038

回帖

1051

积分

子爵[版主]

Rank: 7Rank: 7Rank: 7

UID
2893127
第纳尔
14867
精华
0
互助
93
荣誉
21
贡献
325
魅力
1384
注册时间
2017-11-5
鲜花(435) 鸡蛋(0)
发表于 2025-7-18 00:09:07 | 显示全部楼层 |阅读模式
传奇序列图dds及brf处理的百度云资源如下
https://pan.baidu.com/s/1WUbToQlBCDeTFAjvV_lCJA?pwd=7456

做类似《传奇》游戏的动态头顶特效文字头衔(贴图+代码)
这个是什么呢

首先看我的关于骑砍“动图”(实质是序列图动画)应用的综合理论贴:【关于革命性操作贴图变换模拟动图系统在骑砍里的综合应用 https://bbs.mountblade.com.cn/thread-2098384-1-1.html




就是这个动图上面的“圣皇”艺术动态文字头衔效果,采用的就是利用平面mesh模型作为prop,始终对准镜头,然后利用prop更改material材质的op操作实现类似动图效果的序列图动画,这个也就是我的骑马与砍杀战团拳皇/DNF mod的原理基础,请自行根据总贴熟悉理论,后面的代码示例我没空详细注释的。
然后这个头衔比如说你可以作为3D人物在特定场景里像一些传奇类游戏一样人物头顶呈现动态的人物地位称号,比较酷炫网游化一点。


接下来是代码示例,简单注释,自行消化:

首先为了方便复制到所有MT的战场模式,直接MT中每个相关触发器只引用一串script,假设写在MT 的lead charge 野战中



(ti_before_mission_start, 0.000000, 0.000000,
    [
    ],
    [
        (call_script, "script_beforebas"),
    ]),





   (ti_on_agent_spawn, 0.000000, 0.000000,
    [
    ],
    [
        (call_script, "script_bastispawn"),
    ]),






    (ti_on_agent_killed_or_wounded, 0.000000, 0.000000,
    [
    ],
    [
        (call_script, "script_bastikill"),
    ]),





    (0.000000, 0.000000, 0.000000,
    [
    ],
    [
        (call_script, "script_bastitle1"),
    ]),



    (0.050000, 0.000000, 0.000000,
    [
    ],
    [
        (call_script, "script_bastitle2"),
    ]),


接下来到script文档加几个脚本
---------------------------
脚本1:在script加入脚本script_beforebas,作用是初始化一个相关变量
(assign, "$me", 1),

脚本2:在script加入脚本script_bastispawn,作用是跟随士兵刷出特定的纸片形状prop,来作为播放器,播放动图形式的动态文字。


(store_trigger_param_1, ":var_0"),
(set_fixed_point_multiplier, 100),
(agent_get_troop_id, ":var_1", ":var_0"),
(call_script, "script_troop_agent_set_banner", "tableau_game_troop_label_banner", ":var_0", ":var_1"),
(val_add, "$me", 1),
(agent_set_slot, ":var_0", 50, "$me"),       #请注意在此下方加一个判断"$me"或者agentslot 50或其他变量取多少范围才刷头衔prop,目前我示例写法阉割了条件是都加,你们几百人上场引擎受不起的,而且也并不需要对小角色加,这个刷选对象条件由你们自己把握,并且对下面所有循环特定带头衔agent的筛选条件进行统一统筹
(agent_get_position, pos3, ":var_0"),
(set_spawn_position, pos3),
(spawn_scene_prop, "spr_skill1"),
(scene_prop_set_slot, reg0, 701, "$me"),
(scene_prop_set_visibility, reg0, 0),
(store_random_in_range, ":var_11", 0, 13),
(store_mul, ":var_20", ":var_11", 10),
(store_add, ":var_21", ":var_20", 70001),
(store_add, ":var_22", ":var_20", 70010),

(scene_prop_set_slot, reg0, 101, ":var_21"),
(scene_prop_set_slot, reg0, 102, ":var_22"),      #因为我提供的图片贴图同材质命名为数字70001-700130,并且每10个连续数字比如70001-70010是同一个特效动态头衔文字图片的不同序列帧图,所以利用:var_11随机数判断你初始化采用什么头衔,如果你有特定条件,那就指定:var_11是多少,有新的头衔图片素材,往后面续加



脚本3:在script加入脚本script_bastikill,作用是当头顶带特效文字头衔的士兵死亡时,触发这个头衔纸片prop场景物的隐身消失。


(store_trigger_param_1, ":var_0"),
(store_trigger_param_2, ":var_1"),
(agent_get_slot, ":var_5", ":var_0", 50),
(try_begin),
    (scene_prop_get_instance, ":var_8", "spr_skill1", ":var_5"),
    (scene_prop_set_slot, ":var_8", 66, 0),
(try_end),                                       


脚本4:在script加入脚本script_bastitle1,作用是指定这些带特效文字头衔的agent的特效文字序列贴图的变化上下限范围,以及循环这些agent,让序号对应的特效文字prop跟随特定agent并且保持prop纸片模型始终正对镜头。


(set_fixed_point_multiplier, 1000),
(get_player_agent_no, ":var_0"),
(agent_get_position, pos1, ":var_0"),
(mission_cam_get_position, pos3),
(try_begin),
    (troop_slot_eq, "trp_player", 404, 0),
    (key_clicked, key_y),
    (troop_set_slot, "trp_player", 404, 1),
(else_try),
    (troop_slot_eq, "trp_player", 404, 1),
    (key_clicked, key_y),
    (troop_set_slot, "trp_player", 404, 0),
(try_end),                                                                     #troopslot 404取值由键盘y键点击控制,取值0-1,代表是否显示所有人头顶的动态头衔
(try_for_agents, ":var_1"),
    (agent_is_alive, ":var_1"),
    (agent_is_human, ":var_1"),
    (agent_get_troop_id, ":var_2", ":var_1"),
    (agent_get_slot, ":var_3", ":var_1", 50),
    (is_between, ":var_3", -1, 10),
    (try_begin),
        (scene_prop_get_instance, ":var_4", "spr_skill1", ":var_3"),
        (ge, ":var_4", 0),
        (agent_get_position, pos2, ":var_1"),
        (get_distance_between_positions, ":var_5", pos1, pos2),
        (position_copy_rotation, pos2, pos3),
        (position_move_z, pos2, 200),
        (prop_instance_set_position, ":var_4", pos2),
        (scene_prop_get_slot, ":var_6", ":var_4", 11),                                #propslot11记录当前头衔prop设置显示的当前帧图
        (scene_prop_get_slot, ":var_7", ":var_4", 65),                                #propslot65阉割了非本功能的触发内容,没有用
        (scene_prop_get_slot, ":var_8", ":var_4", 66),                                #propslot66表示是否隐身头衔prop
        (scene_prop_get_slot, ":var_9", ":var_4", 101),                            #spawn agent的trigger里初始设定头衔prop播放特定序列图的首帧
        (scene_prop_get_slot, ":var_10", ":var_4", 102),                         #spawn agent的trigger里初始设定头衔prop播放特定序列图的尾帧
        (try_begin),
            (troop_slot_eq, "trp_player", 404, 1),        
            (ge, ":var_5", 300),
            (scene_prop_set_slot, ":var_4", 66, 1),
        (else_try),
            (scene_prop_set_slot, ":var_4", 66, 0),
        (try_end),                                                                     #以上表示由键盘y键控制的troopslot404由0切1且玩家与带头衔agent距离超过300时,通过propslot66设为1来使得头衔prop处于显示状态,否则propslot66为0时就隐身头衔prop而不显示。
        (try_begin),
            (ge, ":var_6", ":var_10"),
            (prop_instance_set_scale, ":var_4", 1000, 1000, 1000),
            (scene_prop_set_slot, ":var_4", 11, ":var_9"),
        (else_try),
            (neg|ge, ":var_6", ":var_9"),
            (prop_instance_set_scale, ":var_4", 1000, 1000, 1000),
            (scene_prop_set_slot, ":var_4", 11, ":var_9"),
        (try_end),                                                                 #意思就是slot11记录的:var_6当前帧如果超过目前头衔序列图的尾帧,则重置到首帧,如果低于首帧,则也突变到首帧,也就是保障贴图按序列图切换时能在(首帧,尾帧)之间反复循环。set_scale是调整头衔prop尺寸,默认1倍,以防大小需要调整先备用写上。
    (try_end),
(try_end),



脚本5:在script加入脚本script_bastitle2,作用是让各自的agent头顶的动态特效文字头衔prop按照设定的序列图片帧数范围进行循环播放(循环贴图变化设置)

(scene_prop_get_num_instances, ":var_0", "spr_skill1"),
    (try_for_range, ":var_1", 0, ":var_0"),
        (scene_prop_get_instance, ":var_2", "spr_skill1", ":var_1"),
        (try_begin),
            (scene_prop_get_slot, ":var_3", ":var_2", 11),
            (scene_prop_get_slot, ":var_4", ":var_2", 66),
            (scene_prop_get_slot, ":var_5", ":var_2", 67),
            (scene_prop_get_slot, ":var_6", ":var_2", 101),
            (scene_prop_get_slot, ":var_7", ":var_2", 102),
            (try_begin),
                (neg|eq, ":var_6", ":var_7"),
                (scene_prop_slot_eq, ":var_2", 66, 1),
                (scene_prop_set_visibility, ":var_2", 1),
                (assign, reg21, ":var_3"),
                (str_store_string, s21, "str_mjb"),
                (2617, ":var_2", -1, 21),
                (val_add, ":var_3", 1),
                (scene_prop_set_slot, ":var_2", 11, ":var_3"),                          #以上就是当初始化设定头衔prop首帧不等于尾帧即设定有效时,且slot66代表特效prop显示而不隐身时,就对特效prop的material材质设置为propslot11的值,而propslot11值由下一个触发进行在(首帧,尾帧)循环加1的过程
            (else_try),
                (scene_prop_set_visibility, ":var_2", 0),                         #不满足else上部的条件,特效prop则隐身而不显示。
            (try_end),
        (try_end),
    (try_end),



----------------------------------------------------
然后module_scene_props里加 ("skill1", sokf_moveable, "skill1", "0", []),                           #spr_skill1就是特效头衔,在我提供的百度云素材查看brf你会发现是一个长方形双面显示的纸片模型。
variables加全局$me                                                                                                   #为了给agent额外加序号编号,这样可以和同一类prop的序列进行一一对应,分别错开控制对应agent头顶的头衔序列图特效播放
module_strings里加 ("mjb", "{reg21}"),    #利用reg21记录序列图贴图材质的数字形式的命名,由此,便可以通过改变reg21来改变str_mjb,进而通过2617号操作让prop重设material达到动态切换贴图效果,且无需用枚举法切换,如果你的贴图是纯粹英文字母,那用枚举法设贴图,你想实现大批量大帧数的动图效果就捉襟见肘了

评分

参与人数 1魅力 +1 收起 理由
英勇的苹果 + 1 您的帖子很有价值!

查看全部评分

鲜花鸡蛋

英勇的苹果  在2025-7-18 10:35  送朵鲜花  并说:感谢大佬分享!

215

主题

1038

回帖

1051

积分

子爵[版主]

Rank: 7Rank: 7Rank: 7

UID
2893127
第纳尔
14867
精华
0
互助
93
荣誉
21
贡献
325
魅力
1384
注册时间
2017-11-5
鲜花(435) 鸡蛋(0)
 楼主| 发表于 2025-7-18 00:17:20 | 显示全部楼层
本帖最后由 vegetto 于 2025-7-18 00:18 编辑

我的早期做法,而后期结合“关于item场景物化控制模拟新粒子系统的思路https://bbs.mountblade.com.cn/thread-2104232-1-1.html”这一套理论,可以利用item当prop更好的控制这种动图特效的生命周期,省的循环控制隐身和显形
您需要登录后才可以回帖 登录 | 注册(Register!)

本版积分规则

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

GMT+8, 2025-9-4 15:08 , Processed in 0.079870 second(s), 19 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

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