ページ 11

プラグイン内での変数呼び出しについて

Posted: 2018年1月27日(土) 13:07
by べるろ*(米工事)
現在、個人用のプラグインとして、
「戦闘中にパーティーキャラの立ち絵を表示し、体力の残量に応じて画像を差し替える」
というものを作成しています。
プラグイン制作は初めてで、行き詰ってしまったため質問させてください。

Spriteset_Battle.prototype.updateの内容に追加する形で立ち絵自体は表示できたのですが、
スクリプト内で$game系の変数を呼び出してもテストプレイ時に
「"Cannot read property '○○' of null"」
というエラーメッセージが表示されてしまうため、体力の残量やゲーム内変数との連動ができません。

この'○○'には、例えば、$gameVariables.value()を呼び出していた場合'value'が、
$gameActors.actors()系の変数を呼び出した場合'actors'が表示されます。

グローバル変数の呼び出しに問題があるのかと思い、Game_Variables.prototype.value()やGame_Unit.prototype.members()などの関数に書き換えてみたところ、
rpg_objects.jsの呼び出しは行えるのですが、今度は
「"Cannot read property '○○' of undefined"」
というエラーメッセージが表示されてしまいました。

他のプラグインが影響しているのかと思い、他すべてのプラグインをOFFにした状態でも試しましたが、
エラー状況は変わりません。

何か、根本的な勘違いがあるのだと思いますが、ツクールの扱いには不慣れなため、ご助言頂けると幸いです。

Re: プラグイン内での変数呼び出しについて

Posted: 2018年1月27日(土) 13:27
by トリアコンタン
こんにちは!
まず書き方ですが「$gameVariables.value()」で問題ありません。

上記でエラーになってしまうのは、「$gameVariables」がnullになっている状態で呼び出したものと思われます。
ゲーム系のグローバル変数はすべて「Scene_Boot.prototype.start」で作成されるので、おそらくそれ以前にスクリプトを実行しているのだと思いますが、どのタイミングで実行していますか?

Re: プラグイン内での変数呼び出しについて

Posted: 2018年1月28日(日) 19:57
by べるろ*(米工事)
トリアコンタン様

早速、コメントしてくださりありがとうございます!

スクリプトの実行タイミングが関係していたんですね……
よくわからず、常時実行する形で作っていたので、呼び出すタイミングを調整してみます。

Re: プラグイン内での変数呼び出しについて

Posted: 2018年1月29日(月) 11:34
by べるろ*(米工事)
トリアコンタン様

おかげさまでプラグインが機能するようになりました!
ありがとうございます!

ただ、ものすごく重くて戦闘シーンがなかなか進みません……
恐らく関数を呼び出すタイミングをSpriteset_Battle.prototype.updateにしているため、戦闘中常に関数を実行していることになっているからだと思います。

下記のコードは実際に呼び出し用に使用しているものです。
ここで分岐に使用しているriceTachie.draw()は
対象の位置pに該当するキャラクターの立ち絵を配列picDataに格納し、
その内容が同一キャラの前回内容と異なる場合はtrueを、
内容が同じ、または対象位置pにキャラクターが存在しない場合はfalseを返す関数です。

コード: 全て選択

var _Spriteset_Battle_update = Spriteset_Battle.prototype.update;
Spriteset_Battle.prototype.update = function() {
	_Spriteset_Battle_update.call(this);
	for(var p = 0; p <= 1; p++) {
		if(riceTachie.draw(p)) {
			for(var i = 0; i < maxLayer; i++) {
				if(picData[i]) {
					var picName = picData[i];
					var sprite = new Sprite();
					sprite.x = 0 + p * 816;
					sprite.y = 20;
					sprite.z = 10 + p * 0.1 + i * 0.01;
					sprite.anchor.x = 0 + p * 1;
					sprite.blendMode = 0;
					if(condition[p]["current"] == "yielding") {
						sprite.blendMode = 2;
					}
					sprite.bitmap = ImageManager.loadPicture(picName);
					if(sprite.bitmap) {
						this.addChild(sprite);
					}
				}
			}
		}
	}
};
何か実行をスムーズにするための方法はないでしょうか?

Re: プラグイン内での変数呼び出しについて

Posted: 2018年1月29日(月) 17:50
by まっつUP
多分riceTachie.draw()の分岐で毎フレーム立ち絵の
処理を必要ないときはしないようにしていると思うのですが
該当するif文のブロック内でconsole.logなどを使って
適切な頻度または回数で処理されているのは確認しましたか?
あと、maxLayerの正体が不明です。
また、ネストがかなり深いのでそのあたりの改善の余地があると思います。

追記:それとは別に分岐が通った時は毎回this.addChild(sprite);が実行されるのも気になります。
もしかしたら溜まっているかもしれませんね。

Re: プラグイン内での変数呼び出しについて

Posted: 2018年1月30日(火) 01:17
by べるろ*(米工事)
まっつUP様

ご助言ありがとうございます!
console.log()を用いて確認してみたところ、条件分岐用の関数内に問題が見つかりました。
そこを修正したことで、挙動の重さに関する不具合は無事に解消されました!

ご指摘のmaxLayerは同名前空間内で定義されているローカル変数で、
各キャラクターに使用できる画像パーツ(レイヤー)の最大枚数を扱っています。

また、ネストについてですが、
一つ目のfor関数は「パーティ何番目のキャラを対象とするか」
一つ目のif関数は「上記のキャラは存在するか(存在するならpicDataに画像を格納)」
二つ目のfor関数は「対象キャラの何枚目のパーツ画像(何枚目のレイヤー)を表示対象とするか」
二つ目のif関数は「上記番号のレイヤーに表示すべきパーツはpicDataに指定されているか(されていれば表示)」
を決める役割で用いています。
こういうプログラミング言語自体、今回初めて扱っているのでこの点については改善策がわかりません。
何か良い案があれば再度ご助言頂けないでしょうか?

Re: プラグイン内での変数呼び出しについて

Posted: 2018年1月30日(火) 18:01
by まっつUP
処理の一部を別の一つの関数としてまとめてしまうか
continue文を使うかするとよいと思います。

Re: プラグイン内での変数呼び出しについて

Posted: 2018年2月01日(木) 20:41
by べるろ*(米工事)
まっつUP様

なるほど!!
別関数の呼び出しなら簡単に解決できそうですね。
ありがとうございます!