ページ 23

Re: プラグインのノウハウを教えてほしいです

Posted: 2023年10月12日(木) 22:41
by くろうど
理解できたとのことで良かったです。

あとはこれらの組合せと応用なので、調べ方(コアスクリプトの読み方とJavaScriptの仕様の読み方)が分かればいけると思います。

一応、あと1問(画像周り)用意してあるので、必要であればお返事ください。

ただ、この問題は私も解説できない部分を含みます。
コアスクリプトを読んで、動くように書き換えることができるだけです。

よろしくお願いします。

Re: プラグインのノウハウを教えてほしいです

Posted: 2023年10月13日(金) 09:58
by haruchi
ぜひ見ておきたいです
それと質問なのですが、コアスクリプトを調べる際は、公式のリファレンスから探せばいいのでしょうか?

Re: プラグインのノウハウを教えてほしいです

Posted: 2023年10月13日(金) 15:20
by くろうど
コアスクリプトはRPGツクールのプロジェクトに入っているjsファイルをテキストエディタで開いて調べることを想定しています。

ちなみに、問題は以下です。
「RPGツクールMZのTPBをONにした時に、戦闘中の敵キャラ画像にTPBのゲージ(通称タイムゲージ)を表示してください」

カスタマイズ機能などは不要なので表示位置は可変にしなくても構いません。
ヒントとしては、20行かからずに書けるので、コードが長くなった場合は間違っている可能性があります。
とは言え、答えはひとつではないと思いますので、問題なく動けばOKです。

よろしくお願いします。

Re: プラグインのノウハウを教えてほしいです

Posted: 2023年10月14日(土) 14:54
by haruchi

コード: 全て選択

Window_StatusBase.prototype.placeGauge = function(actor, type, x, y) {
    const key = "actor%1-gauge-%2".format(actor.actorId(), type);
    const sprite = this.createInnerSprite(key, Sprite_Gauge);
    sprite.setup(actor, type);
    sprite.move(x, y);
    sprite.show();
};
おそらくこれを使うのだというところまでは分かったのですが、二行目の文字列の中身が調べてもわからなかったのと、アクターをエネミーに置き換えたあとどうすればいいのかわからなくなってお手上げです

Re: プラグインのノウハウを教えてほしいです

Posted: 2023年10月14日(土) 16:50
by くろうど
着目する点はそこです。
特に見るべき所は Sprite_Gauge です。

コアスクリプトの Sprite_Gauge を読んで Sprite_Gauge の使い方を調べると良いでしょう。

さらに言うと、以下の「新規追加するオリジナル関数」を完成させて適切なタイミングで使うと実現できます。

コード: 全て選択

Sprite_Enemy.prototype.setTimeGauge = function(battler) {
	this._timeGauge = new Sprite_Gauge();

	// ここにも追記する

	this.addChild(this._timeGauge);
};

Re: プラグインのノウハウを教えてほしいです

Posted: 2023年10月14日(土) 20:28
by haruchi
sprite_gaugeは読んでみましたが、やはりでのメソッドを使うのか、どの順番で使うのか、どう組み合わせるのかが全くわかりません

Re: プラグインのノウハウを教えてほしいです

Posted: 2023年10月15日(日) 10:36
by くろうど
おはようございます。
実際のところ、今回の問題はかなり難しい方だと思います。
コアスクリプトではゲージはWindow上に配置しているのですが、今回はSpriteにくっつけるのでトリッキーとも言えます。
回答のソースコードが短いから選んだという部分はあります。

ですが、クラスのインスタンス生成からの流れを追うには最適な問題かと思います。

コード: 全て選択

Window_StatusBase.prototype.placeGauge = function(actor, type, x, y) {
    const key = "actor%1-gauge-%2".format(actor.actorId(), type);
    const sprite = this.createInnerSprite(key, Sprite_Gauge);
    sprite.setup(actor, type);
    sprite.move(x, y);
    sprite.show();
};
着目点は(↑)ここで合っています。

ここの sprite 変数には Sprite_Gauge のインスタンスが入っているので、Sprite_Gauge をどう使うかというと、その下の行にあるように setup, move, show すればいいんです。

それを踏まえて オリジナル関数 setTimeGauge を作ると以下のようになります。

コード: 全て選択

Sprite_Enemy.prototype.setTimeGauge = function(battler) {
	this._timeGauge = new Sprite_Gauge();
	this._timeGauge.setup(battler, "time");
	const x = this._timeGauge.x - this._timeGauge.width / 2;
	const y = this._timeGauge.y - 12;
	this._timeGauge.move(x, y);
	this._timeGauge.show();
	this.addChild(this._timeGauge);
};
これを以下のタイミング(Sprite_Enemyの作成時)で使うと敵キャラ画像にタイムゲージが付きます。

コード: 全て選択

const _Sprite_Enemy_setBattler = Sprite_Enemy.prototype.setBattler;
Sprite_Enemy.prototype.setBattler = function(battler) {
	_Sprite_Enemy_setBattler.apply(this, arguments);
	if (BattleManager.isTpb()) {
			this.setTimeGauge(battler);
	}
};
よろしくお願いします。

Re: プラグインのノウハウを教えてほしいです

Posted: 2023年10月15日(日) 12:36
by haruchi
書いてもらったコードは読み解くことができました
考え方もなんとなくわかったような気がします

Re: プラグインのノウハウを教えてほしいです

Posted: 2023年10月15日(日) 15:35
by haruchi
コアスクリプトの探し方についてなのですが、こういったプラグインを作りたいと決めたあとに関係ありそうな箇所を探すのは分かるのですが、関係がありそうな箇所が膨大にあるときはどうすればよいでしょうか

Re: プラグインのノウハウを教えてほしいです

Posted: 2023年10月15日(日) 19:20
by くろうど
haruchi さんが書きました:コアスクリプトの探し方についてなのですが、こういったプラグインを作りたいと決めたあとに関係ありそうな箇所を探すのは分かるのですが、関係がありそうな箇所が膨大にあるときはどうすればよいでしょうか
コアスクリプト内を関連ワードで検索すると良いと思います。
関連ワードはだいたい英語なので、「回避」→翻訳→「evasion」などすると良いと思います。
あと、コアスクリプト内であれば、膨大と言っても7ファイルくらいで済みます。

ところで、私から出来ることは以上のような気がします。
普通のJavaScriptに関する内容であればwebを検索すると良いですし、もしかしたら既に見ている内容かもしれませんが、改めて見ることで見え方が変わることもあると思います。

あとは、「やりたいこと」を小さい単位に分割して、その小さい単位ごとに作っていくと良いと思います。
1つの関数に20行書くことがあったら大き過ぎると考えて良いと思います。

また、古いのかもしれませんが、「MVCモデル」の考え方も役に立つと思います。
ざっくり言うと、見た目(画面など)とデータは分けようという考え方です。

よろしくお願いします。