本帖最后由 天メ逆 于 2020-7-20 09:21 编辑
第一集 如何用代码添加音效 前言: 各位喜欢骑砍的小伙伴们好!我是风云三国司马奉先音效版(个人修改)的修改者,之前我私自修改了司马奉先3.5版,加入了几十个武将技能和150多个武将音效以及一些平衡优化。后来司马奉先制作组发布通告说禁止一切修改,我十分尊重司马奉先制作组的决定,已将网上我上传的修改版删除,并承诺不再上传网络。 承蒙很多小伙伴的厚爱,虽然我已将音效版删除,但很多小伙伴还是私聊找我要音效版。看着他们对我修改版的喜爱,又不能不遵守司马奉献制作组的规定,着实让我有些难受。 再加上,网络上很少有大佬教萌新如何写代码,所以,我决定将我这几个月写代码的经验分享出来,也算是我玩了这些年骑砍对萌新们做出的一点小帮助。 我所写的都是自己这2个月从网上搜索代码,然后分析理解代码,仿写代码,最后写出自己想要的代码,这一路摸索的经验,没有任何人教过我,全凭我个人领悟,所以可能会有错误的地方,大佬见笑了。 我所写的代码知识,是我在魔球中写代码总结的经验,主要用于修改,如果您想要完全制作一个新MOD,此篇教学可能并不适合您。但也并不能说完全无用,因为代码知识是一样的,只是我没有源码,只能写在魔球中。 ——作者:天逆(千手柱间)
一.一些必须懂的最基本知识
【MOD是什么】 骑马与砍杀包括了游戏本体和MOD2个重要部分。游戏本体可以理解成放映机,MOD可以理解为光碟,你想看什么光碟,就要把光碟放进这个放映机里。 潘德是1个MOD,风三是1个MOD,乱舞水浒也是1个MOD。只有把MOD放在骑砍游戏本体的modules文件夹中,点击骑砍启动器(俗称马头),选择你想玩的MOD,才能进入这个MOD。 【TXT修改】 刚接触修改的小伙伴可能在网上搜过一些txt修改,比如txt修改领主逃跑率。这种修改方法要面对茫茫多的数字,而且及其容易出错,甚至在有些MOD中按照网上的txt修改方法根本无效!这是因为网上的修改方法都是基于战团native的版本,有些Mod修改了太多东西,所以自然就无效了!当然,有些魔球无法办到的,必须用txt修改,后面会讲到。 【魔球修改】 很多小伙伴可能已经使用过“魔球”这个软件了,通过魔球我们可以轻松实现很多修改。但是很多小伙伴使用魔球也就是改一下属性,改一下武器攻击力,游戏里体验一下无敌的快感,然后觉得索然无味就卸载了游戏。 这是我不推荐的。我希望的是,大家学会修改之后,去修改MOD中你觉得制作组设计不平衡或不合理的地方,增加游戏的趣味性!关于如何用魔球修改属性我就不讲了,本篇主要讲代码。 【代码修改】 魔球虽然能修改很多东西,但还远远达不到随心所欲修改的效果。比如我想要创建一个新的真正的NPC,有独立的对话,可以招进队伍,具有原版NPC的所有功能,这用魔球无法实现,必须在py文件中加入新NPC的代码才可以。 py文件里记录了MOD所有的源代码,只有MOD制作组才有,除非他肯分享出来。也就是说,没有MOD源码,我们能做的修改,是很有限的。 但大家也完全不用灰心,我们学会了写代码,利用魔球,依然可以实现很多功能。下面是我用魔球+代码做的一些技能,可以发现魔球+代码还是基本能满足大家的修改想法。甚至我还加了技能提示。 魔球虽然有很大的局限性,但同时也有个很大的优点,那就是不用花费大量时间去学习如何制作全新的MOD,我们就能用魔球+代码,快速实现修改。非常适合我这种不想制作MOD,又想玩属于自己的MOD的修改党!
网上对“代码”有一种叫法是“py语言”,相信有些小伙伴听说过,一般都是从大佬嘴中说出,一副高大上的样子。但我认为在骑砍中这种说法不够准确。我所理解的是,骑砍开发者利用“py语言”制作了一套属于骑砍自己的语言,也就是“骑马与砍杀MS语言”。我看见中文站有些想要学骑砍代码的人,去买了一本py语言的教科书学习,实在是没有必要。即使你完全学会了py语言,还是要专门学习骑砍自己的MS语言,才能写出骑砍的代码! 能看到这里,说明您是一个有耐心、真心想学写代码的人,我上面写这么多字,同时也是为了劝退没有耐心的人。写代码说难不难,说简单也不简单,需要耐心和一些悟性,下面从最简单的代码开始讲起!!!由于是代码讲解第一集,所以我会讲的非常非常详细,后面第二集、第三集就不会这么详细了。(注意:任何修改前,请先备份!!备份!!备份!!)
二.用代码添加音效
这里所说的添加音效,指的是武将在战斗时满足一定条件的情况下,会播放音效。以我修改的音效版为例,司马懿发动技能·伏兵时会说“直奔诸葛亮四轮车”,马超战斗时会说“冲过去,斩了曹贼”,邢道荣战斗时会说“说出吾名吓汝一跳”、“我乃零陵上将军邢道荣”等等。。。。要实现这个效果,需要如下步骤:
1. 制作音效 可以是录屏、录音或是网上下载,总之弄到你想要的音效文件,最好把原始音量放大为2倍,不然游戏中声音太小。然后用“格式工厂”把音效文件格式转换为ogg或者wav格式,因为骑砍只支持这2种格式的音效文件。 2. 导入音效 将制作好的音效文件,放到MOD中的
里,然后打开魔球,点击
,随便创建一个新的声音资源,然后把资源名改为你导入的音效文件名。比如,我的音效文件名是
,我就需要把声音资源名改为
。.wav是格式,也需要加上去!如果你是ogg格式,就是simayi.ogg!!点击
!!! 然后,点击魔球里面的
,随便创建一个声音,选择你刚刚导入的声音资源
,同时修改声音名字,最好改成你认识的,比如
,snd_是前缀,不能删除! 套用!!保存!!这就完成了所有的准备工作,接着开始写代码! 3. 添加代码 因为魔球无法在战场触发器中添加代码,所以我们只能在物品触发器中添加音效。 点击魔球中
,找到你想添加音效的武器。比如我想给司马懿添加音效,就找到司马懿的武器,点击右侧
,然后右键点击
,选择“新增触发器”,会看到这个界面
接着点击触发条件的下拉菜单,会看到
选择“武器攻击”,意思是,当这个武器攻击时,这个触发器就会工作1次。 然后看到下面有3个选项
,点击PY代码,我们的代码需要在PY代码中写!!伪代码虽然是汉字更容易懂,但是伪代码包含的MS语句太少,只能实现一些最基础的功能,熟练之后,可以伪代码、PY代码之间切换使用,一般我是写完PY代码保存之后,切换到伪代码中查看我写的代码有没有大的结构问题,伪代码是汉字更多是方便检查我们写的代码!
我以司马懿的黑羽扇为例,在下面的方框里,输入下面的代码:
(store_trigger_param_1,":var_1"), (agent_get_troop_id,":var_30",":var_1"), (store_random_in_range,":var_100",1,101), (try_begin), (eq,":var_30","trp_knight_1_16"), (neg|gt,":var_100",20), (play_sound,"snd_simayi"), (try_end),
代码讲解:(写代码必须输入法是英文状态,不能用中文的标点符号,写完之后一定要套用!!保存!!)
(store_trigger_param_1,":var_1"), store是储存的意思 trigger_param_1是触发器参数1的意思 ":var_1"是局部变量1的意思 这句话的意思,就是将触发器参数1储存在局部变量1中。触发器参数1在刚刚选择的触发条件“武器攻击”中有规定,触发器参数1=攻击方角色,就是拿这个武器攻击的人。也就是说,现在局部变量1=攻击方角色。
(agent_get_troop_id,":var_30",":var_1"), agent我理解为角色的意思 get_troop_id=获取这个兵种的id 这句话的意思是,获取局部变量1所属的兵种id,并储存在":var_30",也就是局部变量30中。局部变量后面的数字,自己可以随便定义,我习惯把兵种定义为30。这个troop,就是魔球中的兵种。如果拿这个武器攻击的角色是司马懿,那么局部变量30就等于司马懿这个兵种。如果拿这个武器攻击的角色是诸葛亮,那么局部变量30就等于诸葛亮这个兵种。
(store_random_in_range,":var_100",1,101), random,随机数 in_range在某个范围 这句话的意思是,在1~100的范围内,随机选一个数,储存到":var_100",也就是局部变量100中。
(try_begin), 意思是,如果。。。 也是一小段代码的开头。
(eq,":var_30","trp_knight_1_16"), eq的意思是“等于”,是一种表示判断的逻辑符号。 这句话的意思是,检测局部变量30是否等于trp_knight_1_16。trp_knight_1_16在我玩的MOD中,就是司马懿所属的兵种id。也就是检测,局部变量30是不是司马懿。
(neg|gt,":var_100",20), gt的意思是“大于”,是一种表示判断的逻辑符号。 neg|的意思是“否定” 合起来,neg|gt就是“小于等于”的意思。这句代码的意思是,检测局部变量100是否“小于等于”20。
(play_sound,"snd_simayi"), play_sound,播放声音 "snd_simayi"就是刚刚导入的声音名。 这句话的意思是,播放snd_simayi这个声音。
(try_end), 意思是,结束。 也是一小段代码的结尾。(try_begin),和(try_end),组合起来就是一小段代码的开头和结尾,有开头就必须有结尾,否则代码结构就错误。如果在(try_begin),和(try_end)之间,还有其他的(try_begin),和(try_end),则表示这一小段代码里,还套了其他的小段代码。不理解的话,可以想象,(5×(1+3)),(try_begin),和(try_end)有些类似数学里的(),()里是可以套其他()的。
整个代码的意思是: 这个武器每攻击一次,都会检测使用这个武器攻击的角色是不是司马懿,如果是司马懿且从100个数中随机取一个数刚好处于1~20之间(也就是20%几率),那么就播放snd_simayi这个声音。加个20%几率,是为了控制播放音效的频率,不然一直攻击一直播放音效,太吵了。 如果检测到不是司马懿,或者检测到随机数不在1~20之间,就不会播放声音。总而言之,有逻辑判断符号的,必须判断为真,代码才会往下运行。如果判断为假,那么从这句判断为假的代码一直到这一小段代码的结束,这之间的代码都不会生效。
|