查看: 1962|回复: 5

[原创发布] 【空间音频】音量随主角与播放源的距离发生变化

[复制链接]
梦石
24
星屑
8942
在线时间
248 小时
注册时间
2020-12-4
回帖
259

极短24获奖极短23获奖极短22获奖

发表于 2023-6-7 17:45:25 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 纯属小虫 于 2023-6-7 17:46 编辑

最近玩了玩unity,找到了点儿启发,随手写了个跟音频相关的脚本
感觉做一些跟声音有关的场景还是很好用的
(想到了黑魂一塞恩古城前的铁匠,叮——叮——叮——)

[fold=空间音频]=begin
================================================================================
by 纯属小虫
学了unity之后,对其空间音效很感兴趣,于是试着写了一个2D的空间音效
当然,暂时没法实现立体音,只能实现随着距离变化的音量变化
用于播放音量会随主角位置变化的音效
================================================================================
●用法:
通常将脚本写入事件的【移动设置】里: 注意数据类型!
audio_空间(【音频名称】,【音频类型】 , 【距离变化区间】, 【音量变化区间】,【音调】)
如果想要bgm的音量持续改变的话,则要让该脚本也周期性执行!
================================================================================
●参数详情:

audio_空间(【音频名称】,【音频类型】 , 【距离变化区间】, 【音量变化区间】,【音调】)

【音频名称】
bgm 的名称的字符串 ————————不要后缀  不要后缀 不要后缀!!!

【音频类型】
"bgm","bgs","se","me"  默认为 "se"
如果音频类型为 bgm 或 bgs 时

【距离变化区间】
两个数的数组,左边为最小距离,右边为最大距离 默认值为[1,10]
当距离小于最小值时,音量将维持最大;
当距离大于最小值时,音量将维持最小;
当居中时根据距离改变音量

【音量变化区间】
两个数的数组,左边为最小音量,右边为最大音量,默认值为[0,100]

【音调】
定值,不会随距离变化
默认值为 100

=end

class Game_Event
  def audio_空间(name , type = "se", distance_section = [1,10], volume_section = [0,100] ,pitch = 100)
    # 纠错
    unless ["bgm","bgs","se","me"].include?(type)
      p "空间音效的 type 参数存在错误"
      return
    end
    # 获取该事件相对主角的距离
    distance = ((self.x - $game_player.x).abs ** 2 + (self.y - $game_player.y).abs ** 2) ** (1.0 / 2)
    # 音量大小计算
    if distance < distance_section[0]
      volume = volume_section[1]  #小于最小判定距离时,用最大音量
    elsif distance > distance_section[1]
      volume = volume_section[0]  #大于最大判定距离时,用最小音量
    else
      # 距离位于区间内时,进行计算映射音量
      precent = 1.0 - (distance - distance_section[0])/(distance_section[1] - distance_section[0])
      volume = (volume_section[1] - volume_section[0]) * precent + volume_section[0]
      volume = volume.to_i
    end
    # 不同类型的音效播放的情况
    audio = RPG::AudioFile.new(name , volume ,pitch)
    if type == "se"
      $game_system.se_play(audio)
    elsif type == "me"
      $game_system.me_play(audio)
    elsif type == "bgm"
      $game_system.bgm_play(audio)
    elsif type == "bgs"
      $game_system.bgs_play(audio)
    end
  end
end

[/fold]




但是如果音频码率较高,或者音频选择的是BGM的话,频繁地操作 Audio play ,会严重影响流畅性。
(如果Audio类里面有直接修改正在播放的bgm的音量的方法就好了)
不知道如果兼容于RGM之后,是否能够提高其性能。

悄咪咪地艾特一下加菲大佬~~~
@ guoxiaomi
梦石
0
星屑
14310
在线时间
2609 小时
注册时间
2013-6-10
回帖
1690
发表于 2023-6-7 18:25:21 | 显示全部楼层
我帮你大声地at一下@guoxiaomi
回复

使用道具 举报

梦石
1
星屑
24088
在线时间
3339 小时
注册时间
2011-7-8
回帖
3862

开拓者

发表于 2023-6-7 22:00:28 | 显示全部楼层
本帖最后由 guoxiaomi 于 2023-6-7 22:06 编辑

RGM应该是没问题的,可以看music.rb和sound.rb里,都是有调用的RGM::Base.music_set_volume和RGM::Base.sound_set_volume函数。前者只需要传入一个整数作为参数就行,后者需要指定sound的id。

RGM的Audio模块主要实现了RMXP的音乐混合、切换效果。如果只是单纯的放音乐,直接创建Music和Sound类的实例更方便。

点评

写个AudioContext是Kirh_036的要求,基本上SDL2有的功能都有,调整左右声道应该也是可行的,https://wiki.libsdl.org/SDL2_mixer/Mix_SetPanning,已加入TODO  发表于 2023-6-8 22:24
了解了!哈哈哈哈,看样子加菲大大真的吧各种音频模块融合进去了!!!(๑•̀ㅂ•́)و✧  发表于 2023-6-8 12:14
熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复

使用道具 举报

梦石
0
星屑
4864
在线时间
484 小时
注册时间
2022-5-6
回帖
248
发表于 2023-6-8 10:15:56 | 显示全部楼层
点音源在恐怖游戏中很有用,不过我是个游戏聋子........
搞HS是人类娱乐进步的源泉
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部