こんにちは、毎度お騒がせしております。
今回は、Space not far様のRGSS2素材「ディフェンダーVer1.02」において、現状ではディフェンダー発生時に通常の被害ダメージSEしかならないのですが、“発動した時にキャラごとに違う効果音を鳴らしたい”のです。
なんとか改変できる方はいらっしゃられませんでしょうか?
よろしくお願い申し上げます。
【VX/RGSS2改造】ディフェンダー時個別効果音
Re: 【VX/RGSS2改造】ディフェンダー時個別効果音
こんばんは。
まず、「通常の被ダメージSE」を鳴らす処理を探しましょう。
スクリプトエディタのSoundにはデータベース上で設定したSEを鳴らす処理が詰め込まれています。
ここを見ると、以下のコードが見つかります。どうやら「play_actor_damage」という処理が味方の被ダメージSEを鳴らす処理のようですね。
「play_actor_damage」で全体検索すると、2つ候補が見つかります。
「Sound」は今見ているところなので、「Scene_Battle」の方を見ましょう。ここに味方の被ダメージSEを鳴らす処理がありました。
つまり、ここに「ディフェンダーが発動した時、別のSEを鳴らす」処理を組み込めばいいわけです。
じゃあその「ディフェンダーが発動した時」はどう判別すればいいか探しましょう。
「ディフェンダー Ver1.02」の設定項目の直後を見ると、
「attr_reader :defender # 行動結果: ディフェンダーフラグ」というのが見つかります。
これが「ディフェンダーが発動した時」のフラグのようです。
以上を踏まえて、前回説明した時のように改造してみましょう。
ただし、ここに入れると「攻撃をガードした!」のメッセージが表示されて、
それから被ダメージ表示とともにSEが鳴る、というちょっと間抜けな感じになってしまいます。
そうではなくて、ディフェンダーSE→被ダメージSE と鳴らしたい場合は、先ほどの改造ではなく、
「ディフェンダー Ver1.02」内にあるScene_Battleの記述を改造します。何か不明点等ございましたら遠慮なくどうぞ。
まず、「通常の被ダメージSE」を鳴らす処理を探しましょう。
スクリプトエディタのSoundにはデータベース上で設定したSEを鳴らす処理が詰め込まれています。
ここを見ると、以下のコードが見つかります。
コード: 全て選択
# 味方ダメージ
def self.play_actor_damage
$data_system.sounds[12].play
end
「play_actor_damage」で全体検索すると、2つ候補が見つかります。
「Sound」は今見ているところなので、「Scene_Battle」の方を見ましょう。
コード: 全て選択
def display_hp_damage(target, obj = nil)
if target.hp_damage == 0 # ノーダメージ
(中略)
elsif target.absorbed # 吸収
(中略)
elsif target.hp_damage > 0 # ダメージ
if target.actor?
text = sprintf(Vocab::ActorDamage, target.name, target.hp_damage)
Sound.play_actor_damage # ここ
$game_troop.screen.start_shake(5, 5, 10)
else
(中略)
end
else # 回復
(中略)
end
(中略)
end
つまり、ここに「ディフェンダーが発動した時、別のSEを鳴らす」処理を組み込めばいいわけです。
じゃあその「ディフェンダーが発動した時」はどう判別すればいいか探しましょう。
「ディフェンダー Ver1.02」の設定項目の直後を見ると、
「attr_reader :defender # 行動結果: ディフェンダーフラグ」というのが見つかります。
これが「ディフェンダーが発動した時」のフラグのようです。
以上を踏まえて、前回説明した時のように改造してみましょう。
コード: 全て選択
def display_hp_damage(target, obj = nil)
(中略)
elsif target.hp_damage > 0 # ダメージ
if target.actor?
text = sprintf(Vocab::ActorDamage, target.name, target.hp_damage)
if target.defender
case target.id
when 1
Audio.se_play("Audio/SE/アクター1ディフェンダー", 80, 100)
when 2
Audio.se_play("Audio/SE/アクター2ディフェンダー", 80, 100)
when 3
Audio.se_play("Audio/SE/アクター3ディフェンダー", 80, 100)
end
else
Sound.play_actor_damage
end
$game_troop.screen.start_shake(5, 5, 10)
else
(中略)
end
(中略)
end
それから被ダメージ表示とともにSEが鳴る、というちょっと間抜けな感じになってしまいます。
そうではなくて、ディフェンダーSE→被ダメージSE と鳴らしたい場合は、先ほどの改造ではなく、
「ディフェンダー Ver1.02」内にあるScene_Battleの記述を改造します。
コード: 全て選択
if SNF::DEFENDER_DISPLAY
class Scene_Battle < Scene_Base
#--------------------------------------------------------------------------
# ● クリティカルヒットの表示
# target : 対象者
# obj : スキルまたはアイテム
#--------------------------------------------------------------------------
alias snf_defender_display_critical display_critical
def display_critical(target, obj = nil)
snf_defender_display_critical(target, obj)
# 間借り
if target.defender
if target.actor?
text = SNF::DEFENDER_WORD
case target.id
when 1
Audio.se_play("Audio/SE/アクター1ディフェンダー", 80, 100)
when 2
Audio.se_play("Audio/SE/アクター2ディフェンダー", 80, 100)
when 3
Audio.se_play("Audio/SE/アクター3ディフェンダー", 80, 100)
end
else
text = ""
end
@message_window.add_instant_text(text)
wait(20)
end
end
end
end
------------------------------------------------------------------
自作の(改造でない)スクリプト、プラグイン素材に
関しては、リードミーもしくは作中に
「faida」と記名していただければ
利用可能です。
自作の(改造でない)スクリプト、プラグイン素材に
関しては、リードミーもしくは作中に
「faida」と記名していただければ
利用可能です。
Re: 【VX/RGSS2改造】ディフェンダー時個別効果音
faida様、前回のダメージアクター個別処理でもお世話になりました。
私のような初心者にもわかりやすく、ことの一から説明して頂けるので、大変勉強になっております!
最後に記述していただいたコードでディフェンダー成功時の個別SE再生には成功したのですが、これを仮に「成功時のSEをいくつかの候補からランダムにひとつだけ再生する」といった場合の記述はどのようになるでしょうか?
あるいは不可能でしょうか?
ご解説頂けると嬉しく思います。
私のような初心者にもわかりやすく、ことの一から説明して頂けるので、大変勉強になっております!
最後に記述していただいたコードでディフェンダー成功時の個別SE再生には成功したのですが、これを仮に「成功時のSEをいくつかの候補からランダムにひとつだけ再生する」といった場合の記述はどのようになるでしょうか?
あるいは不可能でしょうか?
ご解説頂けると嬉しく思います。
Re: 【VX/RGSS2改造】ディフェンダー時個別効果音
ランダム要素を入れるならこのように、「rand(n)」で乱数を取得できるので、これを使います。
rand(n)は「0~(n-1)までの乱数を取得」なので、rand(3)だと出てくる数字は「0,1,2」になります。
※でも多くの素材屋さんがやるように、これに関してはもう少しスマートな方法があります。
内容が少し進歩的なので分かりづらいかもしれませんが、それでもよろしければ下記をご覧ください。
まず、多くの素材屋さんで採用されている「設定項目」を作ります。これをスクリプトの上部に貼り付けて、IDやSEを増やして、「設定項目」が完成です。
[]は「配列」といって、モノを複数管理するのに役立ちます。
次に、この配列からランダムにモノを引き出す処理を作ります。「array.size」というのは配列の中身の数です。例だと3つ入っているので「3」となります。
つまり「rand(array.size)」なら「0,1,2のどれか」ですね。先ほどと同じです。
で、設定項目にIDがあればその中からSEをランダムに再生します。
何か不明点等ございましたら遠慮なくどうぞ。
コード: 全て選択
alias snf_defender_display_critical display_critical
def display_critical(target, obj = nil)
snf_defender_display_critical(target, obj)
(中略)
case target.id
when 1
case rand(3)
when 0
Audio.se_play("Audio/SE/アクター1ディフェンダー1", 80, 100)
when 1
Audio.se_play("Audio/SE/アクター1ディフェンダー2", 80, 100)
when 2
Audio.se_play("Audio/SE/アクター1ディフェンダー3", 80, 100)
end
when 2
(中略)
end
(中略)
end
end
rand(n)は「0~(n-1)までの乱数を取得」なので、rand(3)だと出てくる数字は「0,1,2」になります。
※でも多くの素材屋さんがやるように、これに関してはもう少しスマートな方法があります。
内容が少し進歩的なので分かりづらいかもしれませんが、それでもよろしければ下記をご覧ください。
まず、多くの素材屋さんで採用されている「設定項目」を作ります。
コード: 全て選択
ACTOR_DEFENDER_SE = []
# ACTOR_DEFENDER_SE[id] = ["SE1", "SE2", ...]
ACTOR_DEFENDER_SE[1] = ["アクター1ディフェンダー1", "アクター1ディフェンダー2","アクター1ディフェンダー3"]
ACTOR_DEFENDER_SE[2] = ["アクター2ディフェンダー1", "アクター2ディフェンダー2","アクター3ディフェンダー3"]
ACTOR_DEFENDER_SE[3] = ["アクター3ディフェンダー1", "アクター3ディフェンダー2","アクター3ディフェンダー3"]
[]は「配列」といって、モノを複数管理するのに役立ちます。
次に、この配列からランダムにモノを引き出す処理を作ります。
コード: 全て選択
if SNF::DEFENDER_DISPLAY
class Scene_Battle < Scene_Base
#--------------------------------------------------------------------------
# ● クリティカルヒットの表示
# target : 対象者
# obj : スキルまたはアイテム
#--------------------------------------------------------------------------
alias snf_defender_display_critical display_critical
def display_critical(target, obj = nil)
snf_defender_display_critical(target, obj)
# 間借り
if target.defender
if target.actor?
text = SNF::DEFENDER_WORD
id = target.id # ここアクターのID
array = ACTOR_DEFENDER_SE[id] # ここ配列
if array # ここ設定項目にIDがあるかどうか
name = array[rand(array.size)] # ここSEの名前
Audio.se_play("Audio/SE/"+name, 80, 100) if name # ここSE鳴らす
end
else
text = ""
end
@message_window.add_instant_text(text)
wait(20)
end
end
end
end
つまり「rand(array.size)」なら「0,1,2のどれか」ですね。先ほどと同じです。
で、設定項目にIDがあればその中からSEをランダムに再生します。
何か不明点等ございましたら遠慮なくどうぞ。
------------------------------------------------------------------
自作の(改造でない)スクリプト、プラグイン素材に
関しては、リードミーもしくは作中に
「faida」と記名していただければ
利用可能です。
自作の(改造でない)スクリプト、プラグイン素材に
関しては、リードミーもしくは作中に
「faida」と記名していただければ
利用可能です。
Re: 【VX/RGSS2改造】ディフェンダー時個別効果音
なるほど、上記のものは乱数で条件分岐と言うことですね。先だってご解説いただいた被害ダメージボイスも、これの応用でいくつか用意できそうですね。
不慣れもなもので丸一日かかってしまいましたが、両方とも実用レベルで正常に稼働しました!
faida様一度ならず二度までもご助力くださりありがとうございます。
確かに、二番目の項目設定式の方が仰られる通りスマートですね。
不慣れもなもので丸一日かかってしまいましたが、両方とも実用レベルで正常に稼働しました!
faida様一度ならず二度までもご助力くださりありがとうございます。
確かに、二番目の項目設定式の方が仰られる通りスマートですね。