【解決済み】外部JSONファイルを読み込ませ、フィルターで絞り込みたい

なかと
記事: 7
登録日時: 2021年5月07日(金) 14:53

【解決済み】外部JSONファイルを読み込ませ、フィルターで絞り込みたい

投稿記事by なかと » 2021年5月19日(水) 12:05

外部CSVファイルを読ませる方法は見つけたのですが、
勝手に中身を見られても困ってしまうためJSONファイルにしようと思っています。

コード: 全て選択

(function () {
  DataManager._databaseFiles.push(
    { name: '$dataMine', src: 'dataMine.json'}
  );
})();


上記みたいにプラグインにして読み込ませれば
$dataMine[行数].列名 で読み出せることまでは分かりました。

以下、質問です。
・JSONファイルの値でフィルターをかける方法
 例えば、スイッチ1がONの場合の主人公のセリフ……など。
 例では1つしかありませんが、この内容をランダムに表示したいと思ってます。
 参考になるサイトがあれば教えてください。

・JSONファイルを複数持った場合のデメリットは
 添付したJSONファイルは複数キャラまとめて書いてますが
 複数キャラで1つにまとめたら参照が遅くなるかな、と思っています。

 キャラ1人1人に対して、データファイルを分けようと思っています。
 複数ファイルに分ける事でのデメリットはありますでしょうか。
 
・JSONファイルは良くない、など何か他にアドバイス等あればください。

以上、よろしくお願いいたします。
添付ファイル
キャプチャ.JPG
スプレッドシートの内容
database.txt
jsonファイルを拡張子txtにしたもの
(3.27 KiB) ダウンロード数: 10 回
最後に編集したユーザー なかと on 2021年5月20日(木) 09:02 [ 編集 2 回目 ]

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

Re: 外部JSONファイルを読み込ませ、フィルターで絞り込みたい

投稿記事by Plasma Dark » 2021年5月19日(水) 13:33

・JSONファイルの値でフィルターをかける方法


JSONをロードした後の $dataMine が配列である、ということさえわかれば、あとはfilter関数でフィルタするだけです。
https://developer.mozilla.org/ja/docs/W ... ray/filter

複数ファイルに分ける事でのデメリットはありますでしょうか。


読み込むファイル数が増えるとその分ゲーム起動時のロード時間は伸びそうですが、
どうせテキストなのでまとめても分割してもパフォーマンスへの影響は無視できるほど小さいんじゃないかと思います。

・JSONファイルは良くない、など何か他にアドバイス等あればください。


勝手に中身を見られると困る、という理由には疑問があります。
csvもjsonもどちらも隠さなければ見られることに変わりはありません。
編集ツールが揃っていて、ご自身にとって制作の効率が一番良い形式を選ばれると良いと思います。
アバター
WTR
記事: 559
登録日時: 2015年12月22日(火) 19:14

Re: 外部JSONファイルを読み込ませ、フィルターで絞り込みたい

投稿記事by WTR » 2021年5月19日(水) 15:22

switch_on / event_done / status_done は boolean型 がいいんじゃないかなーと思いました。
Twitter、はじめました。
https://twitter.com/wtr_in_reverie/
なかと
記事: 7
登録日時: 2021年5月07日(金) 14:53

Re: 外部JSONファイルを読み込ませ、フィルターで絞り込みたい

投稿記事by なかと » 2021年5月19日(水) 16:35

Plasma Dark様
回答ありがとうございます。

ツクールMVのスクリプト側でやるのだと思いますが、
$dataMineを変数に当てはめる手段が分かりませんでした。

例題は以下のようにやるのだと思いますが、
一番最初の当てはめる部分が良く分かりません。

コード: 全て選択

//↓上手く参照できない??
testData  = $dataMine

//イベントが1番かどうか
result=testData.filter(value =>{
   if(value.event_done = 1);
      return true;
   }
});

//名前が主人公かどうか
result=result.filter(value =>{
   if(value.name = "主人公");
      return true;
   }
});

JSでJSONを動的にフィルタしたい
https://teratail.com/questions/212715
これが参考になりそうだとは思ってます。

基本的なこととは思いますが、アドバイスお願いいたします。

また、CSVではなくJSONにしたのは、
CSVはExcelやメモ帳などで簡単に開けて、ファイル自体が見やすいイメージがあり
jsonはソフトに紐づけられてないから比較的見ない上、ファイルが見づらいイメージがあります。


WTR様
アドバイスありがとうございます。
イベントやステータス、スイッチなど
現在は「1」だけ入力していますが、
イベント番号1,2,3を終えている場合…なども検討しています。
value.event_done > 0 && value.event_done < 4
みたいに組めれば良いと思ってます。

スイッチ「1」と「2」がONの場合などもありますし、
複数条件がONの場合も考え、Boolean型にしませんでした。

ただ、どうしていくかは考えながら作っていく予定なので
Boolean型にもするかもしれません。ありがとうございます。
名無し蛙
記事: 304
登録日時: 2015年11月23日(月) 02:46

Re: 外部JSONファイルを読み込ませ、フィルターで絞り込みたい

投稿記事by 名無し蛙 » 2021年5月19日(水) 21:13

主に使いそうなのはfilterとmapですかね
なかと さんが書きました: 例えば、スイッチ1がONの場合の主人公のセリフ……など。
 例では1つしかありませんが、この内容をランダムに表示したいと思ってます。

コード: 全て選択

// 条件に合致したデータを配列化
const data = $dataMine.filter(d => d.name === "主人公" && d.switch_on === 1);
// その中から台詞データを抽出して配列化
const quotes = data.map(d => d.quote);
// その中からランダムの一つを抽出する
const quote = quotes[Math.floor(Math.random() * quotes.length)];
// 条件に合致する台詞があれば表示
if (!!quote) console.log(quote);

//↓上手く参照できない??
testData = $dataMine
の文意が読み取れませんが、多分等価演算子(===)を代入演算子(=)と間違えている事と関係があるのでは
_databaseFilesに混ぜておけばきちんとJsonファイルが$dataMineにロードされるはずですね
アバター
Plasma Dark
記事: 669
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: 外部JSONファイルを読み込ませ、フィルターで絞り込みたい

投稿記事by Plasma Dark » 2021年5月19日(水) 21:45

例題は以下のようにやるのだと思いますが、
一番最初の当てはめる部分が良く分かりません。


ちょっとどう教えたものか、と悩むところですが、JavaScriptの基本的な文法を理解するために、簡単なスクリプトから書いてみるようにしたほうが良さそうです。
JavaScriptの変数(ツクールの変数ではない)に値を代入し、コンソール上にその値を表示するとか、その値で処理を分岐させるとか。

文法や関数を覚える際は技術系の質問フォーラムを見るより、JavaScript PrimerやMDNを参照するほうが良いです。
https://jsprimer.net/
https://developer.mozilla.org/ja/docs/Web/JavaScript

それについては読んだり書いたりしながら覚えていただくこととして、一つ一つ説明します。

$dataMine が何者であるかについては、 rpg_managers.js の DataManager 周りのコードを読むと理解できます。
最初の書き込みで提示されたプラグインでは、 $dataItems 等のツクールのデータベースで設定するファイルの一覧配列 DataManager._databaseFiles に、 $dataMine の定義を追加しています。
詳細は省きますが、この配列の要素一つ一つは、グローバルに展開される変数の名前とファイル名を表すオブジェクトです。

コード: 全て選択

{ name: '$dataMine', src: 'dataMine.json' }


ファイルの読み込みが完了すると、 $dataMine という変数に、 dataMine.json の中身が展開されている、というわけです。
(ロード処理の詳細は、慣れてきた頃に DataManager.loadDatabase, DataManager.loadDataFile を読んでみてください)

ロード完了以降は、プラグインやスクリプトの中で $dataMine を参照すると、 dataMine.json の中身を展開した配列になっています。
その中から名前が主人公であるような要素のみを抜き出すには、

コード: 全て選択

$dataMine.filter(value => value.name === "主人公");


などとします。
これを確かめるには、以下の手順を踏むと良いでしょう。

1. JSON読み込み用のプラグインを入れた状態でゲームを起動します。(テストプレイでも可)
2. F12キー(あるいはF8キー)を押してコンソールを開きます。
3. コンソールに console.log($dataMine.filter(value => value.name === "主人公")) と入力します。

CSVはExcelやメモ帳などで簡単に開けて、ファイル自体が見やすいイメージがあり
jsonはソフトに紐づけられてないから比較的見ない上、ファイルが見づらいイメージがあります。


Windows 10のデフォルト設定でも、jsonは何かしらのエディタに紐付けられていたような気がしますが、ちょっとうろ覚えです。
とは言え、JSON用のviewerやエディタは簡単に入手可能ですので、JSONがCSVより見られにくいというのはほとんど誤差のようなものです。
見られないことを意識するのであれば、 Enigma Virtual Box 等でパッキングしてしまうほうがよほど効果があります。

ファイル内のJSON自体を暗号化しても良いですが、そうすると復号の仕組みも自前で用意する必要があって手間が大きいですね。
なかと
記事: 7
登録日時: 2021年5月07日(金) 14:53

Re: 外部JSONファイルを読み込ませ、フィルターで絞り込みたい

投稿記事by なかと » 2021年5月20日(木) 09:01

名無し蛙様

回答ありがとうございます。
具体的なコードもありがとうございます!

調べていくうち、FilterとMapがあるのは見かけていましたが
違いについて理解するのに時間がかかりました。
Filterは条件絞り込み、Mapは新しい配列組み直すんですね。
コメントもあって、とても分かりやすいです。

個人的な話ですが、日曜以外はツクールに触れられない状況です。
ちょっと何言っているか分からないかもですが
アツマールに載っているソフトのConsoleで
Actorなどのデータを取得出来ないかと試したのですが、
上手く取得できない状況でした。
アツマールに載っているものですし、当たり前かもですね…。

---
Plasma Dark様

引き続き回答ありがとうございます。
1から10まで説明頂きありがとうございますorz

私にでも分かるように順序だてて全て説明頂き、
良く分かりました。
日曜に試してみようと思います。ありがとうございます!

当方Win10PCでは、jsonファイルは関連付けされてませんでした。
パソコンによって違うかもしれません。
中身を見ようとする人を防ぐのは、どんなソフトであれ難しそうですね。

お恥ずかしい話ですが、Enigma Virtual Boxというのを知りませんでした。
こんな便利なものがあったのですね。
使ってみます!

----------------
回答頂いた皆様、ありがとうございました。
実施方法も分かり、Enigmaという便利なソフトも知れました。
また、何かあれば相談させて頂くかと思います。
その時はよろしくお願いいたします。

本質問は「解決済み」とさせていただきます。

“MV:質問” へ戻る