ページ 11

【解決済み】カスタムメニュー作成プラグインのフィルター機能で重複した項目を表示させたい

Posted: 2024年6月03日(月) 17:38
by kujira137
初めまして、ツクールMZを触り始めた程度のモノです。
トリアコンタンさんのカスタムメニュー作成プラグインを使用して、カードゲームのデッキ編集画面を作ろうとしています。


変数の30番目の値に、デッキの内部に入っているカードのIDを[1,1,1,2,2,2,3,3,3……]のような形で格納しました。

カードはアイテムとして登録しており、download/file.php?mode=view&id=22118
メモ欄にカードのID情報が登録されています。
これをカスタムメニュー作成プラグインの
「一覧取得スクリプト」で$dataItems.filter(data => !!data); // データベースのアイテム
の形で絞り込んだ後、
カードのID情報を
「フィルタースクリプト」を使い v(30).includes(+item.meta['CId']); // 30番目の変数(デッキ格納配列)に記載された値とメモ欄の<CId>(カードのID)の値が同一のモノ
のような形で検索しています
download/file.php?mode=view&id=22117

検索した後は項目描画スクリプトを使い、this.drawNotePicture('CPic', r.x, r.y, 'left', 'top', 0.3, 0.3); // 指定したメモ欄のピクチャを描画
の形で画面上に描画してあります。

カードゲームなので、デッキを編集する際、1枚ずつ手持ちのカードと入れ替える形をとりたいのですが、
重複した項目がすべて1つにまとまった形で表示されてしまい、カードを入れ替えるシステムを組むことができません
download/file.php?mode=view&id=22116

デッキ配列通りに、画面上に配置する場合、どのような形で記述すればいいのかわからなくなってしまった為、どなたかご教授いただけると幸いです。よろしくお願いします……

Re: カスタムメニュー作成プラグインのフィルター機能で重複した項目を表示させたい

Posted: 2024年6月04日(火) 21:49
by すおう
先にちょっと気になったこと
質問内容の「フィルタースクリプト」
v(30).includes(+item.meta['CId']);
の"+"の役割がちょっとわからないです。これなくても同じように動くのでは?
私が素人なだけかもしれないので下の内容試す前に確認してほしいです。すごく気になってます

コード: 全て選択

/*:
 * @target MZ
 * @plugindesc カードリスト
 * @base SceneCustomMenu
 * @orderAfter SceneCustomMenu
 */
(() => {
    'use strict';
    Window_CustomMenuDataList.prototype.createDeckList = function(idList, dataItems){
        if(!idList || !dataItems) return [];
        if(idList.length <= 0 || dataItems.length <= 0) return [];
        const dataList = dataItems.filter(data => !!data);
        const list = [];
        for(const id of idList){
            const data = dataList.find((item) => item.meta['CId'] === id);
            if(!!data) list.push(data);
        }
        return list;
    };
})();
さて要望についてですが、確実にプラグイン追加しないとできないなと思いました。
状況が特殊すぎて再現&検証ができないですが、一応それっぽいもの作ったので
これを入れた後「一覧取得スクリプト」を
this.createDeckList(v(30), $dataItems);
または
this.createDeckList($gameVariables.value(30), $dataItems);
とすればいけたりしないですかね・・・
フィルタースクリプトはいらないです。

あとカスタムメニュープラグインは私も使わせてもらっているんですが
特殊なメニュー作ろうとすると結構追加でプラグイン作る必要が出てきます。
もし他にもいろいろデフォルト機能で足りないことをやろうとするなら
ご自身で簡単なプラグインは作れるようになったほうがいいと思います
ご本人様のサイトにも改造用テンプレートを公開していらっしゃいますのでリンクを貼っておきます
https://raw.githubusercontent.com/triac ... mMenuEx.js

Re: カスタムメニュー作成プラグインのフィルター機能で重複した項目を表示させたい

Posted: 2024年6月04日(火) 22:36
by kujira137
ご返信ありがとうございます!!

"+"の役割に関してなのですが、私自身も実はよくわかっておらず……
+無しで動かしていた所、エラーは吐かないのですが、代わりに何も項目が表示されていない状況になってしまった為、<CId>がうまく検出されていない?数字の値としてでなく、文字として登録されているから??という憶測から、+を付け足して数値化してみた(出来ているのかすら不安)所、奇跡的にある程度目論見通りの検出はしてくれた、という状況になっていました。

頂いたプラグインを試してみた所、同様の症状が発生してしまった為、

for(const id of idList){
const data = dataList.find((item) => +item.meta['CId'] === id);
if(!!data) list.push(data);
}

このような形で記述しなおしてみたところ、ばっちり配列に入れたとおりのカードがリストに並びました!

メモ欄に<xxx:000>に記載するといったそもそものやり方が間違っていたのかもしれません……紛らわしくしてしまい申し訳ないです……!


プラグインの作成協力、本当にありがとうございます!
自身の力量から、自分でプラグインを作成するという発送に至らず、無理くりなんとかしようとしておりました……これを機にプラグインの作成、改造に挑戦してみようと思います!
Jsいっぱい勉強するぞ!

Re: 【解決済み】カスタムメニュー作成プラグインのフィルター機能で重複した項目を表示させたい

Posted: 2024年6月04日(火) 23:27
by すおう
ひとまずうまくいったようでよかったです。
そうか数字が文章で出ちゃうからうまくいかないんですね
だとすると+よりもNumber()でくくって数値化したほうが意味が明確でいいと思います

コード: 全て選択

Number( item.meta['CId'])

Re: 【解決済み】カスタムメニュー作成プラグインのフィルター機能で重複した項目を表示させたい

Posted: 2024年6月04日(火) 23:38
by kujira137
おお!とてもわかりやすいです!こんな記述方法があったとは……
以降似たような場面ではNumber()で記述していきたいと思います!
めちゃめちゃ親切な方に回答していただき、大変感激しております!!何から何までのサポート、本当にありがとうございましたっ!!