自作プラグインが動かないので問題を直して欲しいです

Moe2929
記事: 23
登録日時: 2020年3月16日(月) 20:40

自作プラグインが動かないので問題を直して欲しいです

投稿記事by Moe2929 » 2021年9月21日(火) 02:31

ツクールmvでゲーム制作をしています。

思ったようなプラグインが見当たらず、自分でプラグインを作りましたが動きません。

「プレイヤー位置を、ゲーム画面の横幅の1/3のところにずらす」「プラグインコマンドで機能のオンオフができる」というのが私が目指したものでした。

ところがプラグインコマンドの動作がうまく動かず困っています。
ネットで調べた上澄みの知識しかなく、どこが悪いか分かりません…

どなたかお知恵をお貸しください。

もし無事にプラグインが正常に作動するようになったら、誰でも使えるプラグインとして、ツクマテに公開する予定です。

よろしくお願いします。



追伸
プラグインコマンド以外の部分はうまく作動してると思います。

追伸2
うまく動いてるのはプレイヤー位置だけですね…
「プラグインコマンドによる機能のオンオフ」に加え、「プラグインの設定(機能のオンオフができる)」も動いてなさそうです。
添付ファイル
map_Test.js
私が作った正常に作動しないプラグインです。
(1.24 KiB) ダウンロード数: 13 回

アバター
Plasma Dark
記事: 668
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: 自作プラグインが動かないので問題を直して欲しいです

投稿記事by Plasma Dark » 2021年9月21日(火) 12:32

最低限、以下に示す1~3の修正が必要です。

1. show_idによる分岐でcenterXの戻り値を変えるようにする

コード: 全て選択

const _Game_Player_centerX = Game_Player.prototype.centerX;
Game_Player.prototype.centerX = function() {
  return show_id === 1 ? (Graphics.width / $gameMap.tileWidth() - 1) / 3.0 : _Game_Player_centerX.call(this);
};


show_id は0または1の二値しか値を取らないのであれば、booleanにしてしまっても良いとは思います。

2. プラグインコマンドの最後にプレイヤーの描画位置を更新する処理を追加する

コード: 全て選択

$gamePlayer.center($gamePlayer.x, $gamePlayer.y);


3. プラグイン名に合わせてパラメータ取得のためのキーを変更する

コード: 全て選択

const pluginName = 'map_Test';
const param = PluginManager.parameters(pluginName);


これでひとまず動作するようにはなります。

以下に示す4以降は、人に使ってもらうにあたって綺麗なコードにするための内容ですので、必須ではありません。
不慣れだと思いますので、かなり細かく書いています。余裕のあるときに一つずつ読んでみてください。

4. var ではなく let と const を使う

var は古い書き方で、今から新しく書くコードでは使うべきではないとされています。
(let とはスコープが違い、ブロックスコープである let のほうが直感的です)
const は再代入不可な定数を定義するものです。
定義した後、再び値を代入する必要がないものは const にしておくと、意図しない再代入を防ぐことができて安全です。

先程までの変更例で示した _Game_Player_centerX や pluginName が const なのはこのためです。
show_id は再代入の必要がある変数ですので、 let を使うと良いと思います。

5. プラグイン名や変数名を意味に即したものにする

プラグイン名は一時的な名前だとは思うのですが、どういう機能を持ったものであるかを表す名前になっていると良いと思います。
変数名も同様で、 N や show_id は現状の意味に即しているとは言えません。

現状の使われ方をそのままに名前をつけるとするなら例えば N は pluginCommandName, show_id は movePlayerCenterX などでしょうか。
(命名は個人の語彙力や趣味によって変わってくるので、これはあくまで一例です)

6. プラグインコマンドを整理する

現在の機能ではON/OFFを切り替えるのみなので、想定される使い方次第ではありますが、show_idやon, offと言ったパラメータは不要になるかもしれません。

コード: 全て選択

if (command === N) {
  show_id = (show_id + 1) % 2;
  $gamePlayer.center($gamePlayer.x, $gamePlayer.y);
}


(show_idが数値型なので剰余を使用していますが、真偽値であれば !show_id を代入するだけになります)

もちろん、今後の機能拡張でパラメータに意味を持たせる予定があるなら、残しておいても良いと思います。

6. 不要なコードを消す

Game_Interpreter.prototype.pluginCommand は元々、値を返さない関数です。
ですので、 ret に戻り値を代入して更に返すようにする、といったコードは不要になります。
単に _Game_Interpreter_pluginCommand を呼び出すだけで問題ありません。

7. インデントを揃える

WindowsでVSCodeをお使いであれば、 Shift + Alt + F で自動的にコードを整形してくれます。
(Macの場合は適宜読み替えてください)
設定次第では保存時に勝手に整形してくれますが、こちらはお好みで調べてみてください。

8. === で比較する

== でも現状は不都合が起きませんが、 == は特殊なケースにおいて、勝手に型変換が行われます。
例えば、 1 と "1" は数値型と文字列型ですが、 == では両者が等しいと判定されてしまいます。

単体では問題なく見えるかもしれませんが、型の違う値を等しいと判定されるとバグのもとになるため、値を比較する際には === を用いるのが良いとされています。

参考: JSPrimer - 暗黙的な型変換
https://jsprimer.net/basic/implicit-coercion/
Moe2929
記事: 23
登録日時: 2020年3月16日(月) 20:40

Re: 自作プラグインが動かないので問題を直して欲しいです

投稿記事by Moe2929 » 2021年9月21日(火) 13:25

Plasma Dark様

色々教えてくださってありがとうございます。

言われた事をもとに直してみました。
でもやはりうまく動きません……

私は本当に全くプログラムの知識がないので、多分初歩的な部分をミスしていると思われます。

直してみたファイルをアップしてみるので、もし時間があれば見てください。

Plasma Dark様以外の方も、もしよければアドバイスを頂けると幸いです。

何卒宜しくお願い致します。
添付ファイル
mapmapmap_Test.js
頑張って修正してみたものです。
(1.46 KiB) ダウンロード数: 8 回
アバター
Plasma Dark
記事: 668
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: 自作プラグインが動かないので問題を直して欲しいです

投稿記事by Plasma Dark » 2021年9月21日(火) 20:15

変数 show_id の名前を変えようとして、すべて変更できていません。
変数などの名前を変えるときは、VSCodeをお使いであれば、変数名にカーソルを合わせてF2キーを押すと漏れなく変更できます。
(後述の厳格モードにすれば、未定義の変数が使われている時点でエラーを出してくれます)

定数 param が2回定義されています。
起動時にコンソールにエラーが表示されるはずですので、何かおかしいなと思ったら、F12キーを押してコンソールを開いてみると良いと思います。

_Game_Interpreter_pluginCommand の定義が消えてしまっています。

$gamePlayer.center を呼び出すのが、OFFにした場合のみになってしまっています。
こんなふうに、分岐の外に出してあげましょう。

コード: 全て選択

if (args[1] === "on") {
  movePlayerCenterX = 1;
} else if (args[1] === "off") {
  movePlayerCenterX = 0;
}
$gamePlayer.center($gamePlayer.x, $gamePlayer.y);



最初の書き込みで挙げた4以降の部分ももちろん大事なのですが、ひとまず1~3の修正を行って動くことを確認されてからのほうが良かったかもしれません。
私も、一度に書いてしまったのは失敗でした。

そして、(あんまり書きすぎるのも良くないことではありますが)書き忘れていたので9を追記します。

9. 厳格モードを使う

functionで囲まれた範囲の先頭に 'use strict'; と書くだけです。
これだけで、JavaScriptはミスをエラーとして表示してくれるようになります。

参考: Strictモード - JavaScript | MDN
https://developer.mozilla.org/ja/docs/W ... trict_mode
Moe2929
記事: 23
登録日時: 2020年3月16日(月) 20:40

Re: 自作プラグインが動かないので問題を直して欲しいです

投稿記事by Moe2929 » 2021年9月21日(火) 22:21

Plasma Dark様

ご返信ありがとうございます。

頑張って教わった通りに直してみたところ、無事に動くものが出来ました!
ものすごく感謝しております!!

かなり無駄があるプラグインですが、私の知識で変にいじるとまた動かなくなりそうなので、とりあえずこれで完成にします。

本当にありがとうございました。




追伸(これは皆様に向けて)
最初に「プラグインが完成したら皆に向けて公開する」と言いましたが、あまり自信がないので、とりあえずここのページでのみ公開しときます。

使用用途は自由です。
改変等も自由にやってください。(寧ろ推奨します。かなり無駄が多いプラグインなので…改変されたものをこの記事に載せてもらえたらすごく嬉しいです)
添付ファイル
mapmapmap_Test.js
プレイヤー位置移動プラグインです。自己責任でどうぞ。
(1.89 KiB) ダウンロード数: 4 回

“MV:質問” へ戻る