目次
効果音を作る
効果音などのエフェクトは必須要素ではないですが、作るとプレイが楽しくなりますし、作るのも楽しくなるのでおすすめです。面白い物ができるとテストワールドで延々ガシャコンガシャコン動かして遊べます。
FlameThrowerではパーティクルは作っていないので、今回は効果音について。
既存効果音を加工して使う
既存のバニラ効果音でもピッチ変更等で違うことに聞こえたりします。同時に二種類ならすことで雰囲気を変えてみたり。
world.playSoundAtEntity(player, "random.door_close", 1.0F, 1.0F / (world.rand.nextFloat() * 0.4F + 1.2F) + 1.3F);
このように、.playSoundAtEntity(プレイヤー, "効果音名", 音量, ピッチ)で鳴らすことが出来ます。
新規に効果音を作る
バニラにない効果音は、私のMODでは全て自作しています。ウェブ上に公開されているフリー効果音などは、assetsに任意のライセンスを掛けたいので避けています。(同梱配布で問題になると後々困るので。)
録音してみよう!
私は手持ちのスマホにWave形式で録音できる適当なアプリを入れて録音しています。Wave形式でさえあれば何でも良いと思います。一発録りは難しいので。色々なパターンを録っておくと良いと思います
今回は火炎放射器の発射音なので、マイクに近くから息を吹いて音割れした感じが合うかな?等と考えつつ、それっぽい物を録ってみます。
録れたら、パソコンへ移してやります。
加工してみる
加工の際、私は以前は SoundEngineFree、今はAudacityを使っています。
以下はAudacityの例。
- 録音した物をソフトにD&Dで放り込む
- 以下のようにソフト上で表示されます。
- 加工する
- やり方は特に決まりはないと思います。納得できれば終わり。今回は、音程が横ばいになる部分を数sec分ほどピックアップし、耳障りな部分のノイズを周波数フィルターやノイズフィルターで減らしたり、リバーブを掛けて雑音っぽさを出そうとしたり、あれこれ。
- ogg形式で書き出し
- 書き出し→ogg形式を選択すればOK。念のため、編集ファイルのwave版も取っておくと後で修正しやすいかもしれません。
sound.jsonの作成
1.7からMOD内で登録処理を呼んで追加する手が使えなくなってしまっているので、jsonファイルを作ります。
- sound.json
{"flame": {"category": "master","sounds": [{"name": "dcsflame:items/flame", "stream": false}]}}
jsonファイルの置き場はassets/MODID/以下です。また、oggファイルは上記例の場合、jsonファイルと同じ階層にsounds/itemsフォルダ内に入れます。
MOD内で呼び出す
MOD内で使用する場合は、
par2World.playSoundAtEntity(par3EntityPlayer, "dcsflame:flame", 0.6F, 1.6F);
のように、"MODID:効果音名"で呼び出せます。効果音名はjsonファイル内で定義したものです。
今回は射出時に鳴らします。右クリック押しっぱなしで弾も効果音も連続で出しているので、右クリック中は継続で鳴っているようにしました。
- ItemIgnis.class
@Override public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) { boolean inf = EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, par1ItemStack) > 0; int power = EnchantmentHelper.getEnchantmentLevel(Enchantment.power.effectId, par1ItemStack); int fire = EnchantmentHelper.getEnchantmentLevel(Enchantment.flame.effectId, par1ItemStack); int punch = EnchantmentHelper.getEnchantmentLevel(Enchantment.punch.effectId, par1ItemStack); int poison = EnchantmentHelper.getEnchantmentLevel(FlameCore.poisonous.effectId, par1ItemStack); int unb = EnchantmentHelper.getEnchantmentLevel(Enchantment.unbreaking.effectId, par1ItemStack); boolean creative = par3EntityPlayer.capabilities.isCreativeMode; boolean hasCharge = false; if (par1ItemStack.getItem() == this) { int c2 = this.discharge(par1ItemStack, 1, false); if (c2 > 0) { hasCharge = true; this.discharge(par1ItemStack, 1, true); } } if (creative || hasCharge) { float fireDam = 2.0F * fire; float powerDam = 0.4F * power; float poisonDam = 0.5F * poison; float dam = 2.0F + fireDam + powerDam + poisonDam; float ram = par2World.rand.nextFloat(); int cooltime = 0; // 一旦凍結 // if (cooltime < 0) // cooltime = 0; float speed = 1.0F + (punch * 1.0F); for (int i = 0; i < 4; i++) { float f = speed * (i * 0.35F) + ram; EntityFlame bullet = new EntityFlame(par2World, par3EntityPlayer, f, 0.0F, dam, 4.0F, cooltime); bullet.setFire(100); if (poison > 0) { bullet.setCorrosion(true); } if (fire > 0) { bullet.setAdvFire(true); } if (!par2World.isRemote) { par2World.spawnEntityInWorld(bullet); } } par2World.playSoundAtEntity(par3EntityPlayer, "dcsflame:flame", 0.6F, 1.6F); } else { if (par3EntityPlayer.inventory.hasItem(FlameCore.magazine) || inf) { NBTTagCompound nbt = par1ItemStack.getTagCompound(); if (nbt != null) { nbt.setInteger("magazine", 100 + unb * 50); par1ItemStack.setTagCompound(nbt); } else { NBTTagCompound nbt2 = new NBTTagCompound(); nbt2.setInteger("magazine", 100 + unb * 50); par1ItemStack.setTagCompound(nbt2); } if (!inf) par3EntityPlayer.inventory.consumeInventoryItem(FlameCore.magazine); par2World.playSoundAtEntity(par3EntityPlayer, "random.door_close", 1.0F, 1.0F / (itemRand.nextFloat() * 0.4F + 1.2F) + 1.3F); } } return par1ItemStack; }