骑马与砍杀中文站论坛

 找回密码
 注册(Register!)

QQ登录

只需一步,快速开始

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

[功能与代码] 使用场景道具辅助飞行学习笔记

[复制链接]

16

主题

108

回帖

197

积分

见习骑士

Rank: 3

UID
3304622
第纳尔
690
精华
0
互助
26
荣誉
3
贡献
0
魅力
158
注册时间
2021-12-28
鲜花(31) 鸡蛋(0)
发表于 2023-8-5 13:01:57 | 显示全部楼层 |阅读模式
本帖最后由 杰喵喵 于 2023-8-28 22:42 编辑

一、效果概述与展示
1.按Y按键腾空进入飞行状态,飞行状态下贴近地面自动退出飞行;
2.飞行状态下,人的飞行操作与原来一样,视角对着天空前进升高飞行高度,对着地面前进降低飞行高度。骑马飞行情况下,非骑射状态下视角对着天空前进升高飞行高度,对着地面降低飞行高度;骑射状态下不改变飞行高度,其余操作与地面控制一样。

效果展示:
使用场景道具辅助飞行测试_哔哩哔哩bilibili

特别鸣谢:nimoadna(《大冒险家》)的指导与解答。

二、关键概念
1.Position rotation
  # Position rotation determines just that - rotation around corresponding
  # world axis. So rotation around Z axis means rotation around vertical axis,
  # in other words - turning right and left. Rotation around X and Y axis will
  # tilt the position forward/backwards and right/left respectively.


简单来说,agent的Position默认Y轴是前进后,X轴左右移动,Z轴上下移动,Position rotation就是沿着这些轴旋转。

2.场景道具销毁
似乎没有绝对消除的办法,我这里使用场景隐身与关闭物理来解决。 (prop_instance_enable_physics,":borad",0),#关闭碰撞体 (scene_prop_set_visibility,":borad",0),  #关闭显示
3.使用与下次飞行位置的Z轴-1垂直点,通过  position_set_z_to_ground_level 来用于是否接触地面判断。因为玩家始终在托板上面,使用玩家位置点来position_get_distance_to_ground_level 始终大于等于0。具体实现看下面程序。

3.position_get_distance_to_terrain,pos对地形的距离负数表示在地形之下,正数在地形之上。

4.城墙或者其他场景上降落使用
(cast_ray, <destination>, <hit_position_register>, <ray_position_register>, [<ray_length_fixed_point>]),
强制转换一条长度为[<ray_length_fixed_point>]的射线,从<ray_position_register>开始,并将最近的命中位置存储到<hit_position_register>中(如果没有命中则失败)。如果body hit是一个prop实例,它的id将被存储到<destination>中。  
简单来说就是将agent的位置点往下移动,绕X轴旋转 90度,然后发射判断线,如果有碰撞到非踏板的其他场景单位,则取消飞行。

5.退出飞行直接将踏板埋在底下。

三、代码
slot_agent_fly 飞行状态标志位
slot_agent_fly_borad 存储飞行道具的ID


  1. init_the_key_y = (
  2.       
  3.   0,0,2,[
  4.   (key_clicked,key_y),
  5.   ],
  6.        [
  7.         (get_player_agent_no, ":player_agent"),
  8.         (agent_get_horse,":horse", ":player_agent"),
  9.         (agent_get_position, pos10, ":player_agent"),   
  10.       

  11.         (try_begin),
  12.             (gt,":horse",-1),
  13.             (assign,":var_0",":horse"),
  14.             (position_move_z,pos10,50),
  15.         (else_try),
  16.             (assign,":var_0",":player_agent"),
  17.             (position_move_z,pos10,25),
  18.         (try_end),        
  19.         
  20.         (agent_get_slot,":borad",":player_agent",slot_agent_fly_borad),
  21.         
  22.         (try_begin),
  23.           (le,":borad",0),
  24.           (display_message,"@player fly is on"),
  25.            #产生床
  26.           (set_spawn_position, pos10),
  27.           (try_begin),
  28.             (gt,":horse",-1),
  29.             (spawn_scene_prop, "spr_bed_a_new"),
  30.           (else_try),
  31.             (spawn_scene_prop, "spr_pillow_a_new"),
  32.           (try_end),
  33.           (assign,":borad",reg0),
  34.           (agent_set_slot,":player_agent",slot_agent_fly_borad,":borad"),
  35.           (display_message,"@spawn bed"),
  36.           (agent_set_slot,":player_agent",slot_agent_fly,1),
  37.           (agent_set_position, ":var_0", pos10),
  38.           (prop_instance_enable_physics,":borad",1),#碰撞体
  39.           (scene_prop_set_visibility,":borad",my_prop_set_visibility),  #显示
  40.         (else_try),
  41.            (prop_instance_enable_physics,":borad",1),#碰撞体
  42.            
  43.            #限制角度保护 X Y 轴rotation
  44.            (position_get_rotation_around_x, ":rotation_x", pos10),
  45.            (position_get_rotation_around_y, ":rotation_y", pos10),
  46.            
  47.            (try_begin),
  48.                 (gt,":rotation_x",0),
  49.                 (store_sub,":angle_x",":rotation_x",0),
  50.                 (val_mul,":angle_x",-1),
  51.                 (position_rotate_x,pos10,":angle_x"),
  52.            (else_try),
  53.                 (lt,":rotation_x",360),
  54.                 (store_sub,":angle_x",360,":rotation_x"),
  55.                 (position_rotate_x,pos10,":angle_x"),
  56.            (try_end),
  57.            
  58.            (try_begin),
  59.                 (gt,":rotation_y",0),
  60.                 (store_sub,":angle_y",":rotation_y",0),
  61.                 (val_mul,":angle_y",-1),
  62.                 (position_rotate_y,pos10,":angle_y"),
  63.            (else_try),
  64.                 (lt,":rotation_y",360),
  65.                 (store_sub,":angle_y",360,":rotation_y"),
  66.                 (position_rotate_y,pos10,":angle_y"),
  67.            (try_end),
  68.            
  69.            (prop_instance_set_position, ":borad", pos10),
  70.            (agent_set_slot,":player_agent",slot_agent_fly,1),
  71.            (agent_set_position, ":var_0", pos10),
  72.         (try_end),
  73.          
  74.        ]
  75. )  

  76. common_player_fly = (0.0, 0.000000, 0.000000,
  77.     [
  78.       (get_player_agent_no, ":player_agent"),
  79.       (agent_get_slot,":borad",":player_agent",slot_agent_fly_borad),
  80.       (gt,":borad",0),
  81.       (agent_slot_eq,":player_agent",slot_agent_fly,1),
  82.     ],
  83.     [
  84.     (set_fixed_point_multiplier, 100),
  85.    
  86.     (get_player_agent_no, ":player_agent"),
  87.     (agent_get_slot,":borad",":player_agent",slot_agent_fly_borad),
  88.    
  89.     (agent_get_horse,":horse", ":player_agent"),
  90.     (try_begin),
  91.         (gt,":horse",-1),
  92.         (assign,":var_0",":horse"),
  93.     (else_try),
  94.         (assign,":var_0",":player_agent"),
  95.     (try_end),
  96.          
  97.     (init_position,pos4),
  98.     (agent_get_look_position, pos4, ":player_agent"),
  99.     (init_position,pos2),
  100.     (prop_instance_get_position, pos2, ":borad"),     #场景物的坐标,实时获取
  101.    
  102.     (try_begin),
  103.             (key_is_down, key_w),
  104.             (assign,":z_move",0),
  105.             (assign,":y_move",0),
  106.             
  107.             (try_begin),
  108.                 (gt,":horse",-1),
  109.                 (agent_get_speed,pos20,":horse"),
  110.                 (position_get_y,":y_speed",pos20),
  111.                 (val_div,":y_speed",30),
  112.                 (assign,":y_move",":y_speed"),
  113.                  
  114.                 (position_get_rotation_around_x, ":rotation_x_player", pos4),
  115.                 (try_begin),
  116.                     (is_between,":rotation_x_player",1,91),#鼠标移动玩家视角向上 对着天空
  117.                     (store_div,":value", ":rotation_x_player",9),
  118.                     (val_add,":value",1),
  119.                     (store_div,":z_move",":y_speed",20),
  120.                     (val_mul,":z_move",":value"),
  121.                 (else_try),
  122.                     (is_between,":rotation_x_player",270,360),#鼠标移动玩家视角向下 对着地面
  123.                     (store_sub,":value", 360,":rotation_x_player"),
  124.                     (store_div,":value", ":value",9),
  125.                     (val_add,":value",4),
  126.                     (val_mul,":value",-1),
  127.                     (store_div,":z_move",":y_speed",20),
  128.                     (val_mul,":z_move",":value"),
  129.                 (try_end),
  130.                 #防止使用武器的时候Z轴上下移动,保证骑射水平移动
  131.                 (try_begin),
  132.                     (agent_get_attack_action, ":attack_action", ":player_agent"),
  133.                     (agent_get_defend_action, ":defend_action", ":player_agent"),
  134.                     (neq, ":attack_action",0),
  135.                     (neq, ":defend_action",0),
  136.                     (assign,":z_move",0),
  137.                  (try_end),
  138.                
  139.             (else_try),
  140.                  (agent_get_speed,pos20,":player_agent"),
  141.                  (position_get_y,":y_speed",pos20),
  142.                  (val_div,":y_speed",10),
  143.                  (assign,":y_move",":y_speed"),
  144.             (try_end),

  145.             (position_move_y, pos2, ":y_move"),
  146.             (position_move_z, pos2, ":z_move"),
  147.         (else_try),
  148.             (key_is_down, key_a),
  149.             (assign,":x_move",0),
  150.             (assign,":y_move",0),
  151.   
  152.             (try_begin),
  153.                 (gt,":horse",-1),
  154.                 (agent_get_speed,pos20,":horse"),
  155.                 (position_get_y,":y_speed",pos20),
  156.                 (val_div,":y_speed",30),
  157.                 (assign,":y_move",":y_speed"),
  158.                 (position_rotate_z, pos2, 1),  
  159.             (else_try),
  160.                 (agent_get_speed,pos20,":player_agent"),
  161.                 (position_get_x,":x_speed",pos20),
  162.                 (val_div,":x_speed",10),
  163.                 (assign,":x_move",":x_speed"),
  164.             (try_end),
  165.             
  166.             (position_move_x, pos2, ":x_move"),
  167.             (position_move_y, pos2, ":y_move"),
  168.         (else_try),
  169.             (key_is_down, key_s),
  170.             (assign,":y_move",0),
  171.             
  172.             (try_begin),
  173.                 (gt,":horse",-1),
  174.                 (agent_get_speed,pos20,":horse"),
  175.                 (position_get_y,":y_speed",pos20),
  176.                 (try_begin),
  177.                     (gt,":y_speed",0),
  178.                     (val_div,":y_speed",30),
  179.                     (assign,":y_move",":y_speed"),
  180.                (else_try),
  181.                     (assign,":y_move",-5),
  182.                (try_end),
  183.             (else_try),
  184.                 (agent_get_speed,pos20,":player_agent"),
  185.                 (position_get_y,":y_speed",pos20),
  186.                 (val_div,":y_speed",10),
  187.                 (assign,":y_move",":y_speed"),
  188.             (try_end),
  189.             
  190.             (position_move_y, pos2, ":y_move"),
  191.         (else_try),
  192.             (key_is_down, key_d),
  193.             (assign,":x_move",0),
  194.             (assign,":y_move",0),
  195.   
  196.             (try_begin),
  197.                 (gt,":horse",-1),
  198.                 (agent_get_speed,pos20,":horse"),
  199.                 (position_get_y,":y_speed",pos20),
  200.                 (val_div,":y_speed",30),
  201.                 (assign,":y_move",":y_speed"),
  202.                 (position_rotate_z, pos2, -1),  
  203.             (else_try),
  204.                 (agent_get_speed,pos20,":player_agent"),
  205.                 (position_get_x,":x_speed",pos20),
  206.                 (val_div,":x_speed",10),
  207.                 (assign,":x_move",":x_speed"),
  208.             (try_end),
  209.             
  210.             (position_move_x, pos2, ":x_move"),
  211.             (position_move_y, pos2, ":y_move"),
  212.      (else_try),
  213.             (key_is_down, key_v),
  214.             (position_move_z,pos2,20),
  215.     (else_try),
  216.             (key_is_down, key_b),
  217.             (position_move_z,pos2,-20),
  218.     (try_end),
  219.         
  220.     #骑马情况下,玩家不跟随鼠标视角
  221.     (try_begin),
  222.       (gt,":horse",-1),
  223.     (else_try),
  224.        (position_copy_rotation,pos2,pos4),
  225.        (position_get_rotation_around_x,":rotation_x",pos2),
  226.        #Z轴限制保护防止,角度过大出问题
  227.        (try_begin),
  228.             (is_between,":rotation_x",0,91),#鼠标移动玩家视角向上 对着天空
  229.             (try_begin),
  230.                 (gt,":rotation_x",45),
  231.                 (store_sub,":angle_x",":rotation_x",45),
  232.                 (val_mul,":angle_x",-1),
  233.                 (position_rotate_x,pos2,":angle_x"),
  234.             (try_end),

  235.        (else_try),
  236.             (is_between,":rotation_x",270,360),#鼠标移动玩家视角向下 对着地面
  237.             (try_begin),
  238.                 (lt,":rotation_x",315),
  239.                 (store_sub,":angle_x",315,":rotation_x"),
  240.                 (position_rotate_x,pos2,":angle_x"),
  241.             (try_end),
  242.        (try_end),
  243.     (try_end),
  244.    
  245.    
  246.     #获得地图最大限制
  247.     (get_scene_boundaries, pos26, pos27),#左下角和右上角的点,方向朝上
  248.     (position_get_x, ":lower_left_corner_x", pos26),
  249.     (position_get_y, ":lower_left_corner_y", pos26),
  250.     (position_get_x, ":upper_right_corner_x", pos27),
  251.     (position_get_y, ":upper_right_corner_y", pos27),         
  252.     (val_add,":lower_left_corner_x",50),
  253.     (val_add,":lower_left_corner_y",50),
  254.     (val_sub,":upper_right_corner_x",50),
  255.     (val_sub,":upper_right_corner_y",50),
  256.    
  257.     #设置障碍判断pos5
  258.     (init_position,pos5),
  259.     (copy_position ,pos5,pos2),
  260.     #移动点对地形的距离负数表示在地形之下,正数在地形之上。position_get_distance_to_terrain
  261.     (position_copy_origin ,pos6,pos2),
  262.     (position_get_distance_to_terrain,":terrain",pos6),

  263.     (try_begin),
  264.         (gt,":horse",-1),
  265.         (position_move_z, pos5, 300),
  266.         (position_move_y, pos5, 200),
  267.     (else_try),
  268.         (position_move_z, pos5, 150),
  269.         (position_move_y, pos5, 100),
  270.     (try_end),
  271.     #测试用点亮
  272.     #(particle_system_burst,"psys_torch_fire_big_b",pos5,10),

  273.     (position_get_x,":pos_x",pos2),
  274.     (position_get_y,":pos_y",pos2),
  275.     #确保玩家在地图限制范围内移动,,判断障碍点玩家之间拥有视野
  276.     (try_begin),#玩家正常飞行
  277.         #接近地面,是移动点与地面贴合,退出飞行
  278.         (le, ":terrain", 5),            
  279.         (display_message,"@player fly is off one"),  
  280.         (assign,reg20,":borad"),
  281.         (display_message,"@borad id {reg20}",":borad"),
  282.         (prop_instance_enable_physics,":borad",0),#关闭碰撞体
  283.         (agent_set_slot,":player_agent",slot_agent_fly,2),#退出飞行
  284.     (else_try),   
  285.         (init_position,pos3),
  286.         (init_position,pos6),
  287.         (agent_get_position,pos3,":var_0"),
  288.         (position_move_z,pos3,-20),
  289.         (position_rotate_x,pos3,90),
  290.         #(cast_ray, <destination>, <hit_position_register>, <ray_position_register>, [<ray_length_fixed_point>]),
  291.         #强制转换一条长度为[<ray_length_fixed_point>]的射线,从<ray_position_register>开始,并将最近的命中位置存储到<hit_position_register>中(如果没有命中则失败)。如果body hit是一个prop实例,它的id将被存储到<destination>中。   
  292.         (cast_ray,":prop_id",pos6,pos3,20),
  293.         (gt,":prop_id",-1),
  294.         (prop_instance_get_scene_prop_kind,":prop_kind",":prop_id"),
  295.         (neq,":prop_kind","spr_bed_a_new"),
  296.         (neq,":prop_kind","spr_pillow_a_new"),
  297.         (position_copy_rotation,pos6,pos2),
  298.         (copy_position,pos2,pos6),
  299.         (display_message,"@player fly is off two"),  
  300.         (assign,reg20,":borad"),
  301.         (display_message,"@borad id {reg20}",":borad"),
  302.         (prop_instance_enable_physics,":borad",0),#关闭碰撞体
  303.         (agent_set_slot,":player_agent",slot_agent_fly,2),#退出飞行
  304.     (else_try),
  305.         (gt,":pos_x",":lower_left_corner_x"),
  306.         (lt,":pos_x",":upper_right_corner_x"),
  307.         (gt,":pos_y",":lower_left_corner_y"),
  308.         (lt,":pos_y",":upper_right_corner_y"),
  309.         (agent_is_in_line_of_sight,":player_agent",pos5),
  310.         (prop_instance_set_position, ":borad", pos2),
  311.     (try_end),
  312.    
  313.     (prop_instance_get_position, pos2, ":borad"),     #场景物的坐标,实时获取
  314.     (agent_set_position, ":var_0", pos2),
  315.     #退出飞行将床埋在地下
  316.     (try_begin),
  317.         (agent_slot_eq,":player_agent",slot_agent_fly,2),#退出飞行  
  318.         (position_set_z,pos2,-500),
  319.         (prop_instance_set_position, ":borad", pos2),
  320.     (try_end),      
  321. ])
复制代码




如果有啥不足,欢迎各位大佬指正





评分

参与人数 1第纳尔 +10 魅力 +1 收起 理由
agjib + 10 + 1 您的帖子很有价值!

查看全部评分

31

主题

210

回帖

187

积分

见习骑士

Rank: 3

UID
2462463
第纳尔
1587
精华
0
互助
23
荣誉
0
贡献
0
魅力
83
注册时间
2015-3-3
鲜花(58) 鸡蛋(0)
发表于 2023-8-5 14:22:27 | 显示全部楼层
好厉害的样子,生成床是做啥用的啊?

16

主题

108

回帖

197

积分

见习骑士

Rank: 3

UID
3304622
第纳尔
690
精华
0
互助
26
荣誉
3
贡献
0
魅力
158
注册时间
2021-12-28
鲜花(31) 鸡蛋(0)
 楼主| 发表于 2023-8-5 16:01:30 | 显示全部楼层
战争傀儡阿格兰 发表于 2023-8-5 14:22
好厉害的样子,生成床是做啥用的啊?

战团自带的场景道具啊 bed_a

29

主题

751

回帖

574

积分

骑士

Rank: 4Rank: 4

UID
3322408
第纳尔
1748
精华
0
互助
68
荣誉
0
贡献
0
魅力
6
注册时间
2022-2-3
鲜花(57) 鸡蛋(0)
发表于 2023-8-5 16:08:14 来自手机 | 显示全部楼层
战争傀儡阿格兰 发表于 2023-8-5 14:22
好厉害的样子,生成床是做啥用的啊?

床是托底用的,生成床你可能觉得不明所以,生成一艘船或者飞机你就明白了。来自: Android客户端

31

主题

210

回帖

187

积分

见习骑士

Rank: 3

UID
2462463
第纳尔
1587
精华
0
互助
23
荣誉
0
贡献
0
魅力
83
注册时间
2015-3-3
鲜花(58) 鸡蛋(0)
发表于 2023-8-6 10:45:33 | 显示全部楼层
112233lyh 发表于 2023-8-5 16:08
床是托底用的,生成床你可能觉得不明所以,生成一艘船或者飞机你就明白了。

是不是理解为,玩家一直走在一个床上,床飞起来了,所以玩家也飞起来了?

29

主题

751

回帖

574

积分

骑士

Rank: 4Rank: 4

UID
3322408
第纳尔
1748
精华
0
互助
68
荣誉
0
贡献
0
魅力
6
注册时间
2022-2-3
鲜花(57) 鸡蛋(0)
发表于 2023-8-6 11:26:19 来自手机 | 显示全部楼层
战争傀儡阿格兰 发表于 2023-8-6 10:45
是不是理解为,玩家一直走在一个床上,床飞起来了,所以玩家也飞起来了?

是啊,托飞。来自: Android客户端
您需要登录后才可以回帖 登录 | 注册(Register!)

本版积分规则

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

GMT+8, 2024-12-28 04:06 , Processed in 0.158127 second(s), 23 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

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