リリカルリミテッドが販売しているゲームやイラスト集のサポート用のブログです。
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
$game_message.add("文章")
gm = $game_message gm.choices.push("1","2","3","4","5","6","7","8") gm.choice_cancel_type = 9 gm.choice_proc = Proc.new {|n| $branch = n } Fiber.yield while $gm.choice? case $branch when 0 then $game_variables[61] = 1 when 1 then $game_variables[61] = 2 when 2 then $game_variables[61] = 3 when 3 then $game_variables[61] = 4 when 4 then $game_variables[61] = 5 when 5 then $game_variables[61] = 6 when 6 then $game_variables[61] = 7 when 7 then $game_variables[61] = 8 when 8 then $game_variables[61] = 9
end
![]()
コード解説
選択肢を表示させるには「$game_message」というクラスを使います。
イベントスクリプトに入れるには省スペースにしなければならないため、gmという変数に$game_messageを代入しています。
これはつまり「$game_message.choices.push」と書かれているわけですが、()内にはそれぞれの選択肢に表示したい文字を「,」で分けて書いています。
この「$game_message.choices.push("1","2","3","4","5","6","7","8")」はこのように書くこともできます。
$game_message.choices.push("1") $game_message.choices.push("2") $game_message.choices.push("3") $game_message.choices.push("4") $game_message.choices.push("5") $game_message.choices.push("6") $game_message.choices.push("7") $game_message.choices.push("8")
こうして描くとただコードが冗長になったように感じますが、「$game_message.choices」をgmcという変数に代入した場合
gmc = $game_message.choices gmc.push("1") gmc.push("2") gmc.push("3") gmc.push("4") gmc.push("5") gmc.push("6") gmc.push("7") gmc.push("8")
と縦にすっきりした形で書くことができます。
この縦書き選択肢の使った方が良い場合というは選択肢の中身が長くなる場合でしょう。
例えば
選択肢
勇者よ!魔王を倒せ!と叫ぶ
勇者よ!ほどほどに頑張れ!と声をかける
勇者よ!気楽にな。と肩を叩く
勇者よ!無理はするな!と引き止める
勇者よ!お前じゃ無理だ!と叫ぶ
という選択肢を作りたい場合、横に長くすると
gmc = $game_message.choices gmc.push("選択肢","勇者よ!魔王を倒せ!と叫ぶ","勇者よ!ほどほどに頑張れ!と声をかける","勇者よ!気楽にな。と肩を叩く","勇者よ!無理はするな!と引き止める","勇者よ!お前じゃ無理だ!と叫ぶ")
となり、これをイベントスクリプトに入れるとツクールの方で強制改行され、エラーが出る原因になります。
これを縦に書くと
gmc = $game_message.choices gmc.push("選択肢") gmc.push("勇者よ!魔王を倒せ!と叫ぶ") gmc.push("勇者よ!ほどほどに頑張れ!と声をかける") gmc.push("勇者よ!気楽にな。と肩を叩く") gmc.push("勇者よ!無理はするな!と引き止める") gmc.push(勇者よ!お前じゃ無理だ!と叫ぶ"")
となり、横幅に何とか間に合い、直感的にも分かりやすいコードの形になります。
それぞれの場面でやり易いやり方を選択してください。
これは選択肢が表示された時にキャンセルボタンが押された時の挙動を決めているコードです。
choice_cancel_typeプロパティの値で、以下のように挙動が決まります。 choice_cancel_type = 0 でキャンセルボタン無効に。 choice_cancel_type = 1 でキャンセルボタンが押された時に選択肢1を選択 choice_cancel_type = 2 でキャンセルボタンが押された時に選択肢2を選択 choice_cancel_type = 3 でキャンセルボタンが押された時に選択肢3を選択 ・ ・ ・
というように反映されます。
選択肢がない場合にも値は返され、次のコードのnにその値に-1された値が代入されます。
選択肢の表示をスクリプトで行う上で難しいのがこのコードでしょう。
よくわからない場合は一先ず、ここでは"どの選択肢にしたかを記憶する準備をしている"と考えて、5行目まで読み飛ばしてください。
以下は何を行っているかという説明です。
"Proc.new {|n| $branch = n }"はブロックと呼ばれる処理の塊で、それをgm.choice_procという変数に入れることにより、Procオブジェクトとしています。
このブロックというのは基本的には要素の数だけ{}内の処理を繰り返すといもので、ここではどの選択肢にしたかという値を$branchに代入しています。
この$branchは選択肢1が選択されたら0を、選択肢2を選択されたら1を、選択肢2を選択されたら2を返します。
あとはこの$branchによってどのような処理をするのかを書くだけです。
Procとはなんなのか、ブロックとは何なのか興味のある方はこちらのサイトを参考にしてください。
この行は選択肢が選択されるまで処理を待つための行です。
これがないと最後まで処理が流れてしまい選択肢に応じた処理ができなくなります。
Fiber.yieldというのは処理を一旦この行で止める処理と考えてください。
こちらで$branchに代入された数値に応じて指定した変数を代入しています。
今回はcase文を使って場合分けして文章表示させるという方法を取りましたがもっとスマートな方法もあるかと思います。
スクリプトエディタ画面でなく、イベント画面で編集したいのでこのような形にしました。
選択肢を4つ以下にしたいときはサンプルコードの{}の中とcase文を減らすことで可能です。
$game_message.num_input_digits_max = 桁数
$game_message.num_input_variable_id = 受け取る変数ID
Fiber.yield until Input.trigger?(:C)
$game_message.add("表示する文章")
$game_message.scroll_mode = true
$game_message.scroll_speed = 2
$game_message.scroll_no_fast = false
wait_for_message
$game_actors[アクターID].learn_skill(スキルID) #スキルを覚える
$game_actors[アクターID].forget_skill(スキルID) #スキルを忘れる
$game_player.followers.visible = trueかfalse #("ON"か"OFF"でもok)
$game_player.refresh #これが無いと変更が反映されない。
$game_player.followers.gather
#メンバーが集合するまでウェイトするなら以下のコードを追加
Fiber.yield until $game_player.followers.gather?
character = get_character(イベントのID)
character.animation_id = アニメーションのID
#表示終了までウェイトするなら以下のコードを追加
Fiber.yield while character.animation_id > 0
character = get_character(イベントID)
character.balloon_id = フキダシアイコンのID
#表示終了までウェイトをかけるときは以下のコードを追加
Fiber.yield while character.balloon_id > 0
#フェードアウト
Fiber.yield while $game_message.visible
screen.start_fadeout(フェードアウトするまでの時間)
wait(フェードアウトに合わせてイベントを止める時間)
#フェードイン
Fiber.yield while $game_message.visible
screen.start_fadein(フェードインするまでの時間)
wait(フェードインに合わせてイベントを止める時間)
tn = Color.new(赤,緑,青,強度)
screen.start_flash(tn, 時間)
#フラッシュが終わるまでウェイトするなら以下のコードを追加
wait(ウェイト時間)
$sp = screen.pictures[番号]
$tn = Tone.new(赤, 緑, 青 (,グレー))
$sp.start_tone_change($tn, 変化にかける時間)
bm = BattleManager #バトル処理の下準備
bm.setup(敵グループID, 逃走可能か,負けた場合も継続か)
bm.event_proc = Proc.new{|n| @branch[1] = n}
#戦闘の結果を@branchに代入、nに選択肢の数値を代入
$game_player.make_encounter_count
SceneManager.call(Scene_Battle)
Fiber.yield #戦闘までウェイト
if @branch[1] == 0 #勝利した場合の処理
$game_message.add("勝利した場合の処理")
elsif @branch[1] == 1 #逃走した場合の処理
$game_message.add("逃げた場合の処理")
elsif @branch[1] == 2 #負けた場合の処理
$game_message.add("負けた場合の処理")
end
g = [アイテムの種類,アイテムのID,価格を指定するか,値段]
#アイテムの種類 0:アイテム 1:武器 2:防具
#価格の指定 0:標準 1:指定
goods = [g]
SceneManager.call(Scene_Shop)
SceneManager.scene.prepare(goods, 購入のみか)
Fiber.yield
game_system.battle_bgm.name = ファイルの名前
$game_system.battle_bgm.volume = 音量
$game_system.battle_bgm.pitch = ピッチ
$game_system.battle_end_me.name = 名前
$game_system.battle_end_me.volume = 音量
$game_system.battle_end_me.pitch = ピッチ
$game_system.encounter_disabled = trueかfalse
#trueでエンカウント禁止、falseでエンカウント許可
#("ON"か"OFF"でもok)
ga = $game_actors[アクターのID]
ga.set_graphic(歩行グラのファイル名前, 歩行グラのID, 顔グラのファイル名前, 顔グラのID)
$game_player.refresh #アクターのグラフィックの再設定
ve = $game_map.vehicles[乗り物ID]
#乗り物ID 小型船:0 大型船:1 飛行船:2
ve.set_graphic("ファイル名", 何番目のチップか)
fn = "ファイル名"
$game_map.change_parallax(fn, x方向にループさせるか, y方向にループさせるか, x方向へのスクロールの速度, y方向へのスクロールの速度)
$game_map.terrain_tag(x座標, y座標) #地形タグを取得
$game_map.event_id_xy(x座標, y座標) #イベントIDを取得
$game_map.tile_id(x座標, y座標, レイヤー) #タイルIDを取得
#L=0でLayer1、L=1でLayer2、L=2でLayer3
$game_map.region_id(x座標, y座標) #リージョンIDを取得
value = operate_value(増減, 定数か変数か, 値)
#0:増やす 1:減らす/0:定数 1:変数
#変数を選択した際、値は変数のIDを示す
iterate_enemy_index(敵ID) do |enemy| #敵ID=-1以下で敵グループ全体
return if enemy.dead? #敵が戦闘不能で中断
enemy.change_hp(value, true)
if enemy.dead? #戦闘不能を許可するか
enemy.perform_collapse_effect
end
end
value = operate_value
(増減, 定数か変数か, 値)
#0:増やす 1:減らす/0:定数 1:変数
#変数を選択した際、値は変数のIDを示す
iterate_enemy_index(敵ID) do |enemy|
#敵ID=-1以下で敵グループ全体
enemy.mp += value
end
iterate_enemy_index(敵ID) do |enemy|
#敵ID=-1以下で敵グループ全体
already_dead = enemy.dead?
enemy.add_state(ステートID)
#敵の戦闘不能を許可するなら以下のif文を追加
if enemy.dead?
enemy.perform_collapse_effect
end
end
iterate_enemy_index(敵ID) do |enemy| #-1以下で敵全員
enemy.appear
$game_troop.make_unique_names
end
iterate_enemy_index(敵ID) do |enemy| #-1以下で敵全員
enemy.transform(変身させる敵キャラID)
$game_troop.make_unique_names
end
iterate_battler(敵キャラかアクターか,キャラクターID) do |battler|
#0で敵キャラ、1でアクター指定
next if battler.death_state?
battler.force_action(スキルID, 行動対象ID(Index))
BattleManager.force_action(battler)
Fiber.yield whileBattleManager.action_forced?
end