骑马与砍杀中文站论坛

 找回密码
 注册(Register!)

QQ登录

只需一步,快速开始

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

[功能与代码] 简易的随机地面升降机关

[复制链接]

212

主题

1032

回帖

1048

积分

子爵[版主]

Rank: 7Rank: 7Rank: 7

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


主要应用于我的骑马与砍杀篮球足球mod里(https://bbs.mountblade.com.cn/forum.php?mod=viewthread&tid=2099079),效果是球场随机出现若干铁丝门、木头柱子在随机位置升降(不同障碍物时段错开非同时),对场上的人的活动自由进行干扰,但未设置伤害。


以下简写,本人非MSmod,var变量表示,仅一块触发器,放于MT文件,特定战场MT中新增一处0,0,0 触发条件的触发器。
    (set_fixed_point_multiplier, 100),
    (get_player_agent_no, ":var_0"),
    (agent_get_position, pos1, ":var_0"),
    (copy_position, pos2, pos1),
    (position_move_z, pos2, -10000),
    (scene_prop_get_instance, ":var_1", "spr_sp13", 0),        #这个sp13物体是相当于我篮球足球场地的中场圆形划线的圆点,因为在场地的中心,用来判断机关障碍物体出现的范围比较方便。
    (prop_instance_get_position, pos3, ":var_1"),
    (copy_position, pos5, pos3),
    (position_move_z, pos5, -1000),
    (position_get_z, ":var_2", pos3),
    (position_get_z, ":var_3", pos5),
     # (try_begin),
    #。。。。。。。。。。。。。
    # (assign, "$kindbar", 0),     
    #  (try_end),                           #以上带#蓝色字体省略,作用是因为某某某条件,初始化设置$kindbar的值,对应下面对应的障碍物类型,本mod这一处写到了tispawn去初始化的,故这里省略未提及。如果只有一个障碍物,可以去掉省略号,无条件设一下$kindbar的值
    (try_begin),
        (eq, "$kindbar", 0),                                            
        (assign, "$namebar", "spr_gratecn"),      #spr_laddercn是铁丝门模型的场景物
    (else_try),
        (eq, "$kindbar", 1),
        (assign, "$namebar", "spr_laddercn"),     #spr_laddercn是梯子模型的场景物
    (else_try),
        (eq, "$kindbar", 2),
        (assign, "$namebar", "spr_treecn1"),      # 根据其他地方初始化条件判断$kindbar确定障碍物,比如spr_treecn1是一个木头桩子,存在$namebar变量中,下面可以继续else,或者有成百上千障碍物可以按顺序注册sceneprop py,然后变量值和prop序号值对应,更方便一点
    (try_end),
    (scene_prop_get_num_instances, ":var_4", "$namebar"),
    (try_begin),
        (neg|ge, ":var_4", 9),
        (set_spawn_position, pos2),
        (spawn_scene_prop, "$namebar"),
        (scene_prop_set_slot, reg0, 100, ":var_4"),
    (try_end),                                                                 #上面的意思是特定障碍物$namebar要刷出9个就停止刷
    (ge, ":var_4", 9),
    (try_for_range, ":var_5", 0, ":var_4"),
        (scene_prop_get_instance, ":var_6", "$namebar", ":var_5"),        #以上2句循环这9个全部的障碍物$namebar
        (try_begin),
            (scene_prop_slot_eq, ":var_6", 101, 0),
            (store_random_in_range, ":var_7", -180, 180),
            (store_random_in_range, ":var_8", 0, 2500),
            (scene_prop_set_slot, ":var_6", 102, ":var_7"),
            (scene_prop_set_slot, ":var_6", 103, ":var_8"),
            (scene_prop_set_slot, ":var_6", 101, 1),
        (else_try),                                                     #这段else_try以上部分就是prop101号slot在值为0时,存储障碍物根据sp13中场中心位置随机出现的距离范围0-2500和随机角度-180-180度(分别存在propslot102、103号内),但是不进行位置设置。
            (scene_prop_slot_eq, ":var_6", 101, 1),
            (scene_prop_set_slot, ":var_6", 101, 2),
        (else_try),                                                      #这段else_try以上部分因为我是0,0,0触发,如果try prop高频触发器中prop101号数据不过渡一个1,整体所有其他功能的运算复杂引擎负担重后就容易会和下一个else try串数据。
            (scene_prop_slot_eq, ":var_6", 101, 2),
            (scene_prop_get_slot, ":var_9", ":var_6", 102),
            (scene_prop_get_slot, ":var_10", ":var_6", 103),
            (position_rotate_z, pos3, ":var_9"),
            (position_move_y, pos3, ":var_10"),
            (position_move_z, pos3, -1000),
            (prop_instance_set_position, ":var_6", pos3),
            (scene_prop_set_slot, ":var_6", 101, 3),
        (else_try),                                                         #这段else_try以上部分就是prop101号slot在值为2时,根据前面储存的以sp13中场中心位置的距离范围和随机角度值,进行位置初始设置,以sp13平齐的球场位置下移1000长度到地下。
            (scene_prop_slot_eq, ":var_6", 101, 3),
            (scene_prop_set_slot, ":var_6", 101, 4),
        (else_try),                                                        #这段else_try以上部分因为我是0,0,0触发,如果try prop高频触发器中prop101号数据不过渡一个1,整体所有其他功能的运算复杂引擎负担重后就容易会和下一个else try串数据。
            (scene_prop_slot_eq, ":var_6", 101, 4),
            (prop_instance_get_position, pos4, ":var_6"),
            (position_get_z, ":var_11", pos4),
            (try_begin),
                (ge, ":var_11", ":var_2"),
                (scene_prop_set_slot, ":var_6", 101, 5),
            (else_try),
                (position_move_z, pos4, 50),
                (prop_instance_animate_to_position, ":var_6", 4, 5),
            (try_end),
        (else_try),        #这段else_try以上部分就是prop101号slot在值为4时,判断障碍物上升的运动过程,:var_11是障碍物的z坐标,var_2是sp13也就是球场中场线位置z坐标(篮球场平坦,代表整个场地地面z坐标)也就是说障碍物没从地下-1000位置把底盘升出场地,就会一直上升
            (scene_prop_slot_eq, ":var_6", 101, 5),
            (prop_instance_get_position, pos4, ":var_6"),
            (position_get_z, ":var_11", pos4),
            (try_begin),
                (ge, ":var_11", ":var_3"),
                (position_move_z, pos4, -50),
                (prop_instance_animate_to_position, ":var_6", 4, 5),
            (else_try),
                (scene_prop_set_slot, ":var_6", 101, 6),
            (try_end),
        (else_try),           #这段else_try以上部分就是prop101号slot在值为5时,判断障碍物下降的运动过程,:var_11是障碍物的z坐标,:var_3看我开头处理好的,也就是根据sp13球场中场线中心位置下降1000的位置的z坐标,也就是说和我障碍物随机移动藏于地下的初位置Z坐标相等
            (scene_prop_slot_eq, ":var_6", 101, 6),
            (scene_prop_set_slot, ":var_6", 101, 0),              #这段以上部分prop101号slot值从下降过程的6归0,重置这个过程,循环往复。
        (try_end),                        
    (try_end),


本触发器结束
-----------------------------------
此外在sceneprop文件自行注册spr_gratecn等场景物id以及全局量等等。


评分

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

查看全部评分

212

主题

1032

回帖

1048

积分

子爵[版主]

Rank: 7Rank: 7Rank: 7

UID
2893127
第纳尔
14847
精华
0
互助
93
荣誉
21
贡献
325
魅力
1382
注册时间
2017-11-5
鲜花(431) 鸡蛋(0)
 楼主| 发表于 2024-2-19 08:26:07 来自手机 | 显示全部楼层
本帖最后由 vegetto 于 2024-2-19 08:30 编辑

由于这个用于特殊的打篮球足球的模组,球场地坪平坦化并且用很多物体如上面涉及的sp13标记了球场标线各个节点。所以取巧以这个作为地面。实际在比较起伏的地面中,请根据ground level来计算障碍物的升降范围。
以及可以考虑单体化或调整障碍数量,调整模型样式,限定所有障碍位置,比如技能强制排成一竖排,做类似刀塔小强、恶魔巫师的地面穿刺之类技能
来自: iPhone客户端

29

主题

738

回帖

565

积分

骑士

Rank: 4Rank: 4

UID
3322408
第纳尔
1748
精华
0
互助
67
荣誉
0
贡献
0
魅力
6
注册时间
2022-2-3
鲜花(57) 鸡蛋(0)
发表于 2024-2-19 12:38:53 来自手机 | 显示全部楼层
有没有办法让AI避开障碍物?来自: Android客户端
您需要登录后才可以回帖 登录 | 注册(Register!)

本版积分规则

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

GMT+8, 2024-11-19 08:30 , Processed in 0.131999 second(s), 25 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

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