让NPC出招,CLEO思路讲解开始
自备瓜子板凳。我这就开始了范例源码:
//-------------MAIN---------------
thread 'SHEN'
:SHEN_11
wait 0
Actor.StorePos($PLAYER_ACTOR, 4@, 5@, 6@)
0A3E: unknown_get_actor_in_sphere 4@ 5@ 6@ radius 3.0 3.0 3.0 handle_as 0@
if
056D: actor 0@ defined
else_jump @SHEN_11
if or
Actor.Animation(0@) == "FIGHTA_1"
Actor.Animation(0@) == "FIGHTA_2"
Actor.Animation(0@) == "FIGHTA_3"
else_jump @SHEN_11
jump @SHEN_137
:SHEN_137
0209: 10@ = random_int_in_ranges 1 2
jump @SHEN_153
:SHEN_153
if
10@ == 1
else_jump @SHEN_291
if
not Actor.Dead(0@)
else_jump @SHEN_11
04ED: load_animation "YOMI"
0812: AS_actor 0@ perform_animation "ETC1" IFP "YOMI" rate 10.0 loopA 0 lockX 1 lockY 1 lockF 0 time -1 // versionB
wait 150
05E2: AS_actor 0@ kill_actor $PLAYER_ACTOR
0812: AS_actor $PLAYER_ACTOR perform_animation "KO_SPIN_L" IFP "PED" rate 10.0 loopA 0 lockX 1 lockY 1 lockF 0 time -1 // versionB
04EF: release_animation "YOMI"
jump @SHEN_11
:SHEN_291
wait 200
jump @SHEN_11
完结
//-------------MAIN---------------
thread 'SHEN'
:SHEN_11
wait 0
Actor.StorePos($PLAYER_ACTOR, 4@, 5@, 6@) (设置主角当前坐标保存为 4 5 6)
0A3E: unknown_get_actor_in_sphere 4@ 5@ 6@ radius 3.0 3.0 3.0 handle_as 0@(在456 坐标周围3米内选取路人存为变量0@)
if
056D: actor 0@ defined (如果0@变量是存在的,也就是说角色已经找到并选好了)
else_jump @SHEN_11(不然就返回11,也就是如果没有选到的话)
if or (重点1)
Actor.Animation(0@) == "FIGHTA_1" (如果路人0@施展了以下几种姿势的任意一种,以下的flght_1 2 3等等是普通出拳的三个姿势)
Actor.Animation(0@) == "FIGHTA_2"
Actor.Animation(0@) == "FIGHTA_3"
else_jump @SHEN_11(没有施展的话就跳回开头)
jump @SHEN_137 (判断成功,跳到137)
:SHEN_137 (特级重点2)
0209: 10@ = random_int_in_ranges 1 2 (随机安排数字1-2,在这之间随机选择一个结果存储为变量10@,你可以把范围加的更多,比如0209: 10@ = random_int_in_ranges 1 20,就是随机安排数字1-20,这样做的用意是增加更多的变化)
jump @SHEN_153(跳到153)
:SHEN_153
if
10@ == 1 (如果随机数字结果出来是1)
else_jump @SHEN_291 (不然跳到291,也就是说不是1,是其他的,上文因为只有1-2,所以其他的肯定是2,而2我没有设置新变化,直接跳回从头,所以该CLEO只有10@ ==1 才有下文,2为终结)
if
not Actor.Dead(0@) (如果0@角色没有死亡,这里再判断一次角色是否死了,后文施展动作需要)
else_jump @SHEN_11
04ED: load_animation "YOMI" (一切就绪,条件全部达成,读取所需姿势文件,飞雷神的)
0812: AS_actor 0@ perform_animation "ETC1" IFP "YOMI" rate 10.0 loopA 0 lockX 1 lockY 1 lockF 0 time -1 // versionB
wait 150 (让0@角色施展攻击动作)
05E2: AS_actor 0@ kill_actor $PLAYER_ACTOR (让0@角色的意志为始终追杀主角,不然0@施展完CLEO设定动作后会放弃之前行为)
0812: AS_actor $PLAYER_ACTOR perform_animation "KO_SPIN_L" IFP "PED" rate 10.0 loopA 0 lockX 1 lockY 1 lockF 0 time -1 // versionB (让玩家施展被攻击动作)
04EF: release_animation "YOMI" (这个过程完结,为了内存稳定,拆除放进内存里的动作文件)
jump @SHEN_11 (跳回开头)
:SHEN_291(这是之前10@= 2发生的结果,由于随机范围只有1-2两种,我必须留一种为角色不使用技能,所以选择了2)
wait 200 (重点3) 为什么要设置等待200毫秒?因为不设置的话该CLEO会因为过程处理过快,而发生快速的重复使用和判定,那么由于太快,之前使用的随机判断的CLEO新风格写法就失去了意义,角色会不断使用技能攻击玩家,而不是偶尔,这个200建议设置的和角色在 重点1 处使用的动作时间为最佳)
jump @SHEN_11 完结
要不要插一下 不会怀孕{:soso_e146:} 0209: 10@ = random_int_in_ranges 1 2
其中这句话其实并没有实际意义,但是又有至关重要的意义。
虽然其没有关乎任何角色任何车辆,但是我们可以把其结果用来设定为多种可以发生的可能。
进而是CLEO实现真正的 随机 ,而不是开发者能够知道下一步该如何发展的傻瓜式CLEO 比如你可以设定为
0209: 10@ = random_int_in_ranges 1 5
然后在后文把其中 1 2 3 的可能结果设置为判断没有结果,等待多少毫秒返回
把4设置为 让角色使用飞踢。
把5设置为 让角色使用头撞。
总之要巧妙运用。 因为是随机处理并调用生成的10@这个结果。....
所以你只需要设定你想发生的在其中 数字代表的范围上的可能 即可。
至于10@到底会是什么,系统会随机帮你选一个结果 汗……kami說得只微微看懂了些.. 这是该CLEO的小测试档。
内容和上文一样。
添加好ifp后进入游戏,如果行人使用普通拳击三式的任意一式攻击你。
那么有百分之50的可能会触发行人使用飞雷神斩杀,不过我没有设定给主角减血,这是小技巧,会CLEO的加两个句子即可。
因为0209: 10@ = random_int_in_ranges 1 2
只有1-2,所以一半被我设置为触发技能,一半设置为触发失败,没有变化,并且等待200毫秒后跳回去重新判断是否触发。
点击进入下载-行人出招.rar
青青飘过 发表于 2012-3-23 22:24 static/image/common/back.gif
汗……kami說得只微微看懂了些..
慢慢看,不要急躁,我上了CLEO,你可以边玩边体悟 插楼无罪吧 = =
学习了。。感谢
哈。。感觉蛮简单的
在kami说发教程前,我以为跟读写内存有关= =||| (不懂)
:SHEN_291
wait 200
jump @SHEN_11这语段很经典,真心的说 范例源码:
//-------------MAIN---------------
thread 'SHEN'
:SHEN_11
wait 0
Actor.StorePos($PLAYER_ACTOR, 4@, 5@, 6@)
0A3E: unknown_get_actor_in_sphere 4@ 5@ 6@ radius 3.0 3.0 3.0 handle_as 0@
if
056D: actor 0@ defined
else_jump @SHEN_11
if or
Actor.Animation(0@) == "FIGHTA_1"
Actor.Animation(0@) == "FIGHTA_2"
Actor.Animation(0@) == "FIGHTA_3"
else_jump @SHEN_11
jump @SHEN_137
:SHEN_137
0209: 10@ = random_int_in_ranges 1 2
jump @SHEN_153
:SHEN_153
if
10@ == 1
else_jump @SHEN_291
if
not Actor.Dead(0@)
else_jump @SHEN_11
04ED: load_animation "YOMI"
0812: AS_actor 0@ perform_animation "ETC1" IFP "YOMI" rate 10.0 loopA 0 lockX 1 lockY 1 lockF 0 time -1 // versionB
wait 150
05E2: AS_actor 0@ kill_actor $PLAYER_ACTOR
0812: AS_actor $PLAYER_ACTOR perform_animation "KO_SPIN_L" IFP "PED" rate 10.0 loopA 0 lockX 1 lockY 1 lockF 0 time -1 // versionB
04EF: release_animation "YOMI"
jump @SHEN_11
:SHEN_291
if10@ == 2
else_jump @SHEN_11
角色0撞死玩家
玩家被撞死了
jump @SHEN_11
这样应该容易理解些了吧。
我把1-2的两个结果设置为了角色施展两种不同的技能。
不过这样做角色0就是始终在放1或者2这两个技能了,而没有普通进攻的时候了。
所以我在上面使用了2这个结果为等待,并没有任何变化的跳回去,就是这个意思
原来kami刚刚搞的就是这个啊! 这样的CLEO写法可以延伸出无数种风格。
比如选好角色后,然后判断角色外观是哪一个人。
之后设定几种可能性。
设定每种可能性角色在做啥
比如撒尿,吃饭,睡觉,拉屎
只要你设置的多,那么角色就越智能。
当然还是要预留很多个没有发生任何变化的可能,并且要设定等待时间。
这样就做好了一个路人的高智能CLEO了。
如此这般把所有路人的专属CLEO做完
就成了我的CLEO创意之一,众生百态CLEO。
只要你设置的可能范围有多广,后续变化有多完善,那么路人的真实度就更高。
0209: 10@ = random_int_in_ranges 1 65535
哈哈,只要你有耐心设定65535种可能性。
那么该路人肯定已经是真实的人了
我开此贴的目地,是希望大家明白随机CLEO的写法。
希望大家能够开发出更多高级类的CLEO,提升SA的NPC的AI程度。
增加更多挑战性极强的对手。 嘿嘿,表示这个教程收益匪浅,准备开始写让人物做动作的CLEO了:lol 搬板凳来学习啦= =