新人求助,关于音效随机播放和音效随距离衰减的问题
gamemaker吧
全部回复
仅看楼主
level 1
我已经设置了一个敌人受击音效,当敌人被子弹命中时会播放。但是我想进一步,让敌人受击时从音效0到音效2随机播放,并且音效的声音会随着敌人的距离产生变化,敌人被命中时距离越远声音越小,但最低是原音效的10%,当敌人距离玩家小于50时音效为原音效的100%,并且不再随距离缩小而产生变化。
我应该用哪些函数来实现这两个效果呢?随机数如何跟音乐的id绑在一起呢?[疑问][疑问][疑问]
2023年09月03日 09点09分 1
level 9
我的思路是两个变量,一个用来做随机,random()赋值然后switch这个变量来放声音,另一个变量返回距离distance to(似乎是?f1里搜distance就有),判断这个变量大小区间,然后播放音效,声音大小直接填参数
2023年09月03日 10点09分 2
random跟irandom有什么区别吗?还有distance to object我知道,但是音量大小这个函数该用哪个呢?
2023年09月03日 23点09分
吧务
level 13
问题不唯一咱就分开回答了:
---关于声音的随机选择:
首先声音,不管原来是什么名字,都可以(把它的index)存到一个数组里,比如hurtsound[0]=Sound1;这样,(通常只需要在create事件里执行一次),随后播放声音时只要播放hurtsound[0]就能达到原来的效果。选用数组的理由是数组下标可以用变量来代替,比如i=floor(random(3));之后再播放hurtsound[i],就可以在3个音效之间随机播放一个,根据你的设计可以是只随机一次或者每次播放前都随机。至于random和irandom都是随机数的实现方式,选择使用哪个完全看个人习惯。咱是那种在别处没见过irandom所以优先选择random这一派的。
---关于距离衰减:
数值呈现负相关(即随着参数的增大结果减小)的函数非常多,再配合函数的参数调整就可以有无穷多种选择。比如经典的反比例函数,在50距离是100%音量时会在500距离衰减到10%,配合一些变形(就是把函数图像的中心不饭在原点)可以把10%的临界位置放到其他距离。这种情况下简单计算当然是根据距离直接计算音量,再把音量限制在题主所说的10%-100%范围内,比如一个稍微整合一点的计算式vol=min(1,max(0.1,50/dis)));就能解决大部分问题。但这个算法存在一个缺陷,即距离为0时会报错(0不能做除数)。所以可以介绍一个通用(又叫麻烦)的做法:
if(dis<=50){
vol=1;
}
if(dis>=500){
vol=0.1;
}
if((dis>50) && (dis<500)){
vol=50/dis;
}
其中500的数值,倒数第二行的计算方法,请根据自己实际需要(和体验结果)进行修改。
---关于怎样让音量结果生效
这部分咱没有实际测试过,只能给个大概的方向://另外提问或追问这部分时记得说明一下自己使用的GM版本
8.0里有一个函数sound_volume(index,value)可以更改音效的音量;
S2在声音播放(比如audio_play_sound)里有一项参数是gain似乎对应的就是音量,或者说S2看上去音量存在多级管理,gain对应本次播放的这一段音效的音量系数,如果咱没理解错F1的意思的话。
2023年09月04日 01点09分 3
帮助巨大,吧主实际gms达人[欢呼][欢呼][欢呼] 今天上午对着随机函数黑锅乱炖许久没有任何进展,今天晚上回去继续手搓代码。
2023年09月04日 07点09分
好消息是第一个问题完美解决了,坏消息是依然没有找到可以调节音量的gms2函数。全部的跟gain有关的sound函数我都试了试,结果只有audio_master_gain(gain)具有音量调节效果。而这个函数影响的是所有的音乐播放[泪][泪][泪]
2023年09月04日 13点09分
@q糖豆p 如果用audio_sound_pitch只会听到难以名状逐渐变化的古神音效[泪][泪][泪]
2023年09月04日 13点09分
level 9
gm8倒是有sound啥啥的函数,gms不太清楚,找到篇类似帖子,可以参考一下
2023年09月04日 23点09分 4
吧务
level 13
奇怪,咱明明给出了audio_play_sound这个函数,为什么题主还在试其他的……
这个函数自带gain参数,是可选参数,又不是必须用默认值。目前的测试结果是:
-可选参数gain可以调节这一次开始播放的音效的音量;
-同一个音效播放完成前直接开始另一段音效的播放,不会打断未完成的那一段,而是会叠加;(没搞明白priority参数所说的channel在起什么作用,看来这次测试并不完整)
既然不知道原因,咱就瞎猜吧。其中一个可能性就是题主没有查函数说明,用10到100去填写gain值,发现音量没变化,就猜测是没有选对函数去实验其他的了,但其实gain有效范围是从0(无声)到1(满音量)。另一个可能的原因大概就是用了奇怪的资料,只要是可选参数一律不解释。突然想起了某个双斜线的程序员笑话
2023年09月05日 01点09分 5
原来是这样啊,我看程序里面写audio_play_sound的时候在soundid前面没有内容了,所以不能填gain,随机播放音效的随机数我已经弄好了就差填gain了。
2023年09月05日 02点09分
吧主有官方的函数对照表吗?我还是没办法调节音量,我查了很久还是没找到audio_play_sound的gain在哪儿。
2023年09月06日 07点09分
@艾莫号上校 S2的特性,鼠标指向代码的内置函数名时,按下鼠标滚轮(中键),就会打开自带帮助并跳转到该函数的解释页,首次使用可能会问是使用在线版还是整体下载,咱是建议后者,以后用起来快。
2023年09月07日 02点09分
另外上面的截图应该可以看出gain在这个函数参数的3号(第4个)位置。
2023年09月07日 02点09分
1