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

 找回密码
 加入VME

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 19258|回复: 78

[教程] 小白到大白 零编程基础讲解脚本编辑。。。。。

    [复制链接]
发表于 2013-4-12 09:51:42 | 显示全部楼层 |阅读模式
因为,arma3还支持sqs脚本。。而我也不太习惯sqf的脚本习惯,所以就一直用sqs。所幸很多sqs脚本能直接用到arma3里面。。。我看论坛的编程高手教程都是很专业化的语言来说的。。。我是编程零基础。。。随便写写。。。看看能不能容易理解点。从我自己的角度出发哈。。。。



首先,脚本调用,大家都知道两种方式   exec 或者 execVM

分别说 sqs 文件后缀的就用exec来调用

sqf脚本就用execVM来调用  调用时前面还要加一些自定义的东西来等于一下比如

suibian = [xx,xx] execVM "xxx.sqf"  suibian 就是 “随便” 的拼音啦 为了自己编辑任务时方便自己知道这个脚本是干嘛的。所以用些自己想好的缩写也是很方便好记的。。

然后来看看一个sqs的例子。。希望说得够通俗吧

#kai
_s1 = _this select 0;
_s2 = _this select 1;
@(_s1 distance _s2 <= 10)
~2
_s1 dofire _s2;
exit;

这个脚本什么意思?怎么调用?
先说调用在任意一个单位上,弹药箱啦游戏逻辑啦。甚至汽车等等的初始栏填上
[so1,so2] exec "脚本名.sqs" //注意!脚本名必须为英文自定义吧。so1就是一个名字为so1的士兵,随你定义哪一个士兵名字也可以随便改。只要你地图上摆放的士兵与脚本上填写的士兵名字一样就行了。so2也是同样道理
然后这个脚本的用处?我一句句给你们解释
#kai   //这个是标题栏,通常高手用两个单词来说明下以下程序干嘛的,我嘛就用拼音

_s1 = _this select 0;  //这个的意思是调用时,第一个位置填写的东西等于脚本里的_s1这个东东 [一号定义,二号定义] exec "脚本名.sqs"

_s2 = _this select 1; //这个道理同上。。不过就是定义第二个格代表什么。。。由于武装突袭的脚本规则所以序号是从0开始的。。。所以一号位应该叫零号位

@(_s1 distance _s2 <= 10) //这个是一个等待的脚本条件意思是  “直到_s1 这个小子,距离_s2这个混蛋 小于或者等于 10米的时候” 程序就继续往下运行

~2                      //这个意思等待两秒时间

_s1 dofire _s2;    //这个大家都很常见很常问的大名鼎鼎的 dofire 就是 s1向s2 开火

exit;                   //这里就是脚本结束的意思了。。。


全程不需要用触发器,发现没?这样的方式在任务编辑中少了很多蓝色的圆圈。。。而且更别说触发器很多时候突然就无效了
只要明白脚本开头 _s1 = _this select 0;   这个定义是什么就能很好理解脚本的意思了。这就是很多人熟练使用触发器,但是完全看不懂脚本的原因【至少我是这样】
一般很多高手开发的脚本,是不会用_s1这种渣渣方式来定义的。使用英文单词定义其实更好更整洁方便理解。所以看脚本时看到_this select 0;  类似这种语句不妨用
翻译机器看看他们 等于号前面的英文是什么意思。。。。
另外这个定义也是可以写很多个的比如
_s1 = _this select 0;
_自定义 = _this select 1;
_自定义 = _this select 2;
_自定义 = _this select 3;
_自定义 = _this select 4;   一般来说10个左右就基本足够了。。看需求。。有多少个士兵或者事情想定义的,就写多少个


调用的时候记得每个格子对应好定义的顺序,而且不能留空。。如果留空了没东西写的话,要回到脚本里删除掉定义比如_this select 3;  不想要了。。那么删除的时候就把后面
跟着的_this select 4; 改成_this select 3;  让顺序保持正确。

不知道容不容易懂?我尽力了。。。二楼帖点编辑学习笔记吧、、
  









评分

参与人数 1威望 +2 收起 理由
Alex.XP + 2 原创内容

查看全部评分

发表于 2013-4-13 10:28:02 | 显示全部楼层
一个神不帮助小白,小白也不会认为他是神
一个大白帮助小白,小白也会把他当作神
 楼主| 发表于 2013-4-12 09:53:25 | 显示全部楼层
组行为
{_x setBehaviour "stealth"} forEach units group a1

{_x    这里可以自定义       } forEach units group a1


count units group _s1 < 4          以一个组的人数作为条件

cameraOn = NAME;NAME switchCamera "GUNNER";  

"INTERNAL" (1st person)
"EXTERNAL" (3rd person)
"GUNNER" (optics / sights)
"GROUP" (commander view)
以上命令用于锁定到一个单位的身上录像跟随~而且不论跪下还是趴下都一致的,头也跟随摆动的

_gridPos = mapGridPosition getPos player 转换getpos坐标为 GPS坐标

_veh = createVehicle ["ah1w", position player, [], 0, "FLY"]  
这样可以刷出一出生就是飞行的单位


以多个条件为触发
@((Not alive _ap)||(player distance _ap <= random 50)||(getdammage _ap >= 0.000001)) 满足一个条件即可
@((Not alive _ap)AND(player distance _ap <= random 50)AND(getdammage _ap >= 0.000001)) 满足所有条件
?(()||()||()) 例子

@({_x == "SmokeShellRed"} count magazines player == 0)  检测玩家身上是否携带有烟雾弹无即触发
检测高度作为条件 //  ?(position XXX select 2 <= 60):goto "xxx"
检测速度条件 // ?(speed player) >= 10
检测单位不等于某些事情 ?(_mm != player)
如果单位不在载具里 @not (_ma in _fly1)
如果单位在载具里 @(_ma in _fly1)
?(_ap in (units group GroupName))判断单位在不在一个指定的小队里

player setUnitRecoilCoefficient 10 调整玩家后助力 1.62和AA3可用

this addEventHandler ["handleDamage", { (damage (_this select 0)) + ((_this select 2) * 0.03) }];
使命召唤一样的HP~后面那个0.03越小越难死,从0到1 该脚本代表中一枪扣多少血~一枪一0.1的话那么就是十枪,一枪0.01就是一百枪

player addAction ["call Medic", "mdd.sqs"];给玩家增加一个菜单,菜单里不能给脚本定义单位,所以菜单里的脚本是用来调用另外一个脚本的
mdd.sqs里面只要一句话:[md] exec "jiaoben.sqs"这样就能给予某个单位定义了

[_unit] joinSilent GrpNull;//单位脱离一个小队
({_x distance _ap <= 20} count (AllUnits - [_ap])) == 1 出去单位_ap 其他任何单位只要一个靠近都触发

{this reveal _x} forEach allUnits 该单位了解整个地图上的任何单位

Floor random 3.5 向下化整数
Ceil random 3.5 向上化整数

_sp = speed _h1 * 0.28 就可以吧速度单位化为向量中的数值单位
_h1 setvelocity[_sp*sin(getdir _h1),_sp*cos(getdir _h1),0]

{addswitchableunit _x} foreach units group this;整个小队都是可以控制的

删除死亡单位 { deleteVehicle _x } forEach allDead;重复执行就可以了~删除所有死的单位



镜头抖动
             抖动强度 抖动时间 抖动节奏
addCamShake [10, 10, 5]

沙尘暴 0.01为沙尘暴间隔 0.8为颜色,单位越小颜色越深 设置为true则为飞报纸 必须用触发器触发否则无效
[name,0.01,0.8,false] call BIS_fnc_sandstorm;
添加一个F7 function INIT那里填上下句,风沙的脚本才能执行
必须用触发器触发或者脚本触发不能直接天道INIT上

THIS attachTo [player,[-5,20,0]]约束四个游戏逻辑在玩家四周就可以模拟出很多沙尘在周围了
下面为例子 分别四个游戏逻辑 P1 P2 P1_1 P2_1
[p1,0.005,0.5,false] call BIS_fnc_sandstorm;[p2,0.005,0.5,false] call BIS_fnc_sandstorm;[p1_1,0.005,0.5,false] call BIS_fnc_sandstorm;[p2_1,0.005,0.5,false] call BIS_fnc_sandstorm;p1 attachTo [player,[5,10,0]];p1_1 attachTo [player,[-5,10,0]];p2 attachTo [player,[5,-10,0]];p2_1 attachTo [player,[5,-10,0]]  






触发器内所有单位或者特定阵型单位统一做一样事情
{_x stop true} foreach thislist 单位统一不动
{_x 任意自定义} foreach thislist

this EnableIRLasers true   单位作战时自动打开镭射灯
{_x EnableIRLasers true} forEach units group a1
unitName enableGunLights true 单位使用枪灯
{_x EnableIRLasers true} forEach units group this;{_x enableGunLights true} forEach units group this;

n1 reveal n2
{_x = _TA} foreach thislist

约束电脑的行为
setspeedmode "limited" 设置速度为慢
h1 dowatch sd  单位朝向方向 载具单位没效果
dofire不可用于锁定单位攻击的目标,但是 dotarget可以
this setunitpos "middle" 保持蹲姿
this setunitpos "up"  站姿
this setunitpos "kneelDown" 蹲下或者趴下
this setunitpos "auto"   自己选择

this forceSpeed 2;  移动速度

disableuserinput true  玩家失去操作效果

让电脑移动和直接传送电脑
n1 setpos getpos n2 、、 n1 move getpos n2、、n1 domove getpos n2

锁定一个单位离不开另一个单位身边,以000为中心最后一个数值是高度
THIS attachTo [XXX,[0,0,0]]
detach player 解锁以上命令




治疗~  第一个name是接受治疗的单位
name action ["heal",name2]

5 fadeMusic 0 音乐五秒内渐变为0   
5 fadeSound 0 所有游戏声音渐变为0   音乐播放不会被干扰
5 fadeRadio 0.1 无线电声音渐变为0


让一个叫NA的单位 移动到我希望移动到的地方  地图点击功能  触发一下后 点开地图来点一下地图就会发生
onMapSingleClick "na domove _pos; onMapSingleClick """";";         


房屋内放置随机位置一个组 似乎附近的房屋的房间有多少才能写随机数字否则随机进大海
{_x setpos(nearestBuilding this buildingpos random 5)} foreach units n1        

治疗~  第一个name是接受治疗的单位
name action ["heal",name2]

this addeventhandler ["fired",{(_this select 0) setunitpos "up"}];this addeventhandler ["hit", {(_this select 0) setunitpos "middle"}]
单位一开火就站,一中枪就蹲

this setvelocity[5*sin(getdir _h1),5*cos(getdir _h1),0]  某单位恒定速度前进 需要脚本配合

Name disableAI "Move" – 单位不动
Name disableAI "Target" – 单位不瞄准
Name disableAI "Autotarget" – 单位变瞎子
Name disableAI "Anim" – 电脑单位失去所有能力

this enableAI "Move"    恢复电脑移动能力


{_x disableAI "Move"} forEach units group s2
电脑一组人全部不会跑

{_x enableSimulation false} foreach thislist
让一个触发器内的东西定住,但是恢复触发器的东西走动就要用班组命令才可以
而且载具要一个一个用h1 enableSimulation true 分开搞才可以
{_x enableSimulation true} forEach units group s2 用于解锁定住的命令 为班组命令

在脚本中使用 ?(xxx = true)为条件时,必须在此之前设置一个 xxx = false

@(g1);  在脚本中意为:直到等待g1 = true 的时候才继续运行脚本,可以简化脚本不需要运行goto


名子 = 职为 载具名

名子可以写你喜欢的,之后编写任务也很方便。
职为可以填上crew(这是指全部机组员)、driver(驾驶)、gunner(炮手)、commander(指挥官)等等,可能还有些我忘了吧。
载具名则填上你为你那个载具取的名子。

我已以下是例子,我有一台叫做"heli01"的直升机,我想把他的驾驶命名叫作"Pilot01"

所以就这样打 Pilot01 = driver heli01;

这样之后就可以对这台直升机的驾驶另外给script了~!

hintSilent format ["玩家分数:%1 \n 玩家杀敌数:%2",rating Player,_zhi]
""以内的%1就是""号以外的后面的第一个 第二个 数值等等



player addAction ["***", "a1.sqf", [①], ②15, ③false, ④true, "⑤", "⑥(_target == player)"];
我把知道的说一下
*** 动作菜单显示名字
①输入参数可传递到 a1.sqf脚本声明的变量中
②菜单显示的上下优先排序
③④这两布尔值啥意思???
⑤按下菜单时同时执行输入的命令?
⑥菜单显示的条件(循环检测)

我就不排版咯。。当时锻炼下看程序的能力。。。高手们的脚本可比这乱得多
发表于 2013-4-12 10:02:31 | 显示全部楼层
楼主好有才干

点评

脸红 谢谢。。。。  发表于 2013-4-12 10:06
发表于 2013-4-12 10:49:16 | 显示全部楼层
来膜拜下

点评

不取笑就不错了。。。  发表于 2013-4-12 10:57
发表于 2013-4-12 11:13:34 | 显示全部楼层
学习了!

点评

懂不懂都不说一下?还是早就懂了?  发表于 2013-4-12 11:17
发表于 2013-4-12 11:28:45 | 显示全部楼层
JDLSNIPER 发表于 2013-4-12 11:13
学习了!

有三分之一懂,三分之二不懂!编辑的时候只要能用触发器实现的我就用触发器!不管用几个或者转几个弯!脚本很少用!就是不懂它了!看了楼主的帖子后,明白了些东西,特别是一楼的_this select x,二楼的就有很多东西不懂了!
发表于 2013-4-12 11:33:43 | 显示全部楼层
哈哈哈果然每个人的小册子都很混乱……

点评

更混乱的不好意思丢出来。。。。自己都查半天  发表于 2013-4-12 11:41
 楼主| 发表于 2013-4-12 11:38:55 | 显示全部楼层
JDLSNIPER 发表于 2013-4-12 11:28
有三分之一懂,三分之二不懂!编辑的时候只要能用触发器实现的我就用触发器!不管用几个或者转几 ...

懂那个就好说。。。二楼是命令。。需要的时候淘下宝就好
发表于 2013-4-12 12:48:30 | 显示全部楼层
下网上载 发表于 2013-4-12 11:38
懂那个就好说。。。二楼是命令。。需要的时候淘下宝就好

多谢楼主了!
发表于 2013-4-12 13:38:03 | 显示全部楼层
多谢楼主  学习下
发表于 2013-4-12 15:03:20 | 显示全部楼层
请教下让AI在直升机的某个位置怎么写
 楼主| 发表于 2013-4-12 15:13:15 | 显示全部楼层
cccbss 发表于 2013-4-12 15:03
请教下让AI在直升机的某个位置怎么写

指定cargo点是吧? 见过。。。等等我找找
 楼主| 发表于 2013-4-12 15:14:38 | 显示全部楼层
cccbss 发表于 2013-4-12 15:03
请教下让AI在直升机的某个位置怎么写

Syntax
Syntax:
unitName moveInCargo vehicle
Parameters:
unitName: Object
vehicle: Object
Return Value:
Nothing
Alternative Syntax
Syntax:
unitName moveInCargo [vehicle, CargoIndex]
Parameters:
unitName: Object
vehicle: Object
CargoIndex: Number
Return Value:
Nothing
Examples
Example 1:
_soldierOne moveInCargo _jeepOne
Example 2:
_soldierOne moveInCargo [_jeepOne, 1]

大概就是这样了。。。1号2号位有多少填多少

点评

牛逼!上网加我QQ吧,请教问题方便 10740248  发表于 2013-4-12 16:29
发表于 2013-4-12 15:41:57 | 显示全部楼层
大白甚是威武啊,小弟玩好游戏就行了。。。。。。突然感觉,坑略深
 楼主| 发表于 2013-4-12 15:48:14 | 显示全部楼层
st904413 发表于 2013-4-12 15:41
大白甚是威武啊,小弟玩好游戏就行了。。。。。。突然感觉,坑略深

当年我也觉得 arma的坑深不见底啊。。。。
您需要登录后才可以回帖 登录 | 加入VME

本版积分规则

中国虚拟军事网  

GMT+8, 2018-8-21 02:48

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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