RPGツクールMVでプラグインなしのカードめくり!1.2. あなたのゲームをホラーゲームに変えられます!ホラーゲームにおすすめのRPGツクー ...ゲーム開発者・ブロガー【略歴】ゲーム制作歴10年▶︎別名義と合計18作公開・26万プレイ・5回以上受賞達成▶︎コンテンツ配信者のためのお役立ちブログ運営1年目▶︎月間3万PV・収益5桁達成◆ツクール・UE・SEO・CG・イラスト・演出・文章・バッドエンドが好き◆経営学部卒(IT/マーケ/知財)・フリーに挑戦中の20代◆代表作『Efframai II エフレメイ2』『Myosotis ミオソティス』『消えたあの時の叫び』「操作シーン」が0のときメニュー(コモンイベント)を読み込む。RPGツクールMVのRTPを探している方へ。おまけとして次のことも紹介。①RPG ...座標の変化を簡単に比較するために、1つの変数にプレイヤーの座標情報を入れる。(X座標×1000+Y座標)これからゲームを作る方は、ぜひこの記事のコモンイベントを記述してみてくださいね。RPGツクールMVのスクリプトは活用していますか?スクリプトを活用すると制作効率 ...RPGツクールで作れるのは2Dだけという常識が覆ります。RPGツクールMVで3D ...なお、今回は「選択肢の表示」で自作メニュー画面を実装しました。今回は通常時に「メニュー(コモンイベント)」を読み込むように設定しました。イベントに入ったら、こちらのコモンイベントを呼び出すことで、何度も同じ記述を書く手間がなくなります。一気に書いてもよくわからないと思いますので、順番に説明していきます。また、さらに応用として「その他値の増減」の下に記述を追加をすることで、「時間が経つとアイテムが1つ増えるイベント」等も実装できます。イベントが終わったら、こちらのコモンイベントを呼び出すことで、何度も同じ記述を書く手間がなくなります。「RPGツクールMVで作ったゲームが重い」と悩んでいませんか?RPGツクールMV ...RPGツクールMVの歯車マークをクリックして[データベース]-[コモンイベント]で記述できるイベントです。 関数には必ずその実行を指示する(「呼び出す」と言う)別の関数(コモンイベント)が存在します。呼び出し側のコモンイベントでは、まず関数の仕様に従って必要な設定を変数に入れ、「コモンイベント」コマンドを実行してから、関数の仕様に従って変数から値を取り出します。具体的な処理内容は実際のコモンイベントを見ながら説明していきますが、その前に次の内容について説明しておきます。「揺れによる変位」はX方向とY方向それぞれの振動の合成による指示点の位置ずれです。これは指示点の移動とは独立した運動であるため、指示点の現在位置からの相対座標になります。ここではX方向とY方向の設定値を変数に入れるだけで、実際の計算は別のコモンイベントで行います。「走査」というのはプログラミング用語で、たくさんあるものをひとつひとつ調べることを言います。英語のスキャン(scan)に対応する言葉だというとわかりやすいでしょうか(むしろわかりにくい?)。コモンイベントの前半部分では、周期から角速度を計算して、それに従って位相をずらしています。設定値との兼ね合いや扱いやすさから、この時点では度数法を使っています。「表示の中心座標」は、指示点を含めたダウジング表示全体の中心となる座標です。この値は設定として与えられる固定値であり、唯一の絶対座標です。他の座標はすべて、この座標からの相対座標か、あるいはさらにそれの相対座標です。ダウジング中に毎フレーム実行される処理です。「ダウジング中」スイッチが有効な間、動き続けます。タイル走査の目的は最も近くにあるアイテムをみつけることです。そのためにはそれまでに発見した最も近いアイテムまでの距離を記憶しておき、その距離と新しく発見したアイテムまでの距離を比較します。新しいアイテムまでの距離の方が短ければ、それをその時点での最有力候補として記憶しておきます。すべてのタイルを調べ終えた時点での最有力候補が最も近いアイテムです。前者について、最初のアイテムはもちろんその時点での最有力候補にすればいいのですが、問題はそれが最初のアイテムであるとどうやって判断するかです。適当な変数にそれまでの発見数を記憶しておいてもいいのですが、ここでは「それまでに発見した最も近いアイテムまでの距離」を大きな値で初期化することで解決します。なぜなら、この値が十分に大きければ最初のアイテムまでの距離は必ずそれより短いため、特別扱いしなくても最有力候補になるからです。【xとyの演算結果のn倍】を、【xのn倍】と【yのn倍】と【n】による演算で表現できました。割り算で計算順序を入れ替えていることに注意してください。割り算をするとその時点で小数点以下が切り捨てられてしまうため、先にn倍してから割った方が誤差が少なくなります。また、この方法によって自動的に後者の問題も解決します。もし、すべて調べ終えても「それまでに発見した最も近いアイテムまでの距離」が有効距離内にないのなら、それは発見できなかったことに他ならないからです。初期化に使う「大きな値」は有効距離より大きければ何でもいいのですが、ここでは有効距離より1大きい数にしています。最後に自分でネタ振っといて投げっぱなしなのもなんなので、一言。RPGツクールはシンプルな使い勝手にもかかわらず、使い方次第で多彩なゲーム表現を可能とするツールです。今回はそんなRPGツクールにて、隠されたアイテムを発見するダウジング機能を実装してみたいと思います。今回のダウジング機能の仕様には、指示点の表示位置を決めるための座標がいくつかあります。ただし、この方法には考慮すべき事項が二つあります。ひとつは一番最初に発見したアイテムをどう扱うか、もうひとつはアイテムをひとつも発見できなかった場合にどうするか、です。微分やら階乗やら無限級数やらで複雑なので、マクローリン展開の詳しい説明はここではしません。他所の解説を参照してください。ここで重要なのは三角関数を多項式で表すことができるという点のみです。これでコモンイベントで関数を表すことができました。……とはいっても、言葉の説明だけではなかなか理解しづらいかもしれません。実際のコモンイベントの実装をみてみると理解しやすいと思うので、意識しながら読んでみてください。特に「揺れの更新」あたりの実装は説明したことがそのまま反映されているのでわかりやすいと思います。「指示点の目標位置」と「指示点の現在位置」は、ダウジング表示上のどのあたりに指示点を表示するかです。これらはともに中心座標からの相対座標になります。目標位置はプレイヤーからアイテムに向かう方角上かつ円周上の点で、指示点の現在位置は毎フレームこの点に向かって、設定された最大速度を超えないように移動します。一般にプログラマというと、特殊技能に精通した人というイメージが強いかもしれませんが、実は「いかに文章(プログラム)をきれいにわかりやすく書くか」ということを真面目に考えている人たちだったりします。正直、化学者や生物学者なんかよりは論説とかの物書きの方が近いんじゃないかと思ったり……。そこで、「小数をどう表現しようか」「三角関数をどうやって計算しようか」というのが、この記事のプログラマ的見せ場となっております。順に説明していきます。仕組みについてはプログラマ以外にも配慮して解説はしますが、プログラミング未経験者には結構難しいと思います。どれくらい難しいかというと、プログラミング言語を覚えてプラグインとして同じものをつくる方が簡単かもしれないくらい難しいです。逆に、この記事をすべて理解できたならプラグイン開発を始めてみるといいかもしれません。処理の大部分は移動速度が設定された最大値を超えていないかのチェックです。目標位置に一瞬で移動した場合の移動距離(ユークリッド距離)を、三平方の定理(ピタゴラスの定理)で算出したいのですが、平方根を計算する術がありません。そこで発想を変えて、最大値の方を二乗することで二乗した値同士の比較でチェックします。正の数の大小関係は値を二乗しても変わらないため、これで問題ありません。元々プラグインをつくれない人たちに向けたパフォーマンスだったはずなんですが、途中からもはや誰向けなのかよくわからなくなってますね……。ただまぁ、プログラミングというのがそれなりに手間と技術が必要な作業だと感じてもらえればいいなと思います。ココナラのリクエストボードなんかみてると、プログラムに対する一般の人の料金感覚と実際の相場が10倍から100倍くらい違うみたいなので……。では、コモンイベントで関数をどう表現するかについて考えてみましょう。関数は入力・処理・出力の三要素から成るのでした。このうち処理はイベントコマンドを羅列するだけなので特別な機構は要りません。入力や出力には「指定位置の情報取得」でも使っていたように変数を使います。ただし、どの変数を使うかは決め打ちです。「このコモンイベントの実行前には必ずこの変数とこの変数に値を設定してね」「このコモンイベントの実行後はこの変数に結果が入ってるよ」とあらかじめ決めておくことでコモンイベントの入力と出力を表現します。0に近い値というのがどれくらいまでなのかは許容できる誤差の大きさによりますが、今回は絶対値が1以下の範囲くらいまでとして使っています。これはそれなりに誤差が大きく、角度に数度のずれが生じますが、指示点を揺らしたりしてごまかしているのでまず気づかれません。これまでに発見したアイテムと距離が同じかそれより遠い場合には調べる意味がないので、最初にそれをチェックしています。すべての計算が第一象限で行われるように入力と出力を変換して、あとはatan2(y,x)'に任せます。一見するとプラグインの領域っぽい、というか、実際プラグインでやるべきものをあえて選んでみました。この記事ではこれをコモンイベントで実現する方法を解説しますが、絶対に真似しないでください(!?)。何故ならば、これは単なるパフォーマンスであって、とんでもなく効率の悪い方法だからです。この記事執筆中に思いついた別案として、「奇数のリージョンID上にあるイベント」というように条件を絞り込めばもう少し使えそうかなとは思いますが、どうせ実際のプロダクトには使わないのでこのままにしておきます。さて、何故こんな関数の話をしたかというと、コモンイベント自体もこの関数の考えに従って整理することができるからです。今回実装したダウジング機能は30ものコモンイベントによって構成されていますが、そのすべてが一画面に収まる長さの短いコモンイベントになっています。実は長いコモンイベントにすれば2つに収まるのですが、長いコモンイベントではどの部分で何をやっているのか把握するのが困難で理解しづらいのです。マンハッタン距離というのは、X方向とY方向の位置差分の絶対値を足し合わせたものです。要はグリッド上を上下左右移動のみで移動した場合に最短ルートで何歩かかるか、という測り方の距離です。揺れの設定値に従って、揺れの位相を更新し、揺れによる変位を求めます。コモンイベントから取得できるタイルの情報はいくつかありますが、発見後に消滅させられるものと考えるとイベントくらいしか思いつきませんでした。ちなみに、イベントの消滅も「イベントの一時消去」では効かないので、マップの遥か彼方へとイベントを吹っ飛ばして消し去っています。発見できなかった場合と、プレイヤーの真下にアイテムがあった場合には目標位置は中心です。それ以外の場合にはアイテムのある方向の円周上になります。さて、小数の計算はできるようになりましたが、依然としてできるのは四則演算だけです。なんとかして四則演算によって三角関数を計算しなければなりません。そこで、マクローリン展開というものを使います。前述したようにマクローリン展開による近似関数の有効定義域はせいぜい[-1, 1]です。このままでは利用できないため、次の性質を利用して定義域を広めます。後述する三角関数の実装ではこのようなことに注意して計算しているため、一見おかしな計算方法に見えるかもしれません。しかし、計算誤差を抑えるためには必要な手順なのです。現フレームの表示位置を計算した後に、ダウジング表示のピクチャを移動させます。と、まあそんなわけで、仕組み自体にそんなに興味のない人はさらっと眺めて、プログラミングってこんなこと考えるんだなぁくらいに思ってもらえればこの記事は大成功です。「コモンイベントの ちからって すげー!」っと言って帰りましょう。今回の実装の最がっかりポイントなのですが、「アイテムが存在するかどうか」を「イベントが存在するかどうか」で判定しています。つまり、すべてのイベントに対してダウジングが反応します(!?)。全然実用的じゃないですね。まあ、そもそもコモンイベントによる実装自体が実用的じゃないんですが……。最大有効距離内のタイルすべてが収まる最小の矩形内のタイルを走査します。いくつかの座標は計算の精度を上げるためにn倍されているため、nで割って元の倍率に戻します。方角から円周上の点を求めたり振動させたりと、三角関数を使いたくなる仕様でいっぱいなのですが(もちろんわざとです)、残念ながら……非常に残念ながらコモンイベントには三角関数を計算する機能はありません。というか、まず小数がありません。これだけ聞いてもいまいちピンとこないかもしれませんが、RPGツクールのイベントコマンドはだいたいこの関数の形になっています。例えば、「指定位置の情報取得」コマンドについて考えてみましょう。このコマンドでは、どの位置のタイルのどんな情報を取得したいかという『設定を受け取って』、それに従った情報を取得する『処理をして』、指定された変数にその値を入れることで『結果を返します』。他にも「所持金の増減」コマンドでは、所持金をどれくらい増やすまたは減らすのかという『設定を受け取って』、所持金を増減させる『処理をします』。出力はありません。「ゲームオーバー」コマンドでは、ゲームオーバーにする『処理をします』。入力も出力もありません。なんとなく関数のイメージが掴めたでしょうか?ダウジング機能の準備と後片付けです。「ダウジング機能」スイッチが有効な間、動き続けます。基本的な流れとして並列処理のコモンイベントで毎フレーム特定の処理をすることでダウジング機能を実装します。フレームというのはゲームの更新処理一回分のことで、だいたい1秒間に60回程度実行されることが多いです(1秒間に実行されるフレーム数をFPSといいます)。ゲームが動いているように見えるのは1/60秒ごとにこの更新処理によって絵が変化するためです。やっていることはダウジング機能に使う設定値や状態の初期化とピクチャのON/OFFです。「ダウジング中」スイッチにより、ダウジング状態はON/OFFできるようになっているため、それに合わせてダウジング表示に使うピクチャの表示・非表示を切り替えています。角度が0からπ/4の間になるように入力と出力を変換して、cosの近似計算を呼び出します。さて、これはアイデアとしては単純ですが、実装するとなると結構ややこしかったりします。先の例では分子だけを1000倍しましたが何故でしょうか?掛け算の場合はどうすればいいのでしょう?1000倍した数同士を掛けて、1000で割れば正しい結果になるでしょうか?……n倍した数同士の演算手順については慎重に考える必要がありそうです。めちゃくちゃ長いですね……全部まともに読んだ人がいたならお疲れさまでした。活動資金の支援を¥100から募集しています。 記事内容に満足いただけたならご検討のほどよろしくお願いいたします。もし同じような機能が欲しい場合にはプラグイン製作者に頼んでみてください。前述の通り、私は有料で製作サービスをやっていますし、ツクール界隈には無料でプラグインを製作してくれる親切な人がたくさんいますので。角度が0からπ/2の間になるように入力と出力を変換して、あとはcos(theta)'に任せます。絶対値の和をとるだけなのですが、まず絶対値をとるのが面倒という……。揺れの最小周期と最大周期の間をアイテムとの距離に合わせて補間します。角度が0からπ/4の間になるように入力と出力を変換して、sinの近似計算を呼び出します。まず、単純な四則演算について考えてみましょう。計算に使う値と計算結果がそれぞれn倍された状態になるように注意すると、四則演算は次のようになります。あとはこの重みを距離に応じて設定するだけです。aを最小周期、bを最大周期とすると、vをアイテムまでの距離、u+vを最大有効距離とすればOKです。プログラミングでは「関数」と呼ばれる単位に処理を分割して整理するのが一般的となっています。この名称はもちろん数学の関数から来ているのですが、表すものは少しだけ違います。関数とは、いくつかの設定(入力)を受け取り、設定に従って処理をして、結果(出力)を返す、という流れに従った一連の処理を指します。入力と出力はない場合もあります。これらを使ってどのように指示点の位置を計算するかについて説明します。角度が0からπ/2の間になるように入力と出力を変換して、あとはsin(theta)'に任せます。
呼び出し側のコモンイベントでは、まず関数の仕様に従って必要な設定を変数に入れ、 「コモンイベント」コマンドを実行してから、関数の仕様に従って変数から値を取り出します。 これでコモンイベントで関数を表すことができました。 コモンイベント / ツクールMVスクリプトリファレンスwiki ツクールMVでコモンイベントをスクリプトで行うなら以下の通りです。 表示変更 任意の色に変えるときはテキストボックスをクリックしてカラーピッカーで決め、変更ボタンを押してください コモンイベントです。 アイテムボタンを押すと ... 1.1. rpgツクールmvでプラグインなしのカードめくり!1.2. rpgツクールmvの不具合を修正します。 ... コモンイベントを名前で呼び出します。 ... 装備アイテム一覧の空白(装備を外す枠)に「はずす」文字を表記します。 使用前:スキル・アイテム使用前にコモンイベントを実行します 使用後:スキル・アイテム使用後(使用メッセージが表示され、mpなどが消費された直後)にコモンイベントを実行します. rpgツクールmvのコモンイベントは100%活用できていますか?上手に使うとゲームの拡張性を高めることができます。ツクール歴10年の私が、コモンイベント書き方とその例を詳しく解説。ツクールシ … アイテムの使用効果にコモンイベントを指定したときゲーム中初回1度のみ実行 するようなふうにできないでしょうか?コモンイベントを何度も実行したくありません。使用するごとに同じイベントになり ユーザビリティ上よくないと考えました。