|

楼主 |
发表于 2012-3-20 17:27:56
|
显示全部楼层
技巧5、利用强大的障眼法
如果打开圣安地列斯的脚本文件main.scm看看,会发现游戏里很多视觉效果都是用的“障眼法”,在游戏虚拟的世界,眼见不一定为实。原版游戏在三星级的时候飞机上会有特警爬绳子下来,但那些特警真的是从飞机里跑出来的吗?只不过是在飞机旁边创建个绳子然后创建特警爬绳子下来而已。实际上飞机里连个驾驶员都没有。
如果想成为制作CLEO的高手而不只是简单的修改,最重要的就是用“障眼法”来欺骗玩家的眼睛,什么叫障眼法,举个例子来说明一下。
这个游戏玩通关都好久了我才听说CLEO,第一次接触到CLEO的时候,是下载了个“潜艇”,当时还不知道这就叫CLEO,后来接触的CLEO越来越多,慢慢地也能看懂代码了,才发现潜艇其实是“骗人”的,它真的是往游戏里增加了一个交通工具吗?我一直特别崇拜这个CLEO的制作者。
下面就来揭密潜艇CLEO的原理:
按Ctrl+S刷出一艘Marquis船
创建一个物品“潜艇壳子”(哪个代号对应哪个物品,可以用地图编辑器来看,也可以用超级刷物CLEO刷出来看看)
把潜艇壳子套在Marquis船上,把Marquis隐藏掉
如果按攻击键就创建一个比萨店的小木牌子,创建烟雾并把烟雾粘在木牌上,把小木牌往鼠标所指的方向以某一速度扔出去(这就是所谓的“战术巡航导弹”)
如果木牌落地就在落地处创建一个半径为多少米的爆炸
创建鹞式战斗机粘在潜艇壳子上,战斗机隐藏,如果按次级武器键就用战斗机来攻击(这就是所谓的“鱼雷”)
如果按爬升键,就把潜艇壳子在船上的位置往下移,视线跟着铁壳子走(视线跟随铁壳子跑水里了但船仍然在水面上)
如果按俯冲键,就把潜艇壳子在船上的位置往上移,视线跟着铁壳子走
如果铁壳子相对于船的位置靠下,那么按攻击键无效(这就是为什么在水下只有一种武器了)
把submarine.cs从头看到尾,潜艇就是这么一回事,你所开的船并没有潜下去,只是铁壳子潜下去了,关于这一点可以这样来验证:开着潜艇往货船下面钻,看能钻得过去不?肯定钻不过去,因为真正开的船是Maiquis,它还在水面上挡着呢。
这就可以理解为什么保存游戏之后潜艇开不走了吧?重新读档之后Marquis已经消失而创建的物品仍在原地,它本来就不是个交通工具,只是借用船来开动而已,船都没了还怎么开?
上面的内容并不是为了讽刺潜艇是假的,这正是崇拜的地方,强大的“障眼法”!
那怎么用“障眼法”呢?这个要靠想像力了,随心所欲、为所欲为,你能想成什么样,就能做成什么样来,没有标准框架,也无法做具体说明。
光棱塔CLEO的制作过程:
我有一段时间想做个光棱塔CLEO,但怎么实现呢?红色警戒里的光棱塔是一个柱子顶上发出一道激光把人打死,而在侠盗车手的CLEO语句里并没有“用光线照死人”这样的命令,那可以换一种思路,我弄的光棱塔CLEO就是利用了障眼法。
光棱塔CLEO的lasertower.cs全文及翻译如下:
thread 'LASERTOWER' 名称“LASERTOWER”
:LASERTOWER_19 循环段落19
wait 0 等待0毫秒
if and 如果——→if and是说下面的条件要同时满足
Player.Defined($PLAYER_CHAR) CJ被定义了——→就是游戏开始了
0AB0: key_pressed 32 按空格
0AB0: key_pressed 76 按L键
else_jump @LASERTOWER_19 如果不满足上述条件就跳转到开头
04C4: store_coords_to 1@ 2@ 0@ from_actor $PLAYER_ACTOR with_offset 0.0 30.0 0.0 把从CJ偏移0.0,30.0,0.0的地方的坐标储存为1@ 2@ 0@
02CE: 3@ = ground_z_at 1@ 2@ 0@ 定义3@为(1@,2@,0@)这个点的地面投影点的海拔高度——→这个很重要,不然CJ如果飞在天上刷光棱塔就刷到前面的空中去了,有了这一句,无论地形如何,都是放在前方的地面上
4@ = Object.Create(16778, 1@, 2@, 3@) 在1@, 2@, 3@这一点上创建物品16778,并定义为4@ ——→ 16778是飞碟柱子,这个东西我也是找了好久才找到它的编号
08E9: set_object 4@ liftable 1 设置物品4@可搬——→ 这就是让光棱塔可以搬得走
08D2: object 4@ scale_model 2.0 把物品4@扩大到原来的2倍——→搬起来之后就现原形了,变小了
jump @LASERTOWER_131 跳转到循环段落131
:LASERTOWER_131 循环段落131
0400: store_coords_to 5@ 6@ 7@ from_object 4@ with_offset 0.0 0.0 12.0 把从物品4@偏移0.0 0.0 12.0 的位置坐标值储存为5@ 6@ 7@——→这个就是飞碟柱子的顶端
08E5: get_actor_in_sphere 5@ 6@ 7@ radius 100.0 handle_as 8@ 在以5@ 6@ 7@这个点为球心的半径为100米的球体内随机抽取个人定义为8@
if 如果
056D: actor 8@ defined 8@被定义了——→也就是在光棱塔附近有人,这个条件很重要,如果没人就不会有8@,而下面要对人物8@执行一些指令,那肯定就要死机了
else_jump @LASERTOWER_202 不然就跳转到循环段落202——→202这一段是说在附近没人的情况下怎么办
jump @LASERTOWER_343 跳转到循环段落343——→343这一段是说附近有人时怎么办
:LASERTOWER_202 循环段落202
0400: store_coords_to 5@ 6@ 7@ from_object 4@ with_offset 0.0 0.0 12.0 把从物品4@偏移0.0 0.0 12.0 的位置坐标值储存为5@ 6@ 7@——→这个就是飞碟柱子的顶端
0208: 13@ = random_float_in_ranges -20.0 20.0 从-20到20这个区间随机找个数定义为13@
0208: 14@ = random_float_in_ranges -20.0 20.0 从-20到20这个区间随机找个数定义为14@
0400: store_coords_to 15@ 16@ 17@ from_object 4@ with_offset 13@ 14@ 0.0 把从飞碟柱子偏移13@ 14@ 0.0 的位置坐标值储存为15@ 16@ 17@——→这就是在飞碟柱子旁边20米范围内随机取点
02CE: 18@ = ground_z_at 15@ 16@ 17@ 把15@ 16@ 17@这一点的地面投影点的海拔高度储存为18@
06B1: 13@ = create_searchlight_at 5@ 6@ 7@ radius 0.3 target 15@ 16@ 18@ radius 0.5 在5@ 6@ 7@这一点创建一条半径为0.5米的光线指向15@ 16@ 18@这个点,光线定义为13@
wait 200 等待200毫秒
06B2: destroy_searchlight 13@ 光线13@消失——→如果没有这句,光线会一直在那里,不会灭
:LASERTOWER_343 循环段落343
else_jump @LASERTOWER_131 这一句是多余的,可能做的时候没注意吧,不过貌似也没什么影响,因为在它前面并没有给出条件来
04C4: store_coords_to 9@ 10@ 11@ from_actor 8@ with_offset 0.0 0.0 0.0 把人物8@所在的点的坐标值储存为9@ 10@ 11@
06B1: 12@ = create_searchlight_at 5@ 6@ 7@ radius 0.3 target 9@ 10@ 11@ radius 0.5 从5@ 6@ 7@这个点发一道半径为0.5米的激光照射9@ 10@ 11@这一点,光线定义为12@
0565: create_soundless_explosion_at 9@ 10@ 11@ type 8 在9@ 10@ 11@这一点上创建一个无声的隐形爆炸——→这才是NPC真正的死因,根本不是被光线照死的
0321: kill_actor 8@ 杀死8@这个人物——→这一句是保证了他的死亡,为了防止某些NPC血很厚一下炸不死
Actor.RemoveReferences(8@) 把人物8@的模型拿掉——→就是让尸体消失
wait 200 等待200毫秒
06B2: destroy_searchlight 12@ 让光线12@灭掉
wait 1000 等待1000毫秒
jump @LASERTOWER_131 跳转到循环段落131——→寻找下一个倒霉的NPC,嘎嘎!
可以看出,这是个无限循环,里面包含了两个子循环:如果有人就发激光创建爆炸并杀死他;如果没人就往周围地面随机发激光照射。
在有if的时候必须做到面面俱到,告诉电脑在每一种情况下要怎么做,要不然它就茫然不知所措(死机)。
我弄那个“崩屁神功”CLEO,也是利用了障眼法,breakwind.cs里面的全过程如下:
按Ctrl+K
CJ做一个撅屁股的动作
在CJ周围创建绿色的烟雾
在烟雾处创建无声的隐形爆炸(就是冲击波,能把人崩走)
从CJ附近抽取一个人
杀死这个人
跳转到开头
在这里面NPC也不是被屁熏死的,无论哪个语句都没有这个功能。但是“障眼法”的使用却达到了这么一种效果:NPC一走进绿色烟雾区就死掉,看起来感觉那人就是被熏死的,这就足够了,玩家追求的就是这个效果,只要玩起来很嗨就行了。如果深入追究起来的话整个游戏都是假的了。
类似的还有很多,所以制作CLEO的时候思想不能老拘泥于某一个条条框框,要有发散性思维,想想要做的CLEO是什么样,可以搞个分解动作,然后每一步用什么语句来实现就想想哪个CLEO里有这样的句子,去那里面复制进来就行了。如果实现不了的就看能不能换个方式去实现,只要让它看上去是那么回事,就可以算是成功了。
|
|