概述
一个好的游戏,往往都有着丰富的声音系统,比如说在Minecraft这个游戏中,当你靠近一个洞穴的时候系统就会播放风声,当你的附近有着僵尸的时候就会传来僵尸的吼叫声,玩家可以通过声音来判断目前的状态,这无疑增加了游戏的趣味性和冒险性。
本部分内容将带领读者完成在Minecraft中导入声音、并在适当的时候播放声音的内容。我们假设读者已经拥有了想要应用在Minecraft中的OGG格式的音乐,也就是后缀名为ogg的音乐文件。这里我们采用的是本部分的作者使用计算机合成的一段非常短的,被用作音效的音乐。如有需要,可以通过这个链接获取音乐,并随意使用,作者不保留这段音乐的任何版权。
音乐索引文件
我们需要在assets.fmltutor
包下创建一个文件:sounds.json
:
src/main/resources/assets/fmltutor/sounds.json:
{
"fmltutor.test": {
"category": "player",
"sounds": [
"fmltutor"
]
}
}
这个名为sounds.json
的文件,就是这个Mod的音乐索引文件,其中贮存了各种各样音乐的索引。
这个文件的内容,是一段非常普通的JSON文件,这个文件通过储存JSON对象的方式提供键值对。这里的键值对中,标识符为这个声音的名称,在这里就是fmltutor.test
,在程序中调用的时候要加上Mod id,也就是fmltutor:fmltutor.test
,而值就是关于这个声音的信息。
category
表示的是这个声音的类型,总共有ambient
(环境)、weather
(天气)、player
(玩家)、neutral
(中立)、hostile
(敌对)、block
(方块)、record
(唱片)、music
(音乐)、master
(控制)这八种类型。sounds
表示的就是声音了,这里表示的声音存放在这个音乐索引文件所在目录下的sounds
文件夹下,在这里就是assets.fmltutor.sounds
包下,这里表示的声音是一个列表,在游戏中会随机选取其中一个所代表的声音播放。
sounds
表示的声音列表还可以有volume
、pitch
等选项,分别表示响度、音量等。不过这里我们不作讨论,感兴趣的读者可以自己查找相关信息。
然后我们在assets.fmltutor.sounds
下放置一个名为fmltutor.ogg
的OGG格式的音乐,就可以了。
播放这个音乐
net.minecraft.world.World
类有数个用于播放音乐的方法,其中有两个方法比较常用,其中一个为playSoundAtEntity
,用于在特定实体所在位置播放音乐,还有一个就是playSound
方法,用于在特定位置播放特定的声音,还可以设定这个声音是否有声速延迟。
我们先来看一下playSound
方法:
- 前三个参数表示这个声音所在位置的坐标,分别为
x
、y
、z
。 - 第四个参数表示这个声音的名称,在上面的声音索引文件中有所提及。
- 第五个参数表示这个声音的响度,默认响度为1.0F。
- 第六个参数表示这个声音的音调,默认音调为1.0F。
- 最后一个参数表示这个声音是否有延迟,比如雷声就存在着延迟。
我们再来看一下playSoundAtEntity
方法:
- 第一个参数表示该实体,没有什么过多的解释。
- 第二个参数表示声音的名称,和上面一样。
- 最后两个参数分别表示声音的响度和音调,和上面的同样没有差别。
有了这些,我们就可以试一试了:
src/main/java/com/github/ustc_zzzz/fmltutor/common/EventLoader.java(部分):
@SubscribeEvent
public void onPlayerItemCrafted(PlayerEvent.ItemCraftedEvent event)
{
event.player.worldObj.playSoundAtEntity(event.player, "fmltutor:fmltutor.test", 1.0F, 1.0F);
if (event.crafting.getItem() == Item.getItemFromBlock(BlockLoader.grassBlock))
{
event.player.triggerAchievement(AchievementLoader.buildGrassBlock);
}
}
当玩家在工作台合成物品之后便会在玩家所在处播放一个叫作fmltutor
的Mod下的一个名为fmltutor.test
的声音,也就是这里的示例声音。
打开游戏试试吧~