骑马与砍杀中文站论坛

 找回密码
 注册(Register!)

QQ登录

只需一步,快速开始

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

[功能与代码] 【战团】定点数fixed point multiplier 相关资料和心得

[复制链接]

31

主题

209

回帖

187

积分

见习骑士

Rank: 3

UID
2462463
第纳尔
1582
精华
0
互助
23
荣誉
0
贡献
0
魅力
83
注册时间
2015-3-3
鲜花(57) 鸡蛋(0)
发表于 2023-5-17 10:58:15 | 显示全部楼层 |阅读模式
代码环境1.171。
【战团】阿格兰魔球修改器——合集https://bbs.mountblade.com.cn/thread-2097734-1-1.html

参考资料:
MS数据操作基本讲解
https://bbs.mountblade.com.cn/thread-2089443-1-1.html

@815208129大佬鼓励我写出心得,那我就直接引用他帖子里现成的介绍作为引言,十分感谢!

小数运算:MS没有提供浮点数类型,只提供了定点数(定点数已经被整个计算机行业淘汰,现在计算机行业使用的是IEEE 754标准的浮点数).
不过,如果你真的想有浮点数,可以用slot来模拟.工具是加减乘除配合取余mod运算.这样精度可以自己调节.

下面介绍一下定点数的使用
相关的OP有以下这些
set_fixed_point_multiplier = 2124 #(set_fixed_point_multiplier, <value>),
convert_to_fixed_point     = 2130 # (convert_to_fixed_point,<destination_fixed_point>),
convert_from_fixed_point   = 2131 # (convert_from_fixed_point,<destination>),


心得是啥?就是当你写代码涉及到复杂运算,最好先从整数型开始做,比方角度是1度1度的来,位移是1单位和1单位的来,
不带小数点,也不带(set_fixed_point_multiplier,1000),这种
这样的好处是,虽然精度低了,但是你不会遇到匪夷所思的事情。

拿我自己举例:
例1.明明我写的(position_get_distance_to_ground_level,":height_6",pos46),在整数环境下,读到的是个整数,比方100单位。
加了(set_fixed_point_multiplier,1000),这句话,读出来的是1000??为什么?什么原理?不知道,我是自己试出来的

例2.明明我写的(cast_ray, ":uselessness", pos50, pos51,200),在整数环境下,射出的是200单位长度的射线。
加了(set_fixed_point_multiplier,1000),这句话,射出来的是20单位长度射线??为什么?什么原理?不知道,我是自己试出来的
如果我是第一次用cast_ray,我会百思不得其解,最终认为该方案不成功。。。




那么,不加(set_fixed_point_multiplier,1000),不就好了吗?引擎不许!一旦你的代码想在联机环境下生效,一旦你按下esc
那么不好意思,所有代码强制设置为(set_fixed_point_multiplier,1000)。。为什么?什么原理?不知道,我是自己试出来的


我暂时就发现了这两个例子,以上是我的心得,谢谢大家




212

主题

1032

回帖

1048

积分

子爵[版主]

Rank: 7Rank: 7Rank: 7

UID
2893127
第纳尔
14847
精华
0
互助
93
荣誉
21
贡献
325
魅力
1382
注册时间
2017-11-5
鲜花(431) 鸡蛋(0)
发表于 2023-5-17 12:31:39 | 显示全部楼层
本帖最后由 vegetto 于 2023-5-17 12:49 编辑

首先不用解释的太复杂专业,其实这个就相当于一种表示度量衡单位换算的方式。看有些操作的注释就可以知道,向长度角度和时间这种,带有分亳微等单位换算。有些获取相关值的op就是里面就写了,如果你默认的单位是米,浮点设置10那就变成了分米。
世上本来没有度量衡有了人才人为划定这些东西,骑砍有的参数不得不采用浮点设置,是因为长度角度这种数值会被配套的三角函数距离获取等等相关运算的op引用,所以要给定一个单位标准才能正确计算。
要是比如形容什么法术强度之类的,满额强度一定的情况下划分1000分为一点还是一万分为一点都是看个人意愿,就没有什么需要浮点应用但是实际操作的时候有这种人为的类似思想。

然后至于为什么联机模式esc会让你感觉浮点数不设置就会变成1000,其实不是这样的。其实你可以把浮点数设置的这个数字看成一个全局变量,相当于每写一句这op,对同一个全局变量只设置一次值,这样就好理解了,假如一个全局变量在连续两个触发器都无延时条件写了一遍,最后的取值就变成了后面一个,假如第一个触发器写了,第二个触发器没写,那么第二个触发器要引用这个值的时候就会按照第一个触发设置的值。因为esc切换到设置界面返回时,会重置一遍界面系统的触发,而界面系统一般经常会写浮点1000,所以才导致后面其他触发器没有写浮点数但是采用了需要获取浮点数的op受到了上一个触发器相关的影响。所以说,只要是op注明参数带fixed point的,除非场景运行的一切触发都按同一个浮点值来,否则前面一定要设置浮点值。
所以这也说明了哪怕是几个触发器都是000的条件,游戏读取的时候还是有前后顺序的,所以多个触发器摆放的位置顺序也很重要。



~~~~
除此之外,还有一个比较特殊的带度量衡的量,牛顿力,在需要操作动态物理的场景物上,会把对物体施加的牛顿力分解成xyz三个方向。
您需要登录后才可以回帖 登录 | 注册(Register!)

本版积分规则

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

GMT+8, 2024-11-19 10:30 , Processed in 0.122005 second(s), 20 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

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