中国虚拟军事网(VME)- 专注于武装突袭系列虚拟军事游戏

 找回密码
 加入VME

QQ登录

只需一步,快速开始

搜索
楼主: FFUR2007SLX2_5

[教程] 《武装突袭3》脚本编写高级教程【255楼,武装突袭3——疯狂的戴夫和他的重量】

    [复制链接]
发表于 2013-10-3 20:55:43 | 显示全部楼层
认真学习...............{:soso_e179:}
发表于 2013-10-3 20:56:52 | 显示全部楼层
强烈围观....
发表于 2013-10-3 21:06:41 | 显示全部楼层
学习一下喽
发表于 2013-10-3 22:40:55 | 显示全部楼层
支持一下
发表于 2013-10-4 02:54:35 | 显示全部楼层
222222222222555555555555555555555555556333333333333333333333333333111111111222222222
发表于 2013-10-4 12:36:34 | 显示全部楼层
收藏备用
发表于 2013-10-4 15:56:07 | 显示全部楼层
很好,努力学习!
 楼主| 发表于 2013-10-4 16:59:47 | 显示全部楼层
本帖最后由 FFUR2007SLX2_5 于 2013-10-5 09:55 编辑

55楼,惰性求值

何为惰性求值?简单的说就是“这么写我可以让我的代码跑更快一点”,有人会说这不是脑子有病吗?同样的效果当然挑简单的写咯。其实不然,在后面的课程中我们就会发现其差别……

开工之前给大家介绍一个新朋友(其实也不新了,因为武装突袭3Alpha它就来了,只不过我们没鸟过它,但既然是高级教程了,我们得时常请它来家做客,以后的教程我会一直用它)
BIS_fnc_codePerformance,它可以测你的代码运行速度。方法是:
  1. [expression,(cycles)] call BIS_fnc_codePerformance;
复制代码
Expression中可以放你的代码,一坨也可以,相同的功能不同的写法速度也不同,这里涉及到代码优化,到后面再说。代码速度快说明你优化的好,优化的好就可以考虑把它作为服务器的高频使用函数,可以有效提高带宽利用率(可以这么说)。
http://community.bistudio.com/wiki/BIS_fnc_codePerformance



概念介绍好后就是惰性求值:
我们写脚本的最喜欢做什么事?
对了!就是
  1. if (a && b && c) then {
  2.     //一坨代码
  3. };
复制代码
如果怎么样怎么样然后什么什么。但是武装突袭的引擎可不会这么想,在我们的思维中abc倘若任何一个不满足条件那一坨代码就不会执行,确实,但武装突袭的脑子你看不懂,她会不停的判断直到括号结束为止,换言之她要把每个条件都给判断一遍才善罢甘休。既然b不满足条件,那我们要叫她判断c干什么?这不是浪费计算资源吗?

所以人道一点的编写者会这么写:
  1. if (a) then {
  2.     if (b) then {
  3.         if (c) then {
  4.             //一坨代码
  5.         };
  6.     };
  7. };
复制代码
这么只要有任意一个不满足条件我们就可以喊停。(现在我们开始对脚本优化了,效果如何?我们可以用刚才的codePerformance进行测速)。
既然这样,聪明的BI程序员在武装突袭中引入了惰性求值这一概念,我们常用的写法是:
  1. 布尔 [and/or] 布尔 [and/or] 布尔 … [and/or] 布尔
复制代码
惰性求值的写法:
  1. 布尔 [and/or] 代码 [and/or] 代码 … [and/or] 代码
复制代码
第一个开始的得是布尔值(就是true/false),紧跟其后的全部是代码,这些代码的结果必须返还布尔值,所以要换成惰性求值我们得要改变一下句法:
  1. if (a && {b} && {c}) then {
  2.     //一坨代码
  3. };
复制代码
或许在if中你看不出惰性求值的优势,但在switch, while和waitUntil中就明显了。
我们来看下这个例子:
  1. private ["_result","_step","_c"];   
  2. _result = "is false";  
  3. a = {
  4.     _step = "1";  
  5.     true;
  6. };  
  7. b = {  
  8.     _step = "2";  
  9.     false;
  10. };  
  11. _c = {  
  12.     _step = "3";  
  13.     true;
  14. };
  15. scopeName "main";
  16. while {call a && b && _c} do {
  17.     _result = "is true";
  18.     breakTo "main";
  19. };
  20. hintSilent format ["Expression %1, quit at step %2", _result, _step];
复制代码
以上代码返回的结果是Expression is false, quit at step 2. 明显这个循环在b就退出了,没有任何计算上的浪费。而a,b,_c呢?你可以写很长的判断码,比起之前的两个老写法,肯定快上许多!

怎么测试很简单,直接拖到万能的debug console去就行了,别另外写sqf了,麻烦。



祝愉快,ffur2007slx2_5

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入VME

x
 楼主| 发表于 2013-10-4 17:02:02 | 显示全部楼层
本帖最后由 FFUR2007SLX2_5 于 2013-10-5 09:58 编辑

56楼,武装突袭3 - 神奇的变量



武装突袭3共有5种变量:私用变量,特殊私用变量,局部变量,特殊局部变量和全局变量。

私用变量大家已经熟得不能再熟了,只要前面带下划线的不必私用声明游戏直接会把它们默认为私用变量(其实像_______OhYeah,__o_yeah这种都算)只不过我们得记住一旦它们离开了自己的语块就无法“存活”了。

特殊私用变量是啥玩意?其实就是游戏已经取好名字的私用变量,我们平时没事不要把自己的变量名取得和它们一样,免得出岔子(虽然概率比较小,但还是尽量避免)

这里有张表,黑色的私用变量已经被自己所对应的代码包了,这些私用变量在它们各自的语块中都有特殊的含义。


    
_alt
        
    
_destination
        
    
_exception
        
    
_forEachIndex
        
    
_from
        
    
_group
        
    
_id
        
    
_isHighCommand
        
    
_isSelected
        
    
_leader
        
    
_name
        
    
_new
        
    
_pos
        
    
_sentenceId
        
    
_shift
        
    
_target
        
    
_this
        
    
_to
        
    
_topic
        
    
_uid
        
    
_units
        
    
_x
        

譬如说_x在嵌套数组中的示例:
  1. {
  2.     {
  3.         hint str _x; //_x is 1
  4.     } forEach _x; //_x is [1,2,3]
  5. } forEach [[1,2,3],[4,5,6],[7,8,9]];
复制代码
这种私用变量不必去声明了,都是引擎默认的(中级教程,资深玩家可忽略)

稍微高级点,如果你想在子类循环中去求得父类变量的值,可以先把_x赋值于另一个变量随后再在子类循环中传递。
  1. {
  2.     _x2 = _x;
  3.     {
  4.         hint str _x; //_x is 1
  5.         hint str _x2; //_x2 is [1,2,3]
  6.     } forEach _x;
  7. } forEach [[1,2,3],[4,5,6],[7,8,9]];
复制代码
好了特殊私用变量就这点内容了。最后再提一下私用变量,尤其当我们写函数时涉及到多次调用时必须要用私用变量,譬如说(中级篇,资深玩家可跳过)
  1. _function = {
  2.     _var = _var + 1;
  3. };
  4. _var = 10;
  5. call _function;
  6. hint str _var; //_var is 11

  7. _var = 100; //_var 随便在哪儿定义
  8. function = {
  9.     private "_var";
  10.     _var = _this select 0;
  11.     _var = _var + 1;
  12.     _var
  13. };
  14. hint str ([10] call function); //结果_var是 11 不是 101
复制代码
请切换至64楼武装突袭3 – 变量与namespace

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入VME

x
发表于 2013-10-4 17:34:53 | 显示全部楼层
谢谢分享........
发表于 2013-10-4 17:40:58 | 显示全部楼层
怒赞。。。。。。。。。
发表于 2013-10-4 18:10:03 | 显示全部楼层
感谢楼主,学习了上面的内容受益匪浅!盼更新
发表于 2013-10-4 18:12:22 来自手机 | 显示全部楼层
大量内容有呀,先回复再慢慢看。
发表于 2013-10-4 19:38:07 | 显示全部楼层
看看~~~~~~~~~~~~~~~
发表于 2013-10-5 00:28:24 | 显示全部楼层
好好好!!!!!!!!!!!11111
您需要登录后才可以回帖 登录 | 加入VME

本版积分规则

小黑屋|中国虚拟军事网

GMT+8, 2024-4-18 09:39

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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