- 好友
- 12
- 在线时间
- 486 小时
- 最后登录
- 2024-11-7
子爵[版主]
- UID
- 2893127
- 第纳尔
- 14847
- 精华
- 0
- 互助
- 93
- 荣誉
- 21
- 贡献
- 325
- 魅力
- 1382
- 注册时间
- 2017-11-5
鲜花( 431) 鸡蛋( 0)
|
楼主 |
发表于 2022-10-18 17:39:36
|
显示全部楼层
本帖最后由 vegetto 于 2023-1-12 09:39 编辑
接下来由粗糙到细节,由浅入深,从玩家到ai,给你们看看一些应用方法,以及同一种写法可以使用的不同场合和引申
玩家单体控制篇
实例1:不考虑碰撞的情况下,如何将玩家进行主动的六向无视碰撞地形的飞天遁地移动:
(0.000000, 0.000000, 0.000000,
[
],
[
(get_player_agent_no, ":var_0"),
(agent_get_position, pos1, ":var_0"),
(try_begin),
(agent_slot_eq, ":var_0", 30, 0), #玩家的序号为30的agent slot,可以你们自己定义,就像全局一样,记录数据来记录状态改变而已
(key_clicked, key_u),
(agent_set_slot, ":var_0", 30, 1),
(agent_set_no_dynamics, ":var_0", 1),
(else_try),
(agent_slot_eq, ":var_0", 30, 1),
(key_clicked, key_u),
(agent_set_slot, ":var_0", 30, 0),
(agent_set_no_dynamics, ":var_0", 0), #以上表示按U一次可以切回玩家no_dynamics开启和关闭的状态互切
(try_end),
(try_begin), #看下方整体解释
(this_or_next|key_is_down, key_w),
(this_or_next|key_is_down, key_a),
(this_or_next|key_is_down, key_s),
(this_or_next|key_is_down, key_d),
(this_or_next|key_is_down, key_v),
(key_is_down, key_left_control),
(agent_get_look_position, pos4, ":var_0"),
(position_copy_rotation, pos1, pos4),
(try_end), #以上代表了如果玩家按了wasdv和左边的ctrl键,pos1就会复制玩家视角
(try_begin),
(agent_slot_eq, ":var_0", 30, 1), #agentslot30为1对应了无动力学状态,所以为什么我要给一个slot,就是抓住了刚进场景大家都是动力学状态,但是没用op操作获取这个状态,那就自己构造一个
(try_begin),
(key_is_down, key_w),
(position_move_y, pos1, 20),
(else_try),
(key_is_down, key_a),
(position_move_x, pos1, -20),
(else_try),
(key_is_down, key_s),
(position_move_y, pos1, -20),
(else_try),
(key_is_down, key_d),
(position_move_x, pos1, 20),
(else_try),
(key_is_down, key_v),
(position_move_z, pos1, 20),
(else_try),
(key_is_down, key_left_control),
(position_move_z, pos1, -20),
(try_end), #以上表示了按住wdas v 左手的ctrl键(注意游戏里ctrl,shift这些键盘上不唯一的按键是占两个键位的)那就前后左右上下把玩家的位置以玩家视角的角度把坐标移动20厘米
(agent_set_position, ":var_0", pos1), 设置无动力学的玩家按照20厘米/触发器内置间隔时间的运动速度来移动。速度这种东西是你自己 把握的,要精确数值可以配合store timer a获取准确时间,不需要精确数值可以利用触发器内置间隔时间执行次数来控制
(try_end),
# (agent_set_visibility, ":var_0", 0), #玩家进行影身
# (mission_cam_set_mode, 1), #引申应用1: 游戏摄像机镜头控制功能,假如把蓝色字体的#去掉,在玩家的pos1位置设置摄像机,则玩家人的位置即为摄像机位置,加上对玩家的影身 ,那么控制玩家位移便是控制摄像机镜头位移
#(mission_cam_set_position, pos1),
]),
实例2:不考虑碰撞的情况下,如何将场景物进行主动的六向无视碰撞地形的飞天遁地移动【一般用于抛弃玩家本体,自己驾驶飞机但不显示人或者自己就是个飞龙或怪物时可配合顶点动画,配合碰撞检测代码(后面再写)】:
(0.000000, 0.000000, 0.000000,
[
],
[
(get_player_agent_no, ":var_0"), #知道为什么都场景物运动了,我还要获取玩家干什么,看下面两个copy rotation了解我的目的
(agent_get_position, pos1, ":var_0"), #玩家的坐标,实时获取
(scene_prop_get_num_instances, ":var_10", "spr_dragon"), #判断spr_dragon这个需要后面控制运动的场景物有几个
(try_begin),
(eq, ":var_10", 0),
(set_spawn_position, pos1),
(spawn_scene_prop, "spr_dragon"), #以上意思就是spr_dragon数量为0就在玩家的位置点pos1刷一个出来,主要就是场景物如果没有事先放置,你就要给刷一个,数量就是控制执行一次的条件。
(try_end),
(eq, ":var_10", 1),
(scene_prop_get_instance, ":var_1", "spr_dragon", 0), #飞行的对象就是spr_dragon这个场景物
(prop_instance_get_position, pos2, ":var_1"), #场景物的坐标,实时获取
#(agent_set_no_dynamics, ":var_0", 1), #引申做法1: 如何把实例1与实例2结合,也就是我前面讲的把agent和prop的运动优势结合。把深蓝字体的#注释去掉,通过场景物影其形,只留其运动控制与agent人之形结合。 也就是怎么搞的话实例2做的东西和实例1效果是差不多的。
#(scene_prop_set_visibility, ":var_1", 0), #场景物影身
#(agent_set_position, ":var_0", pos2),
(try_begin),
(this_or_next|key_is_down, key_w),
(this_or_next|key_is_down, key_a),
(this_or_next|key_is_down, key_s),
(this_or_next|key_is_down, key_d),
(this_or_next|key_is_down, key_v),
(key_is_down, key_left_control),
(agent_get_look_position, pos4, ":var_0"),
(position_copy_rotation, pos1, pos4),
(else_try),
(position_copy_rotation, pos1, pos2),
(try_end), #上面这段要配合下面镜头控制前的copy_rotation看,你们玩游戏有没有注意一个细节,就是玩家打人移动时镜头是视角方向,但是如果玩家站立不同,晃动鼠标旋转可以上下查看周身
(try_begin),
(key_is_down, key_w),
(position_move_y, pos2, 80),
(else_try),
(key_is_down, key_a),
(position_move_x, pos2, -80),
(else_try),
(key_is_down, key_s),
(position_move_y, pos2, -80),
(else_try),
(key_is_down, key_d),
(position_move_x, pos2, 80),
(else_try),
(key_is_down, key_r),
(position_move_z, pos2, 80),
(else_try),
(key_is_down, key_left_control),
(position_move_z, pos2, -80),
(try_end), #以上是为了让玩家在按r ctrl adws,上下左右前后将场景物的坐标按此方向移动80,但是首先运动时基准角度是玩家的视角方向,这样可以进行俯冲仰冲等等360度无死角自由的多向移动。所以涉及到运动旋转转弯的时候,巧用 (position_copy_rotation, 移动坐标, 视角坐标),的坐标复制十分便捷
(prop_instance_animate_to_position, ":var_1", 2, 5), 最后一个参数速度随你们调,不过我一般直接不写,因为我现在是高频触发,animate的运动效果的均匀化对我前面的位移控制影响不大,但是会降低移动速度,也就是animate不写参数和setpos还是有区别的,不写因为系统0.000触发还有微弱时间间隔。
(try_begin),
(neg|key_is_down, key_w),
(neg|key_is_down, key_a),
(neg|key_is_down, key_s),
(neg|key_is_down, key_d),
(neg|key_is_down, key_r),
(neg|key_is_down, key_left_control),
(agent_get_look_position, pos3, ":var_0"),
(position_copy_rotation, pos2, pos3),
(try_end), #这个就是我上面解释的,为了保证玩家运动时镜头平行视角能360度自由飞行,静止时可以晃动鼠标查看周身。
(try_begin),
# (scene_prop_set_visibility, ":var_1", 0), #将场景物影身
(position_rotate_x, pos2, 10), #引申应用2: 游戏摄像机镜头控制功能,假如把深蓝色字体的位移修正代码用#注释禁用,把浅蓝色的字体代码#注释符号拿掉启用,在场景物的pos2设置摄像机,则场景物位置即为摄像机位置,如果场景物影身或者本身就定义成不具备外表的空模型,那么控制场景物便是控制摄像机镜头
(position_rotate_z, pos2, -15),
(position_move_y, pos2, -125), #数值根据场景物的体型和性质调整
(position_move_z, pos2, -10), #数值根据场景物的体型和性质调整
(position_move_x, pos2, -15),
(mission_cam_set_mode, 1), #设为1摄像机将像agent场景物一样自由控制位置,否则就是你们常见的固定在肩部。后面我建议如果该场景物具备飞行和着陆条件,镜头位置应该分开写,因为着陆后的视野会窄一点。
(mission_cam_set_position, pos2), #这个是镜头调整,将摄像机调整到主动控制运动的物体身后的某个位置,也就是你希望镜头以第一/三人称观察哪个运动对象,就以哪个运动对象的pos调,最好你们自己重调,因为我后面涉及到这些的mod改太复杂了,应用的对象五花八门不是人,所以这个参数按场景物自身体型大小来调整,一般就是y坐标往后拉,这样可以展现物体整个后部,然后Z上调一点,因为一般物体的pos在自己脚下,比如这个物体是个龙,你至少z要调脑袋高,然后为什么我上面还涉及到旋转呢,因为我这个格斗游戏启发,因为格斗游戏人物身体会侧移,然后呢,空中生物最好视角往身体下方转一下,再左侧转一下,展现生物的部分侧面模型,不然正对后背,飞起来就会感觉有一种固定视角的贴图感觉
(try_end),
]),
未完待续-------------------后面用例将另外开贴,以上是运动控制基础贴,具体用法将长期黏贴我后面补充的各分贴实例或理论内容。
比如这个帖子,将上面六向运动但不受碰撞重力影响的情况,针对不同生物器具对象,进行更细的分析和代码控制分化:
爬行飞鸟各生物及飞行器装甲车大炮等对象运动行为控制特性的联系与区别方法论 https://bbs.mountblade.com.cn/thread-2096336-1-1.html
|
|