コモンイベントを関数y=f(x)に見立てて、ゲーム内変数xを引数、スイッチyを返り値として渡すスマートな方法

メルサイア
記事: 127
登録日時: 2016年2月22日(月) 10:35
お住まい: 大阪府
連絡を取る:

コモンイベントを関数y=f(x)に見立てて、ゲーム内変数xを引数、スイッチyを返り値として渡すスマートな方法

投稿記事by メルサイア » 2016年10月25日(火) 11:26

コモンイベントを関数に見立てて、ゲーム内変数を引数として渡すと
(a)「変数10のアクターIDのステートが変数11であるかどうかを確かめて、スイッチ10に返すコモンイベント」
とか、
(b)「パーティの変数10番目のアクターが戦闘不能かどうかを確かめて、スイッチ10に返すコモンイベント」
とか、
短い行数で、汎用性のある共通処理が作れて便利なので、よく使っています。

ですが、上記のように、(a)と(b)で、変数番号をどこか他のところで重複させると、
いつどこでその変数を参照したのかがおえなくなり、バグ探しは壊滅的になります。
( 私が知っている方法では、これで変数の代入タイミングを調べるくらいしか救い道がありません…。 
 くらむぼんさんの変数可視化プラグイン https://twitter.com/i/web/status/779688578997559298 )

このようなバグ探しを減らすには、参照する変数番号を、コモンイベント毎に独立させるのが、無難な方法です。
ただこれだと、変数番号を圧迫します…。

(a)例を画像であげます。
b9508d3e3407aae6dedbe85fd320f2a2.png
私が現在やっている方法では、コモンイベントにゲーム内変数番号を割り当て、
呼び出し前に代入→必要に応じてスクリプトで参照し、呼び出し元に返しています。
呼び出し方はこんなふうにします。
489ec01bb74f75b7d71ebe93eb0737cc.png

ただこれだと、コモンイベント毎に、新しく変数を3枠必要となり、
変数の参照箇所や、命名規則も、かなり工夫しないと、管理が難しくなってしまうような気がしています。


どなたか、もっといい方法あれば教えていただけると嬉しいです><。

アバター
くろうど
記事: 279
登録日時: 2016年1月22日(金) 20:52
お住まい: 東京都
連絡を取る:

Re: コモンイベントを関数y=f(x)に見立てて、ゲーム内変数xを引数、スイッチyを返り値として渡すスマートな方法

投稿記事by くろうど » 2016年10月25日(火) 12:04

こんにちは。

見た感じでは、スクリプトを普通に使っているようなので、
ツクマテ内のこちらの記事を参考に、
その機能を Game_Interpreter に関数として追加するプラグインを作って、
「条件分岐内のスクリプト」でその関数を呼ぶというのはいかがでしょうか?
(戻り値が、trueかfalseで済むようなので)

↓こちら
http://tm.lucky-duet.com/viewtopic.php?f=23&t=2321

よろしくお願いします。
▼だいたいTwitterにいます。たぶん。
https://twitter.com/kuroudo119
メルサイア
記事: 127
登録日時: 2016年2月22日(月) 10:35
お住まい: 大阪府
連絡を取る:

Re: コモンイベントを関数y=f(x)に見立てて、ゲーム内変数xを引数、スイッチyを返り値として渡すスマートな方法

投稿記事by メルサイア » 2016年10月25日(火) 12:19

くろうどさん

早速のご回答、ありがとうございます。
お教えいただいた記事、参考になります。

ただ、私にとっては、少々難しすぎるようです……。
javascriptの勉強が必要と言われればそれまででなのですが、
簡単なプラグイン作成でも、1週間以上はかかってしまう人なので……><。

this.を使わない、Game_Interpreterに関数として追加するプラグインを使うのは魅力的ですが、
以下の方針から、出来る限りスクリプトを使わず、イベントコマンドを使った方法を模索しています。

・ゲームのプロジェクトファイルを初心者ツクラー向けに公開する前提で作っているため、できるだけ優しい言葉で書きたい
・スクリプト命令の独自仕様を作るのは、デフォルトのコアスクリプト命令との混乱を招くため、できるだけ避けたい
・javascriptの文法や、エラーが出た時のデバッグ方法がむずかしくて、
 ゲームを創るのを辞めてしまうユーザさんを出したくない

要望が多くて、申し訳ないです。
エディタだけで完結させるのは無理かもしれませんが、
スクリプトやプラグインを使う方法でも、もう少しわかりやすい方法であれば、トライしてみたいと思うので、
よろしくお願いいたします。
アバター
くろうど
記事: 279
登録日時: 2016年1月22日(金) 20:52
お住まい: 東京都
連絡を取る:

Re: コモンイベントを関数y=f(x)に見立てて、ゲーム内変数xを引数、スイッチyを返り値として渡すスマートな方法

投稿記事by くろうど » 2016年10月25日(火) 13:24

こんにちは。

なるほど、初心者向けに作られているという事でしたか……。
それでしたら、確かに、独自関数を追加するのは、混乱の元ですね。

ただ、ご要望とは異なるのですが、他の方がこの記事を見た時のために、念のため、先程書いた Game_Interpreter に関数を追加するという事の例を書いておきますね。

↓プラグインファイルはこんな感じで、Game_Interpreter を左側に書いた関数(例では checkState )として、作ります。
(作ったプラグインファイルを、ツクールMVのプラグインとして登録します)

コード: 全て選択

//======================================
// MyFunction.js
//======================================

/*:
 * @plugindesc Original function.
 * @author name
 *
 * @help This plugin does not provide plugin commands.
 */

/*:ja
 * @plugindesc 独自関数を追加します。
 * @author name
 *
 * @help このプラグインには、プラグインコマンドはありません。
 */

(function() {

Game_Interpreter.prototype.checkState = function(actorId, stateId) {
    if ($gameActors.actor(actorId).isStateAffected(stateId)) {
        return true;
    } else {
        return false;
    }
};

})();


↓イベントコマンドの「条件分岐のスクリプト」で、「this.」を付けて、その関数を呼び出せます。

コード: 全て選択

◆条件分岐:スクリプト:this.checkState(1,4)
  ◆文章:なし, ウィンドウ, 下
  :  :\N[1]は毒です。
  ◆
:分岐終了


お役に立てず申し訳ありませんが、よろしくお願いします。
▼だいたいTwitterにいます。たぶん。
https://twitter.com/kuroudo119
メルサイア
記事: 127
登録日時: 2016年2月22日(月) 10:35
お住まい: 大阪府
連絡を取る:

Re: コモンイベントを関数y=f(x)に見立てて、ゲーム内変数xを引数、スイッチyを返り値として渡すスマートな方法

投稿記事by メルサイア » 2016年10月25日(火) 14:21

くろうどさん

非常にシンプルかつ丁寧な記事、ありがとうございます!
確かに、プログラミング言語で関数を触っている人にとっては、かなりわかりやすい宣言の仕方ですね。
例外処理もメソッドの中に書けそうですし、とてもいい記述例ではないかと思います。

 初心者目線でいくと、このメソッド名「this.checkState(1,4)」を、
 javascriptでも使える日本語を使って「this.ステートチェック_引数は順にアクターID_ステートID(1, 4)と書いたり、
 もしくは、プラグインコマンド「ステートチェック 1 4」とやりたくなりそうですが、
 それでもスペルミスやエラーチェックがこわいので、やはり私はエディタでやる方法を考えることにします。
(特にプラグインコマンドはスペルミスによるエラーは問答無用にスルーするので、注意が必要です)

とても参考になりました。ありがとうございます。
メルサイア
記事: 127
登録日時: 2016年2月22日(月) 10:35
お住まい: 大阪府
連絡を取る:

Re: コモンイベントを関数y=f(x)に見立てて、ゲーム内変数xを引数、スイッチyを返り値として渡すスマートな方法

投稿記事by メルサイア » 2016年10月26日(水) 11:23

コモンイベントを多用しているツクラーさんへ: 参考記事
ここの冒頭に書いてある、問題点について、140文字以内と画像3つで簡単に説明しました。
https://twitter.com/merusaia/status/791102171051810816
ツイッターであげましたので、ここにも転載しておきます。

今のところ、私の経験では、以下のようにすると良いと思いました。

1. コモンイベント番号X(X=1~999)を呼び出す際に使う、入出力変数は、番号「1000+X」付近を使う 
  → 探しやすい & 統一性を図るため。
2. 番号「1000+X」の入出力変数には、冒頭に「CommonX:」または「ComX」となどの呼び出し元のコモンイベント番号Xを入れる
  → 初心者ユーザさんが、意図的にこの変数を上書きしないように、変数番号を予約しておく。
  → 1000~2000付近の変数番号は、それ以外の目的では使わない。

3. 番号「1000+X」の入出力スイッチにも同じことを施す。
  → スイッチだからと侮ることなかれ。
    もしスイッチ番号を共通して使っていた場合、
    複数のコモンイベントで同じスイッチが再帰的に呼び出されて、
    スイッチの値が知らない間に入れ替わっていることは十分有り得る(経験談)。

プラグインの競合だけでなく、ゲーム内変数/スイッチの競合にもお気をつけて……><。

“MV:質問” へ戻る