Project1

标题: 横板格斗战斗脚本使用教学 Part.2(必杀技制作篇) [打印本页]

作者: 我爱龙    时间: 2009-2-2 22:05
标题: 横板格斗战斗脚本使用教学 Part.2(必杀技制作篇)
第一篇教程(人物创建篇)及范例下载:
http://rpg.blue/viewthread.php?tid=117219
第三篇教程(飞行道具、AI篇):
http://rpg.blue/viewthread.php?tid=117455

看过上面的教程,相信大家已经能做出一个人物的基本动作了。那么,今天就来教大家怎样制作必杀技。
还是以红丸为例,在上一篇教程中,我们已经制作了红丸的各种基本动作,包括普通攻击技能。那么,如果我要制作红丸的必杀技“雷刃拳”,就像下面这样:

该怎么做呢?

方法还是一样,用gif movie gear打开这幅gif,另存为一张张png,因为一共有22帧,所以编号是从BENIMARU_161到BENIMARU_182

将这些图片也都放到Battlers文件夹里。

再来就是进入游戏工程进行设置。先在游戏的数据库中的“特技”一栏里设置,比如将1号特技设置为“雷刃拳”,消费的SP、威力等相关属性都自己设好。

接下来就是重点。打开脚本编辑器,在FullCBS part-6 (Skill & Equip)中找到127行左右的case skill_id,然后将when 1的内容改成如下:
    when 1 # 雷刃拳
      @ai_shooting_range_x_max = 100
      @ai_shooting_range_y_max = 350
      @action_duration = 44
      @attack_motion_plan = [161,nil,162,nil,163,nil,164,nil,165,nil,166,nil,167,nil,168,nil,169,nil,170,nil,171,nil,172,nil,173,nil,174,nil,175,nil,176,nil,177,nil,178,nil,179,nil,180,nil,181,nil,182,nil]
      @selfanimation_plan[ 1] = 1      
      @attack_skl_id_plan[ 15] = 1
      @attack_rectan_plan[ 15] = Rect.new(-1,-156,96,66)
      @attack_skl_id_plan[ 33] =   0

下面我来逐个说明。
@ai_shooting_range_x_max 是指电脑AI自动判断的出招距离。=100也就是说当两人的横向距离小于等于100的时候,电脑就会自动出这招“雷刃拳”。同理,@ai_shooting_range_y_max 是指电脑自动判断的纵向距离。
@action_duration 是指这个招式的持续时间。本来有22张图片,我们让每张图片持续2帧的时间,否则动作会变得太快,反而不太正常。所以这招的持续时间就是44帧(单位姑且就叫做“帧”吧)
@attack_motion_plan 就是施放这个动作的编号,把161-182号写在后面,它就会按顺序播放。要注意每个编号中间要空一个nil,这就是每张图片持续2帧时间的意思。
@selfanimation_plan[ 1] = 1是指在第一帧的时候,播放1号动画。方括号里的1是指第一帧,后面的1是指1号动画。这个的作用是在出招时播放一些音效,比如人物的叫喊“喝啊哈”之类的。注意,不能在“特技”的使用方动画里设置,那是无效的。
@attack_skl_id_plan[ 15] = 1是指从第15帧开始,实施1号特技的效果。这是很重要的一条,就是说对方在第几帧的时候中招。如果不设置,你会看到当红丸刚把手举起来,还没打出去的时候,对方已经中招了。
@attack_rectan_plan[ 15] = Rect.new(-1,-156,96,66)这是指第15帧施放攻击时的判定范围,和人物的坐标大小的设置方法一模一样。在脚本的part-8里改一改,也可以看到画出来的攻击判定的矩形框,而这框是红色的。
@attack_skl_id_plan[ 33] =   0是指在第33帧的时候,必杀技的实施效果结束,或曰“收招”。这样,在第15帧到第33帧之间都是有效的攻击时间段。即使敌人在第15帧时没有中招,只要他在第33帧之前接触到你的攻击判定范围,也会中招。注意每个招式都要设置收招的时间。

这样一来,一个简单的必杀技“雷刃拳”就制作完成了。红丸这个人物的职业如果是战士,那就让战士职业学会“雷刃拳”这个特技,然后在战斗中装备起来使用看看吧!

如果学会了上面的制作方法,我们就可以向更多元化的效果发起挑战了。我们来看下面两个必杀技:


第一种必杀技,我们称之为“突进技”,第二种称为“对空技”。他们的特点是施放的时候,人物并不是站着不动的,而是前冲或是跳跃。那么这种技能该如何制作呢?

其实也很简单,比如第一种“突进技”。我们在制作的时候大体和制作“雷刃拳”相同,只不过在脚本中定义招式属性的时候,要多加一行内容。比如我在制作这个“冲刺拳”的时候,就是这样写的:
    when 49 # 冲刺拳
      @ai_shooting_range_x_max = 500
      @ai_shooting_range_y_max = 350
      @action_duration = 46
      @active_xspeed_plan[ 3] = 20
      @attack_motion_plan = [211,nil,212,nil,213,nil,214,nil,215,nil,216,nil,217,nil,218,nil,219,nil,220,nil,221,nil,222,nil,223,nil,224,nil,225,nil,226,nil,227,nil,228,nil,229,nil,230,nil,231,nil,232,nil,233,nil]
      @selfanimation_plan[ 1] = 38      
      @attack_skl_id_plan[ 13] = 49
      @attack_rectan_plan[ 13] = Rect.new(  0,-200,86,120)
      @attack_skl_id_plan[25] =   0

您发现了吧?多了一行@active_xspeed_plan[ 3] = 20。这句话的意思是在第3帧的时候,赋予人物+20的横向速度。那么,同样也可以将这速度设为负数,这样一来,人物出招时就是向后退。

您也许会问,那么制作人物跳跃的技能,是不是加一行@active_yspeed_plan就可以了呢?很可惜,原脚本中并没有定义过这个变量,如果我们要自己定义的话要修改很多地方,太麻烦。其实有这样一种方法,用这个语句@active_move_y_plan = [nil,nil,20,nil,20,nil,20,nil,10,nil]
这句话的意思是说,在第3帧、第5帧、第7帧和第9帧时分别让人物在y方向上上升20、20、20和10的距离。这样一来,在游戏中不就有了类似与跳跃的效果了吗?同样的,这里的数字也可以设为负数,不用担心,人物不会因为这样就钻到地下去了哦{/tp}设为负数可以用来制作在空中急速下降的效果。

脚本中定义了@active_move_y_plan 这个变量,也同样定义了@active_move_x_plan ,他也可以用来制作人物的横向移动。那么@active_move_x_plan 和@active_xspeed_plan有什么区别呢?前者是用来规定人物移动的方向和距离,而后者是用来规定人物的移动方向和速度。您如果有兴趣的话,可以尝试看看,原版脚本和我修改的脚本有什么不同。您会发现,原版脚本中,战斗时人物与敌人接触后可以径直穿过对方,而我修改后的版本,人物与敌人相遇就像撞墙一样,无法穿过对方。而事实上一般的格斗游戏,也是不允许人物之间相互穿透的。所以我说我修改的版本,更多的是模仿格斗游戏的风格。

而我修改的方法,就是降低人物移动的速度。原理是,当人物与敌人的横向距离小于一定值时,双方的速度就逐步降低,到双方相遇时,速度几乎为0,所以无法穿过对方。所以这样一来,用@active_xspeed_plan定义的人物移动,也是无法穿越对方的。而@active_move_x_plan 由于是直接规定了人物的位移,所以可以穿过对方的身体。在定义必杀技时,大家可以根据制作需要选择。

最后,是关于必杀技的施放效果。在格斗游戏中,有很多招式,中招的人会被弹飞几米远。那么,怎样在游戏中制作出这种效果,以体现出招式的威力呢?在脚本FullCBS part-2的430行左右,有一句blow    = skill.power,blow就是吹飞值,我把他直接映射为招式的威力。吹飞值有什么用呢?在这个脚本的477行左右,找到if blow >= 20,我把他定义为当招式的威力大于等于20时,中招角色就会被吹飞,而吹飞=true的话,中招的人就会倒地。

再来是490多行的self.now_x_speed = skill.eva_f * direction和self.now_y_speed = skill.variance 意思就是被吹飞的x速度就是招式的“回避 F”,而被吹飞的y速度就是招式的“分散度”。一般将回避或分散度设在12以上,就会看到中招角色被弹飞蛮远了。

如果理解了上述定义规则,您也可以自己更改吹飞值、吹飞条件和速度定义等。

对必杀技制作还有什么不懂的可以跟帖留言,下个教程准备讲述敌人AI的设置。

欢迎拍砖{/hx}
作者: swabwind    时间: 2009-2-2 22:26
Part.2来了。不错哇,很详细。现在没时间看,先存下文本了。{/qiang}
这个脚本虽然可以做的华丽,但是素材是个问题呀。。

继续期待LZ以下教程~
作者: 乱摸阿弥陀佛    时间: 2009-2-2 22:44
这个,发射气功,子弹什么的也一样吧?{/gg}
作者: 我爱龙    时间: 2009-2-2 22:46
以下引用乱摸阿弥陀佛于2009-2-2 14:44:46的发言:

这个,发射气功,子弹什么的也一样吧?

关于飞行道具我会在最后一篇来讲,因为有些东西自己还没有完全搞懂{/gg}
作者: 越前リョーマ    时间: 2009-2-3 04:01
做格斗游戏用脚本果然很麻烦啊…… - -{/gg}
作者: 我爱龙    时间: 2009-2-3 18:10
以下引用越前リョーマ于2009-2-2 20:01:37的发言:

做格斗游戏用脚本果然很麻烦啊…… - -

其实掌握规律之后,一点都不麻烦,用格斗引擎做也同样需要这些步骤
作者: 407811712    时间: 2009-3-6 13:39
我人物用了技能为什么对方不会掉血普通攻击也是这不会掉血也没有显示挨打动画
作者: 我爱龙    时间: 2009-3-7 01:43
以下引用407811712于2009-3-6 5:39:48的发言:

我人物用了技能为什么对方不会掉血普通攻击也是这不会掉血也没有显示挨打动画

有很多原因,首先需要靠攻击力和防御力来调整,其次要在脚本中定义攻击判定范围,如果范围太小的话就可能不会掉血了。可以去看看第一篇里的范例对照一下。
作者: kanoner    时间: 2009-3-9 19:57
lz!我非常喜欢你这个脚本!真的真的!很好用,制作起来也不是很麻烦

其他的我都弄好了,可是不知为什么我一按防御键s就跳出来脚本错误


我什么都没瞎改呀....怎么回事呀?
作者: kanoner    时间: 2009-3-9 20:27
还有,我攻击的时候动作是有了,但是敌人一点反应也没有....怎么办呀

话说这个脚本我研究2天了,真的是很好,要是我能用好就好了~
作者: xmhkkz    时间: 2009-3-9 21:06
{/se}这么好的教程。。收藏了
作者: 我爱龙    时间: 2009-3-9 23:12
以下引用kanoner于2009-3-9 11:57:38的发言:

lz!我非常喜欢你这个脚本!真的真的!很好用,制作起来也不是很麻烦

其他的我都弄好了,可是不知为什么我一按防御键s就跳出来脚本错误


我什么都没瞎改呀....怎么回事呀?

特技201-203是三个防御特技,所以数据库特技的最大值必须大于203才行
作者: 我爱龙    时间: 2009-3-9 23:13
以下引用kanoner于2009-3-9 12:27:04的发言:

还有,我攻击的时候动作是有了,但是敌人一点反应也没有....怎么办呀

话说这个脚本我研究2天了,真的是很好,要是我能用好就好了~

把攻击判定范围显示出来看看,或者是敌人没有挨打的图片,71-74是挨打动作,没有的话自然不会有反应
作者: kanoner    时间: 2009-3-10 11:49
呵呵~都解决了!!谢谢!!

还有一点小问题,就是se怎么设置

比如这句
GUARD_SE = "062-Swing01"

要把防御se声音命名成什么样子放在se的文件夹里呀?
作者: kanoner    时间: 2009-3-10 15:12
又有一点点小问题.....lz达人别嫌我烦....实在是太喜欢这个脚本了,所以一直在研究,可惜技术实在不过关....
是关于吹飞度的

我想让普通攻击的时候被攻击的人物只x轴移动不y移动
但是我如果改了 self.now_y_speed = skill.variance或者
  上吹っ飛びによる空中化
        if self.now_y_speed > 0 and self.motion.now_jumps == 0
          self.motion.now_jumps = 1
        end
这两个人意的一个,任务确实不飞高了,但是被攻击动作结束之后就会定在那里....怎么动都动不了的....

如果不改y轴的参数只改x的话人物的确不飞远了,可是就在原地飞起来又下来....

倒地的画面没问题,但是也不能每次都倒地呀...

求lz帮帮忙.....
作者: 我爱龙    时间: 2009-3-10 17:59
首先,可以随便选一个防御的音效。比如命名为“防御.wav”,然后把GUARD_SE = "062-Swing01"改成GUARD_SE = "防御"就可以了。
其次,想让吹飞的人只有X移动,而Y不移动的话。就在数据库-特技一栏里相应的特技“回避F”设为正值,“分散度”设为0-2都可以。不用改脚本。同样的,想要x不移动而y移动的话,“回避F”就设为0,“分散度”设为正数。
作者: kanoner    时间: 2009-3-11 11:58
谢谢lz!吹飞的问题解决了

声音的问题也差不多了,就差一点点....又要麻烦你了

@me.voice.play(XRXS_BS1::VOICE_ID_DAMAGE)

这句,应该是受伤时我方人物的声音,这个的对应文件应该放在什么地方?命名应该是什么呀?

虽然直接写Audio.se.play也行,但是敌人被攻击和我方被攻击出来的声音就全都一样了....

又想起来一点,一起问了吧~

就是@me.voice.play和@self.voice.play有什么区别呀?哪个是敌人的声音哪个是我方声音呢?

真的就差这一点了,系统就可以完成了!激动中~
作者: kanoner    时间: 2009-3-12 17:46
lz今天没上线~没关系,小弟一直等着你~
作者: 我爱龙    时间: 2009-3-13 23:07
@me.voice.play(XRXS_BS1::VOICE_ID_DAMAGE)这个受伤的声音放在Audio\SE里面,如果你的人物名字叫IORI,那么这个受伤的声音就命名为IORI_damage.wav,同样的,还有IORI_attack,IORI_dead,IORI_win等,分别对应不同状况时的声音。
@me.voice.play和@self.voice.play其实没什么区别,看me和self怎么定义的而已,如果之前定义为battler,就是敌我双方,如果定义为@handle_battler,就是自己。但是不能随便改,如果改了就得从最开始定义的地方也一起改。其实在这个脚本里,任何一个敌人都是从我方战斗人物改过来的,也就是说先做好一个我方的战斗人物,然后再把他添加到敌人的数据库里,所以声音什么的敌我双方用的都是同一个文件。
作者: ONEWateR    时间: 2009-3-16 00:00
发布完毕
http://rpg.blue/web/htm/news1245.htm
vip += 2
作者: kanoner    时间: 2009-3-16 18:11
今天才看到~
谢谢我爱龙大大,问题已经全部解决了,战斗系统已经完成~

话说有这样的战斗系统太帅了!

谢谢
作者: ctrl7878    时间: 2009-4-10 04:02
          这位兄台..
         能加我QQ嘛?446740101
        我有好多问题想请教你?{/cy}
作者: 赛露休斯    时间: 2009-4-10 04:23
不错,不过就是麻烦了点,我还是用ActionGameMaker吧
作者: 葬侍    时间: 2009-4-11 00:38
这脚本好卡呀 希望改良到128不卡就好了
作者: bfcode    时间: 2009-8-15 09:31
FullCBS part-6 (Skill & Equip)在哪啊,找不到




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1