【解決済み】コアスクリプト関数を省略(?)して記述したい【ありがとうございます】

返信する
NANANA0428
記事: 10
登録日時: 2022年2月02日(水) 23:10

【解決済み】コアスクリプト関数を省略(?)して記述したい【ありがとうございます】

投稿記事 by NANANA0428 »

いつもお世話になっております。
トピック件名にて上手く伝えられているか不安なところがございますが、以下のようなことが可能なのかどうかお知恵を拝借したく投稿をいたしました。

現在、姫HimeWorks様が提供されているプラグイン「Placeholder States」を利用してゲームの制作を進めております。
[参考URL]
姫HimeWorks様のHPはこちら
ムノクラ様の日本語版はこちら

本プラグインの機能を端的にご説明いたしますと、ステートのメモ欄にJavaScriptによる式を記載することで、その条件に合致したステートを付与できる…といったもので、付与する条件を細かく設定できるプラグインといったイメージです。
その他のプラグインと組み合わせることで可能性が大きく広がる、大変自由度の高いプラグインだと感じて重宝しているのですが、その条件式を記述する際に、何度も同じスクリプトを呪文のように記述するのはなかなかに骨の折れる作業であり、加えて条件式を増やすに連れて可読性や保守性の低下も感じています。
特に、現在構想中のゲームでは大量のステートを裏パラメータ的に使用する予定のため、一つのメモ欄に記載する条件式がしばしば非常に長大なものになってしまいます。

簡略化したイメージ例としてはこのような感じです。

コード: 全て選択

  <placeholder state>
    if ($gameVariables.value(1)==1) { 
         1;
      } else if ($gameVariables.value(1)==2) {
         2;
      } else if ($gameVariables.value(1)==3) {
         3;
      } else if ($gameVariables.value(1)==4) {
         4;
      }
  </placeholder state>
これだと、例えば変数1が1の時はID1番のステートが、2の時は2番のステートが…といった風に、変数の状況に応じて自由かつ自動的に割り振られて付与されます。
もちろん、実際には&&や||などで条件式が複雑だったり、変数に加えてスイッチなど別の関数を使っていたり、分岐先が4つではなく100とか200とかだったりといった具合です……。
トリアコンタン様のデータベースコンバータをお借りしてツクール上ではなくExcel上で書いているため、関数やVBAなどを使いある程度の効率化やヒューマンエラーに対するフォローは出来ているのですが、それでもやはり結構な手間がかかります。

こういった際に、一種の自作関数のように(例えばVar(1,2)で$gameVariables.value(1)==2を意味するような風に)短く書けたり、あるいはせめて$gameVariables.value(1)==2を$gV.v(1)==2のように短く書けるだけでも、少しは書いたり読んだりするのが楽になるのになぁ…とふと思いました。
ただ、こうした事ができるのか、できるとしてどうすれば良いのか、その辺りの知識が全く足りていない状況です。
過去のトピックを拝見いたしますと、こちらが比較的内容に近いように思ったのですが、拝読しても今ひとつピンと来ておらず、恥ずかしながら自力では正解にたどり着けておりません。

勉強不足で大変恐縮ではございますが、もしご存知の方や知見をお持ちの方がいらっしゃいましたら、ご教授・ご助言等頂けますと大変うれしく思います。

よろしくお願いいたします。
最後に編集したユーザー NANANA0428 [ 2022年12月14日(水) 21:23 ], 累計 1 回
アバター
剣崎 宗二
記事: 742
登録日時: 2016年11月12日(土) 20:36
連絡する:

Re: コアスクリプト関数を省略(?)して記述したい

投稿記事 by 剣崎 宗二 »

最近MVテスト環境を失った関係でテストできず予測で申し訳ないのですが…
多分自作関数は差し込めますよ。

コード: 全て選択

(function ($) {
となっている行の直後に

コード: 全て選択

function Var(a, b)
{
      return $gameVariables.value(a) == b;
}
と入れれば、上げていただいた例のVar(1,2)はタグの式内で使えるようになると考えます。
----
-出先に居る場合回答が未テスト状態である事が多い為、テストは重々にお願いいたします。
-基本自分や友人の問題解決は自分で1からプラグインを書いているので、「こういうプラグインはありますか」に対しては助けになれません。ご了承ください。
アバター
Plasma Dark
記事: 731
登録日時: 2020年2月08日(土) 02:29
連絡する:

Re: コアスクリプト関数を省略(?)して記述したい

投稿記事 by Plasma Dark »

ヘルプは読まれているでしょうか。
$gameVariablesはvで代用できるよ、という記述があります。
頑張ってメモ欄に書くのであれば、記述量は減らせるかと思います。
v.value(1) で $gameVariables.value(1) と同じ意味になります。

ここからは個人の意見ですが、複雑なことをするのであれば自分でプラグインを書いてしまうのが一番保守性の面で良いと思います。
メモ欄の記述が増え過ぎると当然、保守は大変になりますし、jsのコードを書くのに適した環境ではないので、書くにしても最小限にしたいですよね。

実現したいシステムは、あるステートにかかる際、条件を満たしていれば別のステートにかかる、でしょうか。
つまり、ステートIDから条件を満たしたステートIDへの変換ができれば良いことになります。

この変換を行う追加プラグインを書いて、メモ欄への記述を減らす例を書いてみます。

コード: 全て選択

(() => {
  'use strict';

  function Game_Battler_StateToAnotherStateMixIn(gameBattler) {
    gameBattler.stateToAnotherState = function (stateId) {
      /**
       * ステートID1は、変数1に代入された値をステートIDに持つステートに変換する
       */
      if (stateId === 1) {
        return $gameVariables.value(1);
      }
      /**
       * それ以外はそのまま
       */
      return stateId;
    };
  }

  Game_Battler_StateToAnotherStateMixIn(Game_Battler.prototype);
})();
<placeholder state>
this.stateToAnotherState(stateId)
</placeholder state>
Game_BattlerクラスにステートIDの変換を行うメソッドを定義し、それをHIME_PlaceholderState.jsのメモ欄から呼び出しています。

HIME_PlaceholderState.jsのメモ欄ではaをthisの代わりに用いることもできますが、ここではわかりやすさを重視してthisにしています。
バトラーの状態に依存しないのであれば、必ずしも Game_Battler に定義しなくても良いです。
元のプラグインを書き換えることをためらわないのであれば、剣崎さんの提示してくださった方法も手軽です。
NANANA0428
記事: 10
登録日時: 2022年2月02日(水) 23:10

Re: コアスクリプト関数を省略(?)して記述したい

投稿記事 by NANANA0428 »

剣崎 宗二さま、Plasma Darkさま

お二方とも迅速かつ丁寧なご回答をありがとうございます!
こんなにあっさりとご提案をいただけるとは有り難い限りで、どちらも興味深く拝見いたしました。
剣崎 宗二 さんが書きました:最近MVテスト環境を失った関係でテストできず予測で申し訳ないのですが…
多分自作関数は差し込めますよ。

コード: 全て選択

(function ($) {
となっている行の直後に

コード: 全て選択

function Var(a, b)
{
      return $gameVariables.value(a) == b;
}
と入れれば、上げていただいた例のVar(1,2)はタグの式内で使えるようになると考えます。
まずは剣崎 宗二さま、非常にシンプルな解決策のご提案をありがとうございます。
JavaScriptsは普段触れる機会がないのですが、なるほど…こういう風に処理ができるものなのですね。これはとても気軽に使えますし、私のような初心者でもパッと見て理解がしやすく、応用も利きそうに感じます。
他の条件を作りたい場合でも簡単に当てはめられそうなので、大変助かります。
ありがとうございます。

Plasma Dark さんが書きました:ヘルプは読まれているでしょうか。
$gameVariablesはvで代用できるよ、という記述があります。
頑張ってメモ欄に書くのであれば、記述量は減らせるかと思います。
v.value(1) で $gameVariables.value(1) と同じ意味になります。

ここからは個人の意見ですが、複雑なことをするのであれば自分でプラグインを書いてしまうのが一番保守性の面で良いと思います。
メモ欄の記述が増え過ぎると当然、保守は大変になりますし、jsのコードを書くのに適した環境ではないので、書くにしても最小限にしたいですよね。

実現したいシステムは、あるステートにかかる際、条件を満たしていれば別のステートにかかる、でしょうか。
つまり、ステートIDから条件を満たしたステートIDへの変換ができれば良いことになります。

この変換を行う追加プラグインを書いて、メモ欄への記述を減らす例を書いてみます。

コード: 全て選択

(() => {
  'use strict';

  function Game_Battler_StateToAnotherStateMixIn(gameBattler) {
    gameBattler.stateToAnotherState = function (stateId) {
      /**
       * ステートID1は、変数1に代入された値をステートIDに持つステートに変換する
       */
      if (stateId === 1) {
        return $gameVariables.value(1);
      }
      /**
       * それ以外はそのまま
       */
      return stateId;
    };
  }

  Game_Battler_StateToAnotherStateMixIn(Game_Battler.prototype);
})();
<placeholder state>
this.stateToAnotherState(stateId)
</placeholder state>
Game_BattlerクラスにステートIDの変換を行うメソッドを定義し、それをHIME_PlaceholderState.jsのメモ欄から呼び出しています。

HIME_PlaceholderState.jsのメモ欄ではaをthisの代わりに用いることもできますが、ここではわかりやすさを重視してthisにしています。
バトラーの状態に依存しないのであれば、必ずしも Game_Battler に定義しなくても良いです。
元のプラグインを書き換えることをためらわないのであれば、剣崎さんの提示してくださった方法も手軽です。
そしてPlasma Darkさま、プラグイン作成までいただき、驚きました。ありがとうございます。
こちらのアイディアも大変興味深く拝読しました。どのような意図を持った記述なのかについて100%理解が及ばない部分はあるのですが、メモ欄の記述が肥大化していくという点については自分自身問題視している部分があり、このシステム設計自体に若干の無理があるのではないかと思っていたところでもあったため、メモ欄への記述を減らせるというのは大変魅力を感じますし、勉強になります。

また、ヘルプのご指摘、お恥ずかしい限りです……。プラグインを使用する上でもちろん読んでいたのですが、この「v - 変数」という言葉の意味するところがわかっておらず、まさか自分が意図した機能(の一部)が既にあるものだとは理解できておりませんでした……。
「a - "this"バトラー」の方は下に参考例があったためすんなりと解釈出来ていたのですが…いやはや、これはそういう意味だったのですね。
しかし、これは言い訳ですね。読んでいてもちゃんと理解できていなければ、それは読んでいないのと同じことなので、反省の一言でございます。
灯台下暗しとはまさにこのことで、恥ずかしいとともにお手を煩わせてしまい申し訳ない限りです。


改めて、この度はお二方とも大変参考になるアドバイスをありがとうございました。
まだまだシステム全体の構築段階で他の部分との兼ね合いも不透明な部分が多いため、ご提案いただいた方法のそれぞれを多角的に検討し、より良いと思える形で実装をして行こうと思います。

ひとまず、本件については解決済みとさせていただきます。
また行き詰まった際にお知恵を拝借することがあるかもしれませんが、その際はまたお力添えをいただけると大変うれしく思います。
皆様、今後ともよろしくお願いいたします。
返信する

“MV:質問”に戻る