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

 找回密码
 加入VME

QQ登录

只需一步,快速开始

搜索
楼主: FFUR2007SLX2_5

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

    [复制链接]
发表于 2013-10-18 20:58:24 | 显示全部楼层
发表于 2013-10-18 22:26:58 | 显示全部楼层
这个需要好好读下
发表于 2013-10-19 16:11:54 | 显示全部楼层
版大你好,看了你的文章以後,想要釐清幾件事!

我們常用的,像是[dowatch, getpos, BIS_fnc_codePerformance]等等這些都是叫做函數(英文function)。
而腳本就是大量調用這些函數來達成自己要的目的,這個叫做腳本。

是這樣嗎?

第二個問題:
你說私用變量離開自己的語塊就會沒有作用,這邊指的語塊是否就是不同的sqf檔或觸發器?
還有就是要用到私用變量的時候,雖然在前面加個底線_這樣引擎就會自動識別為私用變量,但是不是最好還是寫得工整點,在最開頭用private ["_my"];這樣來進行宣告比較好?

第三個問題:
我以前的習慣,當要用到一個新的局部變量的時候,我都會直接打出我要的名字(前面不用底線),但是否要像私用變量,使用類似像{private ["_my"];}這樣的語法來宣告要用的局部變量嗎?
還是直接打出我要的局部變量跟他等於甚麼就可以了?

最後個問題:
我常常會用到這種task1done的局部變量,用它來跟所有有關的觸發器做相關動作。
後來我也會使用publicVariable "task1done";來確保所有客戶端都同步。

後來有次我碰到一個問題,我設定了一個關閉發電廠發電的按鈕,當其中一個玩家按下去,他自己有反應,但其他的玩家卻沒有見到該有的效果,我是否要再按鈕的那個腳本中,多寫一個局部變量,並使用publicVariable來推送局部變量到所有客戶端,確保不管任何一個玩家去按按鈕,都可以讓所有人都有達到該有的效果?

发表于 2013-10-19 17:04:29 | 显示全部楼层
求指导~······想做一个DOTA地图玩玩
发表于 2013-10-19 17:48:27 | 显示全部楼层
111111111111111111111111111111111
 楼主| 发表于 2013-10-19 18:49:26 | 显示全部楼层
a8325811 发表于 2013-10-19 16:11
版大你好,看了你的文章以後,想要釐清幾件事!

我們常用的,像是[dowatch, getpos, BIS_fnc_codePerform ...

Hi a8325811

而腳本就是大量調用這些函數來達成自己要的目的,這個叫做腳本。


是的,脚本和函数是不一样的,脚本功能比函数大得多。

我们写脚本有两种写法,一种是不是用函数的,还有种是使用函数的。

不使用函数写脚本会慢,错误率高;使用函数写脚本很快,错误率低。

有些时候可能会有人觉得没必要区分函数或脚本,全部叫脚本就得了。不过脚本重执行,重实实在在,看得见摸得着的。而函数重求值,重计算。

你說私用變量離開自己的語塊就會沒有作用,這邊指的語塊是否就是不同的sqf檔或觸發器?


是的,不仅仅在不同的sqf中,即使是在同一个sqf中,同一个私用变量在不同的scope(句块空间)中也是无法相互识别的,必须进行传递。触发器不一样,触发器本身无法直接识别私用变量,只能识别local var局部变量。

還有就是要用到私用變量的時候,雖然在前面加個底線_這樣引擎就會自動識別為私用變量,但是不是最好還是寫得工整點,在最開頭用private ["_my"];這樣來進行宣告比較好?


是的,私用变量我们全部要private私用声明。

我以前的習慣,當要用到一個新的局部變量的時候,我都會直接打出我要的名字(前面不用底線),但是否要像私用變量,使用類似像{private ["_my"];}這樣的語法來宣告要用的局部變量嗎?
還是直接打出我要的局部變量跟他等於甚麼就可以了?


local var局部变量直接就能用,它在其所在的服务器(你的电脑)的任务任何地方均可直接传递或识别。

我常常會用到這種task1done的局部變量,用它來跟所有有關的觸發器做相關動作。
後來我也會使用publicVariable "task1done";來確保所有客戶端都同步。

後來有次我碰到一個問題,我設定了一個關閉發電廠發電的按鈕,當其中一個玩家按下去,他自己有反應,但其他的玩家卻沒有見到該有的效果,我是否要再按鈕的那個腳本中,多寫一個局部變量,並使用publicVariable來推送局部變量到所有客戶端,確保不管任何一個玩家去按按鈕,都可以讓所有人都有達到該有的效果?


是的,PublicVariable后所有客户端的task1done都会被激活,不然的话其他人的战况就无法互相同步。

点评

感謝您~!  发表于 2013-10-19 22:00
发表于 2013-10-19 21:10:40 | 显示全部楼层
看看是什么
发表于 2013-10-20 02:17:10 | 显示全部楼层
感謝提供相關學習:))
发表于 2013-10-20 14:12:36 | 显示全部楼层
多谢LZ,学习了
 楼主| 发表于 2013-10-20 14:43:24 | 显示全部楼层
本帖最后由 FFUR2007SLX2_5 于 2013-10-23 23:19 编辑

157楼,武装突袭3——FSM全教程(五)



继续上一篇在了解了state的秘密后我们来看一下initCode右边的那个preCondition,貌似BI很少用这个语块,那它究竟是干什么的呢?



之前我们说过InitCode中的所有代码只执行一次,那么PreCondition内的代码则会不停的循环运行,其实PreCondition就是OnEachFrame循环,那么怎么样才能让这个循环停止呢?只要我们的电路自动侦测到接下去的condition有满足条件的,电流就自然离开了这个state进入到下面的state中去,那么这个state中的循环自然也就停止了。(换言之,如果下面的条件依旧有未满足的,那么preCondition就会不断地循环执行)

所以既然PreCondition可以当作循环来用我们就可以相应的减少一些常规的步骤:



或许常规情况下我们会这样在FSM中写一个循环不断的更新_var值知道condition满足条件推出循环进入continue状态,有了PreCondition我们可以直接省略!condition的循环,_var值可以直接在state中自更新。当然我们可以在PreCondition中写句法,写句法时注意参照OnEachFrame语块的语法,达到自更新变量值。至于BI在mission flow的FSM中为何从来不用PreCondition这个语块?很明显,作为任务框架没有必要如此平凡的去更新一个值,这种情况只会在调用函数或脚本中发生,这再一次证明了FSM的主要任务是写框架。

接下来我们再来看看condition,condition是菱形的,绿色为true condition,在里面我们不需要检查额外的代码;黄色condition中有condition, action和precondition三项块。我们先从condition来看,这是最常用的。

条件其实就是我们sqf语句中的waitUntil,词句块最后部分只检查布尔值,如果你想让这个condition永远等待那么可以使条件内的代码永远返还false。Condition句法使用和sqf一样,但有一点必须注意,sqf的waitUntil是允许延迟的循环,而FSM中的这个condition是不允许延时的OnEachFrame式waitUntil。所以我们可以在condition赋值,但必须记住在判断多重条件时不可能再使用普通的if (a) then {if (b) then {}};这里有必要使用我们的第一讲——惰性求值进行优化。所以当我们在做判断时不必再画蛇添足:



这样反而会有问题,因为这样做仅仅是赋值,由于condition的句末无法探测到布尔值所以就无法将电路继续下去,所以在这里我们要想判断a就直接写a就可以了。至于b的赋值可以放到下一个状态去执行。至于如果我们将赋值放在condition中,那其实和上一级状态中的precondition是一样的道理,是个循环。

走到这一步或许我们会遇到一个问题,既然state中的precondition的循环是单个的,只要检测到连接其的任意一个条件为true那么这个precondition就会自动停止,这没问题。那么倘若上一级state链接有多个条件而当这些所有条件全部不能满足,同时我们又给每个条件写上了如上的自更新赋值,那引擎会不会执行所有这些自更新循环造成不必要的资源浪费?



答案是肯定的,只要这么做并且让引擎也挨到检查这些条件时,最后的结果是f_a和f_b的两个自更新赋值会同时开始循环,即使是我们有第三个f_c为true condition可以带走电流继续往下走这两个f_b和f_a也将一直不停的循环下去成为死循环。



这就是典型死循环的例子,如果f_a和f_b没有可能或鲜有可能为true,那么我们就要避免在condition中自更新赋值。像上面这个continue状态后再次回到初始状态,FSM再次从优先项为2的f_b依次向后检查,再次造成2次死循环,如此叠加的死循环最后的结果就是机器无报错崩溃,这也就是在高级脚本中FSM所要避免的地方。(除非我们把优先项的次序改变让引擎避免检查到f_b和f_a的判断,但这样做还不如直接删了这两个条件)

请切换至171楼继续教程,武装突袭3——FSM全教程(六)

本帖子中包含更多资源

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

x
发表于 2013-10-20 21:50:50 | 显示全部楼层

楼主辛苦,标识万分感谢!
发表于 2013-10-20 23:45:43 | 显示全部楼层
我很想学习脚本编写
发表于 2013-10-21 16:04:25 | 显示全部楼层
想請問一下! 如果我想要搞一個觸發器,設定是藍方出現在裡面,就會觸發觸發器,但是我要再多設定一個條件,我要排除某一個藍方單位在這個條件(例如UAV)。

所以假如我想設定讓所有藍方玩家走進去就可以觸發的觸發器,但是要排除某個叫做haha(名字隨意)的單位,他雖然是藍方單位,但是不能觸發這個觸發器,這要怎麼設定?
发表于 2013-10-21 17:19:21 | 显示全部楼层
纳尼 真的吗 ?
发表于 2013-10-21 23:51:27 | 显示全部楼层
需要啊
您需要登录后才可以回帖 登录 | 加入VME

本版积分规则

小黑屋|中国虚拟军事网

GMT+8, 2024-5-3 19:57

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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