一定期間更新がないため広告を表示しています
* RPGツクールMVを使った、ゲームを一層楽しくするためのアイディアや、豆知識、プラグインなどを紹介していきます。あくまで個人の考えに基づく記事ですので、参考程度にお読みいただければ幸いです。
キャラクターのHPやレベルなどのステータス情報、ダンジョンで獲得した宝箱の数など、
ちょっとした情報を常にマップ画面に表示させておきたいとします。
実はこれが出来るプラグインは既に存在していますし、高機能ではありますが、
簡易なウィンドウを表示させるやり方を解説していきたいと思います。
(ただ、今回はちょっと自信無いので、やや消極的にいきます)
とりあえずは下の画像の左上にある様な感じですね。
この状態で宝箱を2個取ると、
情報ウィンドウの表示もリアルタイムで更新されます。
まず実際にウィンドウを表示する前に「この宝箱の数はどこから来ているのか?」について、あらかじめ説明しておきます。宝箱を取るイベントの中に「宝箱を開けた数」という変数を作り、1個取るたびにその変数に1を加算する、という処理を入れます。
つまり情報ウィンドウと言いましても、単に画面上にこの変数の値をそのまんま表示させているだけです。
これをふまえて、実際に情報ウィンドウをどの様に表示させるのか、解説します。
Javascriptさんは1から100までを言わないと怒り出すタイプの言語さんでして(1から100までを言っても怒り出すタイプの言語さんもいらっしゃいますが)、「この変数を左上に表示してくれよ〜」って命令するだけだと、「は?」と怒られてしまうんです。
Javascriptさんに「情報ウィンドウを表示させたい」をお願いしたら、こんなお返事が来るわけです。
(1) ふんふん、どの場所に?
(2) で、どのタイミングで?
(3) っていうか「情報ウィンドウ」ってそもそも何なの?
(4) なるほどね、それじゃそれ表示する位置を、x座標とy座標で細かく教えてよ。
(5) あ、その情報ウィンドウとやらの幅と高さも頼むよ。
(6) 待って、情報ウィンドウの色は? 透明度は?
(7) え? 情報ウィンドウに文字載せるの? 何を載せればいいの?
(8) 情報ウィンドウ内のどこにテキストを載せるの? 端っこでいいの?
(9) その載せるテキストの文字サイズは? 色は?
(10) よーし分かった。じゃあこれで表示していくよ。え? 宝箱の数が1個から2個になったら、1って文字を消せって? 先に言ってよ。1の上に2を書き足しちゃったよ。
とまあ、こんな感じなのですよ(~_~;;
なので今回は一つ一つの手順を解説していくと、とんでもないボリュームになってしまうので、先にスクリプトをこちらからダウンロードしてください。それについて補足説明を入れていく、という形で対応したいと思います。
[プラグインをダウンロードする]
(「InfoWindow.js」というタイトルです。各プロジェクトフォルダのjs/plugin内に入れ、プラグイン管理よりInfoWindow.jsをONにしてください)
■補足説明
13〜33行目
// マップ上に表示する宣言
var Scene_map_start = Scene_Map.prototype.start; Scene_Map.prototype.start = function() { Scene_map_start.call(this); this._InfoWindow = new Window_Info(); this.addWindow(this._InfoWindow); }; // ウィンドウ内の情報を更新するタイミングを宣言 var _Scene_Map_update = Scene_Map.prototype.update; Scene_Map.prototype.update = function() { _Scene_Map_update.call(this); this._InfoWindow.setText(); }; // ウィンドウを定義 function Window_Info() { this.initialize.apply(this, arguments); } Window_Info.prototype = Object.create(Window_Base.prototype); Window_Info.prototype.constructor = Window_Info; |
この部分は全く変更する必要はありません。
上のJavascriptさんの返事でいうと(1)〜(3)の部分にあたります。
たとえば「addWindow」という語がありますよね。addは追加、Windowはそのままウィンドウ、なので「Scene_Map」「start」「addWindow」という三つの語を拾い出せば、「マップが開始されたらウィンドウを画面上に追加する」という様な意味合いになる事は分かると思います。
ちなみに赤字の_Infoは全て共通にすれば変更しても問題無いです。Window_Otakaraとかでも構いません。
36〜42行目
Window_Info.prototype.initialize = function() {
var x = 20; var y = 20; var width = 180; var height = 108; Window_Base.prototype.initialize.call(this, x, y, width, height); }; |
ここで、情報ウィンドウの位置調整と、大きさ調整です。
var x = 20、var y = 20は、「画面上のx座標20、y座標20の位置にウィンドウを表示するよ」という意味です。単位はピクセルです。つまり、こういう事ですね。
その下、var widthはウィンドウの幅、var heightはウィンドウの高さです。
こちらも単位はピクセル。
これはゲーム画面をスクリーンショットで撮影して、お絵描きソフトに貼り付けて、作りたいウィンドウを実際に描くと、自分の思う位置・幅・高さの数値を算出しやすいです。
続いて少し飛んで49〜56行目。
いよいよ情報ウィンドウの中身の作り方に迫っていきます。
Window_Info.prototype.refresh = function() {
this.contents.clear(); this.changeTextColor(this.textColor(16)); this.drawIcon(210, 1, 1); this.drawText("拾った宝箱",40, 1); this.resetTextColor(); this.drawText($gameVariables.value(2) + " 個",0,this.lineHeight()); }; |
まず、
this.contents.clear();
最初にこれ書かないと、更新前の文字が残ったままになります。カウントアップさせる場合だと「1」の字の上に「2」が重なったりして、ものすごい事になります。
this.changeTextColor(this.textColor(16));
次からのテキストを16番の色(薄いブルー)に変更せよという意味です。
色がデフォルトのままで良い場合は、この行は丸ごと不要です。
ちなみに色の数値は、プロジェクトフォルダのimg/system/Window.pngの右下の色群です。
例えばオレンジにしたいなら、this.textColor(2)です。
this.drawIcon(210, 1, 1);
アイコンを表示させます。210番のアイコンをx座標1、y座標1の位置に表示させよという意味です。
上の例では宝箱のアイコンを表示させていますが、宝箱アイコンはアイコン群のID210番です。
イベント「文章の表示」で、入力ウィンドウ内を右クリックするとアイコンビューアが出せますが、そこでアイコンを選択した時にIDが下に表示されると思います。その数値です。
this.drawText("拾った宝箱",40, 1);
「拾った宝箱」というテキストをx座標40、y座標1の位置に表示させよという意味です。
なぜ40かと言うと、すぐ手前で表示させたアイコン分の幅と少しの余白分を入れたものです。
これを1にすると宝箱アイコンと位置がかぶってしまいますからね。
アイコンの幅を変数で自動取得するという事も可能ですが、手動で数値を入れて色々いじってもらった方が感覚がつかみやすいと思いましたので、カットします。
this.resetTextColor();
16番の色で表示させていた配色を、デフォルトの色に戻す時に使います。これを入れればウィンドウの途中で変えていた色を元に戻せます。たとえば3行のテキストで、1行ごとに色が変わる場合は、this.resetTextColor()を2回書かなくてはいけません。
this.drawText($gameVariables.value(2) + " 個",0,this.lineHeight());
再び、drawTextが出て来ましたね。
これが今回の情報ウィンドウの肝です。
最初のdrawTextが1行目であれば、次のdrawTextは2行目。
2行目に $gameVariables.value(2)+「個」という文字列を、x座標0、y座標は1行分空けた位置に表示させよという意味です。
$gameVariables.value(2)は変数ID2番の値を取得するためのものです。
変数ID2には最初で説明しました、「宝箱の取得数」が格納されています。
宝箱の数値が入り、そのあとに「個」という文字が入る。
こうする事で1個とった時は「1個」と画面上に表示されるわけですね。
ちなみにこの$gameVariables.value(ID)の部分、
たとえば画面上に総プレイ時間を表示させたい場合は
$gameSystem.playtimeText()
と書きます。
まあ画面上に常に「こんなん書かれても」って感じではありますが、プレイ時間1時間経過ごとにイベントが発生するなど、何かには活用は出来るかも知れませんからね。
ちなみにダメージ計算式の回の時の式もそのまんま流用できます。
プレイ時間を秒数で出したい時は $gameSystem.playtime()
所持金を出したい時は $gameParty.gold()
戦闘回数を出したい時は $gameSystem.battleCount()
です。
あとは59行目以降です。
解説しなくても大体感覚で分かるとは思うのですが、一番最後だけ。
// ウィンドウの色調
Window_Info.prototype.updateTone = function() { this.setTone(64, 0, 128); }; |
this.setTone(64,0,128);
これは「ウィンドウの背景色調を赤64、緑0、蒼128の割合にせよ」という意味です。
この割合で塗ると上の様な紫色になるわけです。
「こんな派手な色にしなくても、普通のシステムの色でいい」という場合は、この4行分丸ごと不要です。がっつり消してください。
といったところで、かなり今回は駆け足気味での解説でしたが、如何だったでしょうか。
自信が無いと最初に書きましたのは、もっと他にやり方があるかも知れず、もっと手数を減らせるかも知れないからです。まだまだ勉強しないといけませんね。。
今回はマップ上に情報ウィンドウを表示させるという目的で書きましたが、もちろん応用すれば、
こんな風に、メニューの空いた部分に表示させることも出来ます。
Mapに表示する処理の部分を、Menu上に表示させる処理に移動させるだけです。
var _Scene_Menu_create = Scene_Menu.prototype.create;
Scene_Menu.prototype.create = function() { _Scene_Menu_create.call(this); this.createInfoWindow(); this._InfoWindow.y = this._commandWindow.height; } Scene_Menu.prototype.createInfoWindow = function() { this._InfoWindow = new Window_Info(); this.addWindow(this._InfoWindow); }; var _Scene_Menu_update = Scene_Menu.prototype.update; Scene_Menu.prototype.update = function() { _Scene_Menu_update.call(this); this._InfoWindow.setText(); }; function Window_Info() { (以下略〜あとは上述と同じです) |
大体似たような事をやっていますが、
this._InfoWindow.y = this._commandWindow.height;
ここで、コマンドウィンドウ分の高さの位置に、メニュー内情報ウィンドウのy座標を入れる事により、たとえコマンドウィンドウの項目がいくつに変更されたとしても対応出来る様にしています。
絵の描けるクリエイターさんが本当に多いんですよね。
私は絵が描けないので本当にうらやましいです。
タイトル画面、キャラグラフィック、モンスター・・。
自分で絵が描けたらきっと世界が変わるんだろうなって思います。
「オリジナルのゲームなんだから、せめて音楽の1曲ぐらいは自分で手掛けたい」と思ってシーケンサーを起ち上げてはみても、沢山ある無料素材屋さんの音楽を聴いている内に自分の作る曲のあまりの低クオリティぶりに辟易し、断念せざるを得なくなります。
pixivなどを眺めていると「この絵いいな」って思う事がありますが、やはり依頼するためのサイトではなくSNSという位置付けのため、お願いをしたくてもどういった形で声を掛けていいものか、口下手な私には難しいのが実状です。おまけにイラストの相場はキャラクターの立ち絵一枚でも10,000〜20,000円らしいので、フリーゲームとして配布するなら採算が取れず、結局諦めるしか無いのかな〜なんて考えていた日もあったものです。(通販番組風)。
そんな時、すごくぴったりなサイトを見つけました。
「coconala(ココナラ)」というマッチングサイトです。
実に多くのクリエイターさん達が「イラスト描きます」「音楽作ります」と募集しており、物凄くクオリティが高いのに「えっ、こんな安くていいの?」と思う募集もありました。中にはお試しで無料というものも・・。
絵が欲しい方は、右側の「カテゴリから探す」メニューから、似顔絵・イラストにカーソルを合わせ「アイコン作成」「キャラクター作成」「イラスト作成」など、用途に応じたものを選ぶといいでしょう。500〜5000円の募集が多いです。納期の早さにもびっくりです。製作中のゲームでは幾つか必要となる素材を色んなカテゴリからクリエイターさんにお願いしているのですが、皆さんとても親切で応じてくださいました。
絵が描けない、でも絵がどうしても欲しい、というジレンマを抱えているツクーラーさんにはぴったりのサイトです。逆に絵が描ける方は、お小遣い稼ぎ感覚で、ぜひ参加してみてはいかがでしょう。クリエイターとクライアント同士の出会いから、新しい作品のアイディアも生まれるかも知れませんね。但しトラブルにはお気をつけください。特に著作権など版権問題は多い様です。
ちなみにこのサイト、イラストや音楽以外にも、「翻訳」のカテゴリがものすごく助かります。
今まで会社ではランサーズというサイトを利用していたのですが法人やSOHOが多くて、個人的な依頼を気軽に出来なかったんです。
とても良いサイトを見つけました。
RPGツクールMVの移動速度について、最近感じた事なんですが、
どうも「ダッシュ」が速すぎる気がして・・。
広大なダンジョンでもすぐに辿り着いてしまうほど速いんですよね。
だからと言ってダンジョンだけダッシュ禁止にすると、今度は遅すぎる。
もっとちょうどいい、何かこう、中間の速さが欲しいんです。
もちろん感じ方は人それぞれなので、
「これがいいよ〜」って意見もあれば、
「ダッシュ確かに速いよね」
「いやダッシュむしろ遅いよ。もっとガッツリいきたいよ」
って意見もあると思います。
自分の好みで移動速度を調整出来れば便利ですよね。
で、何とか出来ないか気になって調べてみましたところ。
主人公の移動速度と、マップ上に配置された全てのキャラクターの移動速度を司っている処理を見つけまして。
rpg_object.js の 6335行目でした。
Game_CharacterBase.prototype.distancePerFrame = function() {
return Math.pow(2, this.realMoveSpeed()) / 256; }; |
distancePerFrame、つまりフレームレートごとの移動速度をセットするものです。
このMath.pow〜行の末尾の数値 256 の数値を大きくしていく事で、
標準の移動速度が遅くなっていき、逆に小さくしていく事で、標準の移動速度は速くなっていきます。
例えば256から300とかにすると、少しだけ緩やかな移動、緩やかなダッシュを実現出来ました。
一応プラグインは作りましたが・・、まあ、配布は希望がありましたらという事で。
他の部分への影響(イベント、負荷など)が未確認なので、ちょっと怖いというのもあります。
そのかわり簡単なチェック用のゲームをご用意いたしました。
下の「ブラウザでプレイする」をクリックし、
目の前にいる魔法使いに話しかけてください。
すると3桁の数字の入力を促されます。
上の256の数値を、入力した数値に置き換わる様にしています。
主人公の移動速度だけではなく、周りのキャラクター全員の移動速度に影響がありますので、「主人公が3倍の速さで動ける某キャラみたいなのを作りたいぜ!」という場合でも、周りの通行人まで3倍になってしまうのでご注意ください。
[ブラウザでプレイする]
(Google Chrome / Safari推奨)
330ぐらいがちょうどいいなと感じましたが、16の倍数になっていないと何となく落ち着かず(職業病?)
皆さんはいかがでしょうか? ぜひ一度お試しください。
RPGツクールMVで探索ゲームなどを作る時に、宝箱があって、中身もランダムだったりしたら楽しいですよね。
今回使うのは私の大好きな変数と乱数の組み合わせなので、ある意味プラグインを作ってしまった方が楽かも知れませんが、ここでは本体のイベント設定のみでの作り方を書きたいと思います。
多分もっと楽なやり方があるとは思いますが、私のやり方です。ご参考までに。
■宝箱に何を入れるかを決める
アイテム、お金、武器、防具、モンスター。ざっと思いつくものとしては大体この様な感じですね。今回ランダム宝箱を作るために[コモンイベント]に設定するのですが、種類+1 の数だけのコモンイベントを設定します。
つまり「アイテム」「お金」「武器」「防具」「モンスター」であれば5種類なので、コモンイベントは6個分作りますよという事です。
■コモンイベント001 宝箱をあけるイベントの設定
マップ上で右クリックすると、イベントの簡単作成で「宝箱」を作れますよね。
これ結構楽なので、とりあえずはこれで一個作ります。
ここに配置する宝箱の中身はお金0Gとか適当でいいです。使いませんし、あとで消します。
作ったイベントの中身をダブルクリックして見ます。
はい、この赤枠の中だけコピーしてください。セルフスイッチ以降は必要無しです。
ではコピーしたら、データベースの[コモンイベント]に移ります。
[コモンイベント]は上で宣言した通り6つ作りますので、6個分の空きを作って、1番上のイベントに「ランダム宝箱を開ける」と名前をつけ、実行内容に今コピーした内容をペーストします。
これでパカッて音とともにイベント上に配置された宝箱が開くまでをコモンイベント化できました。
普通ならこの実行内容の後には「(アイテム)を手に入れた!」というメッセージと、アイテムの増減処理が必要になりますよね。しかしそれは別のコモンイベントさんに任せましょう。
このコモンイベント上で設定するのは、「種類を決めるサイコロを振る」という作業。つまり宝箱の中に入っているのが「アイテムなのか」「武器なのか」それとも「モンスターなのか」のみを、とりあえずここで設定しましょうという事です。
移動ルートの設定後にイベントを追加します。
[変数の操作]を入れて、空いている変数に以下の様に1〜5の乱数を代入してください。
これは何をしているかというと、1〜5の5種類しか出目の無いサイコロを振って、1が出たらアイテム、2が出たらお金、3が出たら武器・・という出目を決めるためのものです。
乱数の処理が終わったら、順番が前後してしまいましたが左側のコモンイベント名を振っておきましょう。
アイテムを出す時のコモンイベント、お金を出す時のコモンイベント・・といった形で、種類別にコモンイベントを分けます。一緒でもいいのですが、この方が整理しやすいからです。
では引き続き「ランダム宝箱を開ける」方のコモンイベントの下にイベント設定します。
次は[条件分岐]を選んでください。
変数「中身の種類」が1だった時は「コモンイベントのランダム宝箱:アイテム」を実行
変数「中身の種類」が2だった時は「コモンイベントのランダム宝箱:お金」を実行・・
という感じで、処理を入れます。
1〜5までの条件分岐をセットし終わったら、いよいよ宝箱の中身の設定に移ります。
■宝箱の中身を設定する
あまり長くなってもあれなので、とりあえずはアイテムの中身のみここでは設定しましょうか。
コモンイベント「ランダム宝箱:アイテム」の欄を開き、1行目に「変数の操作」を入れます。
種類を決める時の変数IDを使い回してもいいのですが、
「獲得用変数」として別変数に乱数を入れることにしましょう。
アイテムの数と同じだけの乱数を最大値に入れます。
上の例の様に「1」〜「20」と入れた時は、宝箱に入っているアイテムの種類は全部で20個ありますよ、という事です。
ここまで来たらあとは条件分岐、先ほどの種類を決めた時の応用です。
「獲得用変数が1の時はポーション」「獲得用変数が2の時はマジックウォーター」という感じで、メッセージとともにアイテム入手処理を入れていきます。
それにしてもアイテムだけで20個分の条件分岐・・。
非常に面倒ですが、プラグイン無しでやろうと思うと大体こんな感じですね。
「武器」「防具」はこれと同様に設定。
「お金」は獲得用乱数で入れたいゴールドの最低金額と最高金額を入力。
「モンスター」の場合は戦闘開始処理を入れると良いでしょう。乱数をふって出現する敵を分岐させてもOKです。
しかしこのままだと「等確率」ですよね。
0.0001%の確率で手に入る超レア武器の設定はどうするんだ!?って思いますよね。
その場合は条件分岐の中で、さらに乱数をふって条件分岐を入れます。
つまり流れを分かりやすく書くと下の様な感じです。
(1) アイテムの種類を決める乱数1〜5をふる
(2) 2が出たので「種類は武器」
(3) 武器の種類を決める乱数1〜20をふる
(4) 2が出る
(5) レアものゲットチャンス! 乱数1〜16をふる
(6) 7が出ればレア武器ゴールデンソードを入手、それ以外ならロングソード
こんな感じですね。
1〜5の乱数と、1〜20の乱数に勝ち抜いて、さらに1〜16の乱数に勝ち抜かないと手に入らない貴重なアイテムです。確率にして・・1/5 × 1/20 × 1/16でしょうか。1600分の1?(算数苦手)
■宝箱を開けた後の処理
コモンイベントに全欄埋め尽くしたら、
最後に忘れてはいけないのが、宝箱の終了処理です。
これやり忘れると何度も同じ宝箱からアイテムが手に入ってしまいますからね。
マップ画面に戻り、配置したい箇所に宝箱を置き、
1ページ目のイベントに
・コモンイベント[ランダム宝箱を開ける]
・任意のスイッチをON
この2点を入力します。
2ページ目にはスイッチがONの時に実行内容は「空っぽだ」とでも書いておき、画像も空いたあとの宝箱のグラフィックに設定しましょう。
「ここセルフスイッチ使った方がいいんじゃない」って言われるかも知れないのですが、もちろんそれでも構いません。しかし、せっかくのランダムな宝箱システム。一回中身を手に入れてそれで終わり、っていうのはもったいないですよね。
フロアを切り替えたり、魔法陣を調べたり、特定の人との会話で、宝箱の中身を復活させるイベントを設定しましょう。
やり方は簡単。
そのイベント上で、全ての宝箱のスイッチをOFFにするだけです。
という感じです。
(ちなみに5000G減らす処理は自身で入れてください(笑)。)
いかがでしょうか、中身がランダム宝箱の作り方。
これは以前書いた記事「謎解き要素を作ろう!」と絡めれば、とても面白いダンジョンが作れると思います。設定はとても面倒ですが、ぜひチャレンジしてみてください!
戦闘のお話が結構多いブログになって来ましたので、今回は町やお城の話を。
町や村、城のマップを作ってみたはいいけど「町人には何を喋らせればいいの?」非常に悩み所ですよね。
「東の洞窟にはお宝があるぞ」とか「魔王が世界を闇に包もうしている」とかストーリー上必要な台詞を喋る人だけをとりあえず配置しようにも、それだけだと1マップに2〜3人だけになってしまいます。今回は、町などに配置するNPC(ノンプレイヤーキャラクター)を作るアイディアを幾つかご紹介していきたいと思います。
その前に・・。
普通はマップを作った後にNPCを新規作成で置いていくと思うのですが、
いきなり配置せず、下の様な形でまずは画面隅にまとめて作り、後から配置場所を決めるって人は居るでしょうか?
進行上で重要な事を喋っているキャラが1行目。
雑談など、差し障りの無い台詞を喋っているキャラが2行目。
それ以外(動物、本棚を調べると読める本など)が3行目としています。
こうしておけば突然全部のイベントに処理を加えなければいけない場合でもひとかたまりになっているので操作はしやすいですし、ちょっとした台詞の修正を行う際にも「えーと、あれはどのキャラが喋っていた台詞だったかな?」なんて手間がほぼ省けて楽だったりします。
ではNPCのアイディア集に入りたいと思います。
NPC作りに悩んでいる人は、こんなキャラクターを作ってみるのはどうだろう?
というアイディアを幾つか挙げてみました。
その1. さりげなくヒントを喋る汎用グラフィックのキャラクター
通常は重要な事を喋るキャラこそ、使い回しをしてはいけないというのがセオリーではあります。しかしここまで同じグラフィックがずらりと並んでいてその中の一人が何と突然重要な情報を喋り始めるのはびっくりしますよね。
プレイヤーによっては情報を信じず「実はこいつ嘘つきなんじゃないか?」とか「どうせこいつらは同じ事しか喋らないんだからスルーしよう」と話しかけないなんて事もあり得るでしょう。
しかし、こうする事で逆にアイディアが生まれるって思いません? この四人の使い回し兵の一人が実は昔魔王と戦った事のある三勇士の一人で、その戦いの古傷のせいで今は仕方無く一般兵をやっている、なんていう展開になればワクワクします。「ただの兵士がどうしてこんな事を知っているのか?」 プレイヤーに驚きと疑問を与えるという意味では、あえて使い回しキャラクターにこそ重要な台詞を喋らせてみるのも面白いでしょう。
その2. 黒幕の考えに同意するキャラクター
例えば「勇者が悪の魔王を倒し世界を救う」といった話は、世界の皆が勇者に賛同するストーリーなのが基本だと思います。しかしNPCとて人間である以上、それぞれ考えは異なるもの。たまには魔王に全面同意する一般人が居てもいいかも知れません。
特に、この様にお年寄りに喋らせると深みが増しますよね。小さな子供でも「魔王っていい奴って本当かな?」みたいな事を喋らせれば、そのせいで他の子供達からいじめられているとか、魔王は小さい子には優しいとか、どんどんアイディアが膨らんでくると思います。
その3. 主人公達のステータスに影響を及ぼすキャラクター
たとえばこんな感じで占い師の占い結果によっては、良い結果が出た時はステータスが上昇し、悪い結果が出た時はステータスが下落する。他にも裏庭に小屋を建てるお手伝いをしたら力が3上がるとか、町人との交流によりステータスに変化をつけることで、平凡な町でも強烈な印象を残します。
やり過ぎるとバランス調整は大変そうですし、今でこそ殆どこういったRPGを見かけなくなりましたが、昔のTRPGなんかだと割りとよくある事だったりするんですよね。
ストーリー主体のRPGにおいてはここに仲間キャラクターとの会話を絡めたりも出来て、ネタに困らず一石二鳥です。
その4. 仲間にはならないけどついてくるキャラクター
町や城の中のありふれた脇役だって活躍したい! 自分に力はなくても黒幕に対して一矢報いたいというキャラクターがいてもおかしくは無いものです。メインで仲間になるキャラクターとは違い、雑魚戦でも中ボス戦でもバシバシ戦いはしないけれど、ずっとついてきてくれて、黒幕戦で一撃二撃くわえてくれる、といったキャラクターです。
必須イベントで無い場合は、条件分岐のスイッチ等でこのキャラクターの居る居ないを判断すると良いでしょう。この例では「ピクチャの表示」を使ってボスの前に連れてきた兵士を配置しています。
この短い台詞のあと200〜300ぐらいダメージを与えてくれたのちに撤退するとか、そのままボスの攻撃にはじき飛ばされてこの場から居なくなるとか色々なストーリーが考えられますよね。
その5. いいものをくれる超レアなキャラクター
普段どこにも居ないのに、特定の条件下、あるいはランダムで現れる謎のキャラクターなんていかがでしょう。人間である必要はありません。50回森を訪れて1回は出会えるといった不思議な妖精や、時々墓地に現れる気前のいいお化けなんてのも良いでしょう。もちろん、話しかけるとレア装備やアイテムをくれるとテンションが上がりますよね。
この爺さんについては、例えばこういったイベントを組んでいます。
スイッチや変数、特定のキャラ、特定のアイテムを持っているかどうかなど、色んな要素を使って。確率が低すぎると出会える事が無いままエンディングを迎えてしまいますので、誰もが一度は出会える程度の確率を設定しておくと良いと思います。
いかがだったでしょうか?
ここではほんの一例をご紹介させていただきましたが、「必要な事を喋るNPC」「差し障りの無い事を喋るNPC」以外にも、いろんなキャラクターを登場させてRPGを演出し、ストーリーに華やぎを加えてみましょう!
※記事用サンプルを作成するため、今回もマップ素材は春巻空間様の素材を使用させていただきました。
ありがとうございます!
ツクール本体の「途中から出現」機能を使っても似た感じの事は出来るのですが、有限ならともかく無限に湧かせようとすると一手間も二手間もかかります。ましてや他の敵グループから呼んでくるなんていうのも不可能ですよね。
それを簡単に実装できるプラグインがありましたので、今回ご紹介させていただきます。
Enemy Reinforcements
http://himeworks.com/2015/11/enemy-reinforcements-mv/
作者:HimeWorks様
※このプラグインは単体で動作可能です。
プラグインのセット方法については割愛します。
まず[敵キャラ]の設定で、ボスと敵を作ります。
ステータスやメモ欄は特にこのプラグインを入れたからといって新規で追加する必要はありません。
続いて[敵グループ]の設定で、ボスの画面に見てください。
手下を呼び出すタイミングの条件を設定し、
プラグインコマンド
add_enemy_troop <敵グループID>
を入力します。
例では、敵グループリストの中から手下に設定したいコウモリは10番なので、
add_enemy_troop 10
にします。
条件は開幕呼び出して欲しいので「ターン0」、
スパンはバトルです。
これで、開幕に敵グループID10番に設定されたコウモリが出現します。
「途中から出現」コマンドは一切不要なので、画面も見やすくて便利です。
この後、手下のコウモリが二匹とも倒れた場合、
次のターンの始まりに再びボスが同じコウモリを呼び出したいとします。
条件「ターン 1*X」
スパン「ターン」をセットし、
バトルイベントの内容は「条件分岐」を設定します。
条件分岐の中の「スクリプト」をチェックし、
$gameTroop.isTroopReinforcementAdded(敵グループID, true)
と入力。「条件を満たさないときの分岐を作成」にもチェックを入れます。
上のバトルイベントの例では、ボスの台詞をいちいち入れていますが、
このスクリプトにより条件を満たしている時は、まだコウモリが生きている時。
条件を満たさないときはコウモリが全滅している時なので、
この「条件を満たさないとき」の方に、呼び出しのプラグインコマンド
add_enemy_troop <敵グループID>
を再び入力します。
これで無限に手下を呼び出すバトルイベントの完成というわけです。
「人vs人」のバトルを簡単に実装するために最適なプラグイン「Animated Enemies」のご紹介です。
Animated Enemies「animatedSVEnemies.js」
http://forums.rpgmakerweb.com/index.php?/topic/47991-animated-enemies/
作者:Rexal様
※バージョン1.15の方が安定して動作して動いている感があります。
※このプラグインは単体で動きます。BattleCoreEngine等、他のエンジン系プラグインを入れる必要が全く無いため、とても使いやすく愛用させていただいております。
サイドビュー用のバトルキャラ素材を、
モンスター側に配置して戦わせることが出来るプラグインです。
もちろん味方キャラ同様アニメーションしますので、キャラクター同士を戦わせるイベントバトルの時にはとても有用です。因縁の対決などに活用できますね。
■使い方■
(1) 上記サイトよりダウンロードしたプラグインanimatedSVEnemies.jsをjs/pluginフォルダに入れ、ONにします。
(2) 表示させたいキャラクターのバトルキャラ素材を、img/sv_actorsフォルダに入れます。
例では「TEST001.png」というファイル名にします。
(3) img/sv_enemiesフォルダを開き、適当なモンスター画像をコピーし、(2)と同じファイル名にします。例ではすぐ隣にあったゾンビのモンスター画像をコピーして、TEST001.pngに変更します。
(4) データベースから[敵キャラ]を開き、(3)で作成したファイルをモンスター画像に設定します。
(5) そのモンスターのメモ欄に [SV Animated] と入力してください。
(6) これでこのモンスターと戦闘を行うと、モンスターが、sv_actorsフォルダに入っている方のTEST001.pngに置き換わります。
プラグインパラメータ
Debug | F8キーで開くコンソールにログを残すためのモードです。 |
No Movement |
Trueにすると、キャラクターの場所が自動的に調整されます。上画像の様な位置で配置する場合は、Falseで設定しておくと良いでしょう。
|
Enemies Celebrate | Trueにすると、味方が全滅した時に、敵キャラが戦闘勝利時のモーションになります。 |
SV Enemies Collapse | Trueにすると、敵キャラを戦闘不能にさせた時に消滅させます。Falseの場合は、戦闘不能モーションのまま戦闘勝利のメッセージが表示されます。 |
Static Enemies Breathe | 同一画面上に普通のモンスターが配置されている時、Trueにするとモンスターの息遣いが表現されます。スライムがうにょうにょとゆっくり動く感じですね。 |
AGI Effects Breathing | 「Static Enemies Breathe」がTrueにの時、この項目をTrueにすると少し息遣いが早くなります。 |
Scale Statics by Distance | (詳細不明です。情報希望) |
Damage Slows Down Breathing | Trueにすると、敵がダメージを受けHPが少なくなった時に息遣いが止まります。(多分) |
敵キャラのメモ欄に入力可能なオプション
[SV Animated]
設定されたモンスター画像を、sv_actors内の同一ファイル名の素材のキャラに置き換えます。
[Collapse]
戦闘不能時にバトル画面から消滅させます。
[No Collapse]
戦闘不能時にバトル画面からは消滅させず、戦闘不能モーションを残したまま終了します。
SV Weapon: id
武器タイプを指定する事で、敵キャラが攻撃する時に武器を振ります。
例えば SV Weapon: 1 と書けば、剣を振ります。
IDの指定値がよく分かりませんが、デフォルトの環境では2が斧、3が杖、4が弓でした(?)。
私はJavascriptが苦手です。
というのは、他の言語に比べて動作とかエラーの出方が冷たくないですか。
HTMLだと「あ〜、ここはこう書いても通るんだ?」って優しさがありますし、PHPだと「あ〜、なるほどこれが原因か。じゃあこう書き直せば動くね」って親切さが感じられるんですが、Javascriptは少しでも隙があると突然「バンッ!」といきなり扉を閉められて放り出される様なあの感覚がするんですよね。分かる人いません?
閑話休題、今回はプラグイン作りをやりますね。
私はRPGツクールMVどころかツクール自体ほぼ初めてなので、いわば素人です。
そんな私の手順です。
■必要なものは何か?
◎パソコン
(WindowsでもMacでもOKです)
◎テキストファイルを読み書き出来るソフト
(メモ帳でもEMEditorでもTeraPadでも構いません。プラグインを編集出来るエディタをご用意ください)
◎RPGツクールMVで作成したプロジェクト
■プラグインで「何を作りたいのか?」
プラグインとはRPGツクールMVエンジンのゲームの動作を変更したり、追加したり、削除したりするためのものです。何を変更したいのか、何を追加したいのかetcが自分自身で分かっていないと作り様がありません。
そうですね、私自身も出来ることには限界がありますし、あまり記事が長くなり過ぎるのもあれなので、簡単な例で「戦闘のクリティカルヒット時の演出を派手にする」なんてどうでしょうか。
デフォルトの戦闘でクリティカルヒットが発生した時、通常ヒットの「バン!」が「バンッ!」ってなるだけでかなり地味で、もっと「ズバシィィズドドドーン!」みたいな感じにしたいって作者さんも多いはず。
というわけで今回は「クリティカルヒット時に任意のアニメーションを流す」プラグインを作りたいと思います。
■どのファイルを参照するのか?
上にも書いた通り、プラグインとはツクールの本体の動作を変更するためのものです。
変更ということは当然「今の動作プログラムを書き換えなければいけない」ということです。
RPGツクールMVの動作プログラム(正確には書き換えが許されている部分)は、各プロジェクトフォルダの js というフォルダに入っている、次の6つのJavascriptで成り立っています。
rpg_core.js
rpg_managers.js
rpg_scenes.js
rpg_sprites.js
rpg_windows.js
rpg_object.js
(libsフォルダとmain.jsとplugins.jsはひとまず無視して下さい)
どうして6つもあるかと言うと、それぞれのファイルで役割が分けられているからです。
RPGツクールMVという名の会社に部署が5つあると思ってください。
それぞれざっくりと説明しますと、
rpg_core.js すべてを取り決める社長率いる総務部
rpg_manager.js 音楽や画像などの配置、各社員の役割を管理する人事部
rpg_scenes.js 「こういう時はこうする」「そういう時はこうする」と考え指示する脚本担当
rpg_sprites.js キャラクターやモンスターの形・色・位置・動き・エフェクトなどを決める演出担当
rpg_windows.js メニューやウィンドウ画面などの位置・大きさ・載せる内容などを決める書記担当
rpg_object.js 全ての部署が共通で使えるお道具箱
こんな感じです。どうも例えが下手ですね。
厳密に言えばかなり違うと思いますが、あくまで私の中のイメージをざっくりと書くとこうなります。
ここで本来の目的に戻りまして、
「クリティカルヒット時にアニメーションを流す」という事は、上のどのファイルが一番関連していそうか、アタリをつけます。社長は関係無いですし、人事部の出番も無し。メニューやウィンドウ画面にも関係無し。もしメニュー関係を変更したいならrpg_windows.jsを開けばいいわけです。
・・そうですね、エフェクト絡みということで、rpg_sprites.jsが一番関係ありそうです。
というわけでjsフォルダから rpg_sprites.js を、用意したエディタで開いてみてください。
無数の英単語が並んでいて、一瞬パニックになりますよね。
が、RPG慣れしている人は「バトル」とか「ダメージ」とか「アイテム」とか、結構英語に触れる機会が多いですよね。だからよく見ると恐れる事はありません。そもそも今回作る予定の「クリティカル」だって英語じゃないですか。
「クリティカル 英語」でgoogle検索すると、スペルは「critical」であることが分かります。
ではテキストエディタの「検索」機能を開いてください。
検索機能は、そのrpg_sprites.jsから、入力したキーワードを探し出して、その場所まで連れて行ってくれる便利なものです。
メモ帳ならメニューの「編集」>「検索」>検索する文字列に「critical」と入力してください。
検索に critical と入力し終わったら
「下を検索(もしくは次を検索)」をクリックします。
すると一気に1500行目まで飛びました。
1500行目までは criticalという単語が一切登場しないということです。
さて結果は・・
この部分だけ落ち着いてよ〜く見てください。
if
result.critical
setupCriticalEffect();
ifは「もしも」
resultは「結果」
setup Critical Effectは「クリティカルヒットの演出を出す」
「もしもクリティカルだったら、クリティカルヒットの演出を出す」
いきなりビンゴですね。
どうやらこの1500〜1502行目こそが、
クリティカルヒットのあの地味な「バンッ!」っていう演出を出すためのものに間違い無い!
そしてよーく見ると、そのすぐ下の行に
「そのクリティカルヒットの地味な演出はこれだよ」って、まさに書いてあるじゃないですか。
_flashColor = [255,0,0,160]
フラッシュの色がRed=255,Green=0,Blue=0,Gray=160
_flashDuration = 60
フラッシュの時間が60
Durationだけは少し難しいですが、flashはフラッシュ(光らせる)、Colorは色。簡単な英単語なので予測がつきます。つまりクリティカルの色を青くしたいなら[0,0,255,160]とか数字だけいじくればいいわけですし、長く光らせたいならフラッシュの時間をこれもまた数字だけ大きくすればいいと分かります。
しかし、違いますよね。この記事の目的は。
クリティカルのフラッシュ色や時間を変更することではありません。
アニメーションを流すプラグインを、作ることです。
■プラグインファイルを作成しよう
さあ、これでどこを書き換えればいいか、その場所は分かりました。
このままこの部分に「アニメーションを流せ」という命令を挟んでももちろん動作はしますが、プラグインを作る企画なので独自ファイルを作ってそれを実現しましょう。rpg_sprites.jsウィンドウを開いたまま、エディタの「ファイル」メニューから「新規」作成を選んで、何も書かれていない真っ白な画面を出してください。
一番最初に書きました通り、プラグインを作るにはJavascriptという言語を使います。
ひとまずは、このプラグインの名前を決めましょう。
Javascriptを始め色んな言語のルールとして、
//
この半角スラッシュ2個はコメントアウト、
分かりやすく言えば「最初に // が書かれている行には、何でも好き勝手に書けるメモを作れるよ」という意味です。
「//」この続きは何書いても構いませんが、
// CriticalAnimation |
ひとまずこういう感じでこれから作るプラグインのタイトルを振っておきましょうか。
この後にいきなり構文を書いてもいいのですが、RPGツクールMV本体の「プラグイン管理」を開いてプラグインを追加する時、プラグイン名と概要と作者名が出てきてON・OFFしますよね。
「概要」「作者名」を、その下に書きましょうか。
// CriticalAnimation
/*: @plugindesc クリティカルヒット時にアニメーションを流すプラグイン @author わたし */ |
こんな感じです。
これはツクールMVのルールなのですが、
/*: のあとに、
@plugindesc 概要と、
@author 作者名それぞれ記載し、
*/ で閉じなければなりません。
別に空欄でも動きますがプラグインを追加する際に分かりにくいので、第三者に配布するなら必ず入れる様にしてください。
ちなみに長い解説を入れたい場合は
@help のあとに解説を入力することでこのプラグインの「ヘルプ」ボタンをクリックした時に表示されます。
続いて、次は必ず入れる必要がある構文です。
「今まではご挨拶。ここから先はプログラムですよ〜」と宣言するためのものです。
この宣言を入れないと、プログラムが始まってくれません。
それからここからはすべて半角英数字モードで入力してください。全角でスペースが入力されていたりすると、エラーを起こして動作してくれません。
(function() {
})(); |
「ん・・!? もう分からんぞ!?」
と思う方も少なからず居ると思います。これは覚えるというよりは、丸写しでいいと思います。私も自分で新しいプラグイン作る時はコピペしてますから。
(function() {
})();
開きカッコの数と、閉じカッコの数は同一です。
どちらかが一個でも多かったり少なかったりすると、動かなくなります。
この2つの行 (function() { と })(); の間に、
開かれているrpg_sprites.jsから、さっきの行をコピー&ペーストしてください。
場所は、最初のcriticalが書き込まれている前後の一連の箇所、1493行目〜1504行目までです。
大体こういった場合では、一段左端にくっついている部分から左端にくっついてる行までをまとめてコピペすればいいです。
ちょっと長いですが、よいしょっ!!
(function() {
Sprite_Damage.prototype.setup = function(target) { var result = target.result(); if (result.missed || result.evaded) { this.createMiss(); } else if (result.hpAffected) { this.createDigits(0, result.hpDamage); } else if (target.isAlive() && result.mpDamage !== 0) { this.createDigits(2, result.mpDamage); } if (result.critical) { this.setupCriticalEffect(); } }; })(); |
こんな感じになりましたか? なっていますか?
それでは一旦ここでファイルを保存してください。
あ、rpg_sprites.jsのウィンドウは閉じていただいて構いません。
保存場所は、作ろうとしているゲームのプロジェクトフォルダのjs/pluginフォルダ内を指定します。
ここで気をつける必要があるのは、
日本語を含むファイルの場合、エンコードは必ず「UTF-8」を選択する必要があるということです。他の文字コードだと文字化けします。「待って、エンコードって何?」と思う方はgoogleで検索してみて下さい(投げます)。
UTF-8には2種類ありますが、BOM有りだと余計なものがくっつくので、BOM無しを選択し、保存します。
この時点でツクールMVのプラグイン管理を確認してみると、
ばっちり、出ましたね。
プラグインの基本はここまでです。
いよいよアニメーションを再生する処理を入れていきます。
先ほどのこのCriticalAnimationのファイル、
(function() {
Sprite_Damage.prototype.setup = function(target) { var result = target.result(); if (result.missed || result.evaded) { this.createMiss(); } else if (result.hpAffected) { this.createDigits(0, result.hpDamage); } else if (target.isAlive() && result.mpDamage !== 0) { this.createDigits(2, result.mpDamage); } if (result.critical) { this.setupCriticalEffect(); } }; })(); |
さて、どこに「アニメーションを再生する処理」入力すればいいでしょうか?
if (result.critical) { から 最初の } で終わる行までが
「クリティカルが出た時の処理だよ」って意味なので、
その間に挟み込むのが正解ですね。
(function() {
Sprite_Damage.prototype.setup = function(target) { var result = target.result(); if (result.missed || result.evaded) { this.createMiss(); } else if (result.hpAffected) { this.createDigits(0, result.hpDamage); } else if (target.isAlive() && result.mpDamage !== 0) { this.createDigits(2, result.mpDamage); } if (result.critical) { <正解はここです this.setupCriticalEffect(); } }; })(); |
if (result.critical) もしも攻撃の結果がクリティカルだったら〜、という仮定式の中に入れないと、意味がありませんね。ちなみにミスをした時の処理を派手にしたい場合は、ちょっと上にある if (result.missed) の中に入れればいいのは分かりますよね。
ではここに次の行を入れましょう。
if (result.critical) {
target.startAnimation(37, false, 0); this.setupCriticalEffect(); } |
ターゲットに対してアニメーション37番目を再生してください、って意味です。
この1行はどこから引っ張り出して来たかというと、
まあこれは色々頑張って検索した結果です(説明すると長くなるので…)。
さあこれを保存して、戦闘テストです。
どうなるかと言うと、
デフォルトで37番はアニメーション「咆哮」なので、非常に画面がうるさくなりましたね。
これで終わってしまうとただ「クリティカルヒットをうるさくするためのプラグイン」でしかありません。それにプラグインを使う人にJavascriptの中身を開いて出したいアニメーションIDに書き換えろというのも乱暴の話ですから、このCriticalAnimation.jsにもう数行だけ追加します。
プラグインを使う人が、本体>プラグイン管理のパラメータ欄からアニメーションIDを任意で設定するための変数の用意です。
よく見るこういうやつですね。
最初の作者情報欄のすぐ下に
@param 変数名(半角英数字)
@desc 概要(説明)
@default 初期値(半角数字)
という容量で入力します。変数名は何でも構いませんが、分かりやすくこうしましょう。
/*:
@plugindesc クリティカルヒット時にアニメーションを流すプラグイン @author わたし @param AnimationID @desc クリティカルヒット時に流すアニメーションのIDです。 @default 0 */ |
(function() { 以下にも数行加えます。
(function() {
var parameters = PluginManager.parameters('CriticalAnimation'); var AnimationID = Number(parameters['AnimationID']); |
これは
「parametersという部屋の中にこのプラグインのパラメータが入りますよ」という定義と、
「そのparametersの部屋にはAnimationIDという箱があり、数値が入りますよ」という定義です。
面倒ですが、Javascriptには必要です。
(PHPだと一応警告は出ますが無くても動くことは動くんですよねこれ)
数字以外の文字も入る場合はNumberをStringに変えます。
後半駆け足で来ましたが、次でラストです。
if (result.critical) {
if (AnimationID != 0) { target.startAnimation(AnimationID, false, 0); } this.setupCriticalEffect(); } |
AnimationIDが0の場合、つまりアニメーションIDをプラグイン側で設定しない場合は、アニメーションを流しませんという意味の条件式を加えます。
そして先ほど37番「咆哮」のアニメーションが流れていたのは、target.startAnimationに37が指定されていたためなので、37の場所をAnimationIDに変えます。
これでプラグインのAnimationIDパラメータに入れた数値が、そのままこの場所に置き換えられます。
やってみましょう。
76番のアニメーション「雷/単体1」を設定してみましょうか。
戦闘開始。
その時 牛に電流走るっ・・!!!
某麻雀マンガの様になりましたが、うまく行きました。
簡単なプラグインの作り方でしたが、いかがだったでしょうか。
今回の記事作成したプラグインについては、少しだけいじってこちらに置いておきます。
これを書き換えたりして色々自由に試していただいても構いません。
是非プラグイン作りの参考にしてみてください。
[CriticalAnimation.jsのダウンロード]
カテゴリを沢山用意してあるのに何故か増え続けていく「戦闘」カテゴリの記事・・。
マップ作りは講座出来るほど得意でもなくむしろ苦手で、公開予定作品についてもお見せ出来る進捗が無いので、自然と戦闘系の話が多くなってしまうわけです。
あまり戦闘方面に偏り過ぎても飽き飽きさせてしまうので、今回は戦闘外のお話。
今ちょうど製作中のRPGにて謎解き要素を作っている最中なので、ダンジョンの謎解きについてのコラムなんていかがでしょう。
RPGにおける謎解き要素は、
・岩を動かして道を開く
・壁のスイッチを決められた順番で押して行けば隠れた階段が現れる
・4つの像の向きを中央に向けると、宝箱が出現する
・石版に刻まれた文字を読み取って、その通りにギミックを解いていく
こういった感じのものが有名ですね。
しかし仕掛けや謎解きなんてものは、ぶっちゃけると面倒ですよね。
脱出系ゲームの様なパズル要素自体を主軸に置くものならいざ知れず、「早く話を進めたいのに何であっちこっち岩を押して回んなきゃなんないわけよ?」って思うのが大多数の本音だと思います。「そんな事無いよ!」って言われるかも知れませんが、本心は絶対そのはずです(断言)。
ちなみに個人的にはRPGにおいてヒントも無く理不尽に即ゲームオーバーとなるギミックは御法度と考えており、もちろんそれを売りにしたRPGはそれはそれで楽しめますが、シリアスな作品では避けた方が良いでしょう。
というわけでギミックの一例紹介を記事にする前に、今回の「下準備編」では、「人が謎解き要素を面倒に感じる理由」を出来るだけ取り払う所から始めてみよう、という記事を書きたいと思います。
たとえば、ダンジョンに入っていきなりこんな光景が目に飛び込んで来たとしますよね。
「うわ、めんどくさっ・・」
って、思いませんでした??
でもこれはさすがにちょっとやり過ぎましたね。
とりあえずルバンシュさんに仕掛けをぶった斬ってもらって、
これぐらいでいかがでしょうか。
この時、進行方向に氷の岩があって進めなくなっていますよね。
しかし手前に怪しげな青い光があるので、
「もしかしてこれを踏めば岩は消えるんじゃないか?」
とプレイヤーが簡単に予測出来ます。
さりげない事ですが、謎解きの要素のあるダンジョンの入り口すぐの所に「すぐに解ける仕掛け」を用意することが大切なんです。いきなり最初の画像の様な状況ならそりゃ〜うんざりしますし謎解きが面倒だと感じて投げ出す要素にもなり得ますよ。
そしてちょっと回りくどくはなるかも知れませんが、
ストーリー主体のRPGを作る場合、こういうギミックをストーリーに生かさない手は無いでしょう。
黙々と謎解きをするだけでは盛り上がりに欠けます。
ちょくちょくこういう会話を入れる事で、キャラクターの魅力や個性を出す事が出来ます。
ではこの難攻不落のダンジョンをもう少し奥に進めてみましょう。
また氷の岩でふさがれている場所がありますが、岩の先には宝箱があるだけで、明らかに手前の通路から先に進めそうですよね。おそらくあの青い光を踏めば宝箱の手前の岩が消えるのだと思いますが、そこに行くのもちょっと遠回りで、2〜3回は戦闘を余儀なくされるかも知れない・・。
つまりここでプレイヤーに選択を迫るわけです。
「遠回りをして宝箱を取るか」
「宝箱を諦めて先に進むか」
この例の距離なら大体の人は宝箱を取ると思いますが、さっさとゲームを進めたい人は軽〜く宝箱を無視して通路を進みます。どちらのプレイヤーにとっても比較的ストリスフリーな要素になっていると言えます。
ちなみにこの手の宝箱には絶対役立つ物を入れておきましょう。
これ中身が1Gとかミミックとかだったら大多数のプレイヤーはウィンドウの閉じるボタンをクリックしますよ(私情)。
さあどんどん先に進んでいきます。
今度は緑の岩なんてものが登場してきました。
しかしよく見ると手前に氷の岩。
そしてその岩にはばまれた緑の光。
「ははぁ、分かったぞ。
まず青い光を踏んで氷を消して、その先の緑の光を踏んで、緑の岩も消す
って寸法だな」
わざと簡単な例を挙げているので誰にでも分かると思いますが、氷の岩の仕掛けの応用です。
こういった応用編をフロアの中盤に用意しておくと、プレイヤーの頭脳も温まってきている頃合いなので、それほど面倒だと感じさせずに仕掛けを解いていくのでは無いでしょうか。
この程度の謎解きなら不要かも知れませんが、後半で難易度を上げる場合は是非下の画像の様なシーンを挟んでみてください。私自身、RPGにおいて登場人物同士の会話というのが大好きなので。
こういうヒント的なものはぜひ仲間キャラクターに喋ってもらいたいですね。突然神の視点のウィンドウが開いて「ヒント:岩と同じ色の光を踏め」なんてものが出てきたら、こういったストーリーもののRPGではやや興ざめしてしまいます。
それにしてもイリアムさん「緑い岩」ってなんですか、そんな日本語ありませんよ。
さあ謎解きもそろそろおしまいです。
静止画像なので分かりませんが、三つの光が縦横無尽に動き回っています。
先には階段があるので、青と緑の光を踏めば進めることはここまで来たプレイヤーなら分かりますよね。
そこで今までには登場しなかった赤の光というものを配置して不安要素を与えてみます。
見た所赤い岩は周囲にありません。ということは・・?
踏むと戦闘になったり、踏むとダンジョンの最初に戻されたり、もしかすると全滅なんてことも・・? と、赤の光はやや不安を与える色であり、絶対いい事が起きないのは明白ですよね。さてさて・・。
というわけで「謎解き要素を作る下準備編」、いかがだったでしょうか。
謎解きを作るにもいきなり仕掛けだらけのダンジョンにドカンと突っ込むのではなくて、最初は優しく、最後はやや難しめに、時にストーリーを絡めながら、時にキャラクターからのヒントを織り交ぜながら、「謎解きを楽しめる」要素を含めることが大切だと思います。
ダンジョン内にギミックを配置する方は、是非ご参考までに。
(なんて偉そうなこと言ってますが、ナイトオブシンデレラは結構ノーヒントですし説得力がありません。あくまで参考意見ということで・・)
敵に与えるダメージ量や、味方をHPの回復量などを設定する時、[計算式]という欄にその計算式を入れますよね。
上の画像はツクールMVでプロジェクトを作成した時、スキルの通常攻撃欄を見ると、a.atk * 4 - b.def * 2という数値が既に入れられています。このとき計算式欄上にマウスカーソルを置くと、こんな表示が出て来ます。
つまり、a.atk * 4 - b.def * 2は
「使用者の攻撃力の4倍」−「対象者の防御力の2倍」という意味なので、
プレイヤーの攻撃力が70で、敵の防御力が40の場合は、200前後のダメージになる事が分かりますよね。
この計算式に使用可能なステータス一覧は本体ヘルプにも書かれている事なので、
「そっかぁ、これだけでダメージ計算を組む事しか出来ない感じか〜」
と不満を募らせる作者さんも多いのでは無いでしょうか。
しかし! これだけではありません。
この計算式欄にはもっともっと色んな値を入れることが出来ます。
その一例を紹介していきたいと思います。
Math.max((a.atk * 4 - b.def * 2),a.luk)
敵の防御力が高くて通常攻撃が通らない相手でも、a.luk つまり攻撃する者の「運」が最小保証ダメージになります。パーティーレベルが高すぎて雑魚敵からのダメージが0になってしまうのを避けるために、敵側の通常攻撃にこの数値を入れたりしました。
Math.floor(Math.random () * 5) + 1
1〜6までの数値の中からランダムで数字を算出し、ダメージを与えます。
ダイスを振る様な特技にはもってこいの計算式です。
1〜200までの数値の中からランダムでダメージを与えたい場合は、Math.floor(Math.random()*199)+1とします。
if ( b.level%5 == 0 ) {9999} else {0}
条件式だって組み込めちゃいます。
レベル5の倍数のキャラには9999を与え、それ以外はノーダメージという、FFにおける「レベル5デス」的な計算式です。
$gameParty.steps()
なんと敵味方のステータスとは全く無関係なパーティーの歩数を計算式に入れることも出来ます。
画像は6歩歩いて戦闘開始した状態で特技を使用。
参考までにFF6にも「歩数ダメージ」という面白い青魔法がありましたが、その計算式は歩数÷32、消費MPはプレイ時間×2でした
$gameParty.gold()
パーティーの所持金です。
画像は1200G所持した状態で特技を使用。
「銭投げ」の様なものが作れます。
(所持金を減らすには計算式を調整しコモンイベントを併用するといいでしょう)
$gameTroop.turnCount()
現在の戦闘ターン数です。
画像は4ターン経過した状態で特技を使用
ターンをかければかけるほど強くなったり、弱くなったりする特技なんていかがでしょうか。
$gameSystem.battleCount()
パーティーの戦闘回数
$gameSystem.winCount()
パーティーの戦闘勝利回数
$gameSystem.escapeCount()
パーティーの戦闘逃走回数
この辺りは長編RPGではかなり使えるかも知れませんね。
FFでも(FFばかり例に挙げてますが)逃げれば逃げるほど攻撃力が強くなるチキンナイフという武器がありました。この式を入力しておく事でそういったスキルが簡単に実装出来ます。
もちろんこれらの式にも計算を組み入れる事が可能。
例えば戦闘回数を2分の1したダメージを与えるには、
$gameSystem.battleCount() / 2
戦闘勝利回数から逃走回数を引いたダメージを与えるには、
$gameSystem.battleCount() - $gameSystem.escapeCount()
を入力欄に書き入れる感じですね。
他にもまだまだ。
$gameSystem.playtime()
プレイ時間
$gameTimer.seconds()
タイマーの残り秒数
$gameSystem.saveCount()
セーブ回数
セーブをすればするほど弱くなってしまうスキルとか、タイマーの残り時間が減ってピンチになるほど強くなる一発逆転スキルとか、いろいろ遊び心があって楽しいでしょう。取得出来る数値はまだまだ沢山ありますので、是非面白いダメージ計算式を作ってみてください。
2016/03/09 12:09追記
書き忘れました。
正確な数値を得るためには計算式入力欄すぐ下の「分散度」を0%にしてください。これを忘れていると「(現在HP-1)のダメージを与える魔法!」を作ったはずなのに一撃で死亡してしまう事もよくあります(笑)。