我正在为GBDK中的 GameBoy 制作游戏,并且正在尝试为游戏添加声音。GBDK 有一个函数可以从一组值中播放声音,唯一的问题是在播放声音时脚本的其余部分会冻结。有没有办法让它们同时运行?
1 回答
使用采样音频播放时无法运行代码。这是因为它实际上使用全 CPU 来执行此播放。如果您想使用常规音效,则需要在游戏播放时暂停游戏,或使用其他方法。我将尝试使用下面的其他播放方法进行总结,但这有点复杂,我不是专家。
使用“正常”音效
这是一种 WIP - 我对它不是很有经验,但它应该让你开始。
要使用音效,您需要写入 GameBoy 音频寄存器。这可以在 GBDK 中找到hardware.h
,它会自动包含在对 的引用中gb\gb.h
。但是(当然)寄存器没有任何文档。此信息可在GB Cribsheet上找到。还有这个声音文档文件(不幸的是,它在 Windows 编码上的行为很奇怪——用记事本以外的东西打开),以及在Devrs.com 声音文档中找到的一些其他信息。
处理 GBSOUND.TXT:
可以访问声道的地址是:
$Addresses: (Description), (Register shorthand)
$FF10 -- $FF14: Channel 1, 简称 NR10-NR14
$FF15 未使用,可能是通道 2 的扫描 reg
最初
$FF16 -- $FF19:通道 2,称为 NR21-NR24
$FF1A -- $FF1E:通道 3,称为 NR30-NR34
$FF1F 未使用,可能是扫描reg for channel 4
最初
$FF20 -- $FF23: Channel 4, 简称 NR41-NR44
$FF24 控制 Vin 状态和音量, 简称 NR50
$FF25 选择每个通道去哪个输出, 简称 NR51
$FF26是状态寄存器,也控制音响电路的电源。
称为 NR52
$FF27 -- $FF2F 未使用。 $FF30 -- $FF3F 是通道3
的 4 位样本的加载寄存器空间
在 GBDK 中,寄存器被命名为NR10_REG
, NR11_REG
, NR12_REG
, 等。
另外,请尝试查看示例程序sound.c
,不幸的是,它无法为我编译。我可能会编辑它以包含更多信息。
回答@franklin的问题:
这就引出了一个问题,一个游戏男孩如何同时玩游戏和声音?
他们通常不会在播放样本时这样做。例如,如果你看 Pokémon Yellow,皮卡丘的哭声是通过样本播放完成的。但是,在播放的同时,什么也没做。另一方面,诸如普通背景音乐之类的事情是使用其他音频硬件完成的(对不起,不是很详细的 wiki 链接)。同样,虽然移动音效是通过噪声通道完成的(也用于样本播放),但它们实际上并不是采样音频。因此,游戏可以继续运行。