イベントIDのメタデータから変数を取得する方法について

アバター
みたしや
記事: 37
登録日時: 2017年2月08日(水) 22:39
連絡を取る:

イベントIDのメタデータから変数を取得する方法について

投稿記事by みたしや » 2022年7月15日(金) 15:18

 いつもお世話になっております。

床にあるデータから先にいる敵を調べて
HPデータを取得するイベントを作っています。


 行程といたしましては

こんな感じのステージがあるとして

tuku-ru3.png
tuku-ru3.png (7 KiB) 閲覧数: 562 回


画像の【A】に接触すると スクリプト が 動き出す

①マップのイベント_メタに EnemyID と 書かれた イベント を探す。
②メタデータの中に格納された EnemyID をさがす
➂ [1_敵のID,2_敵のグループ,3_敵のナンバー] を取得し [2_敵のグループ,3_敵のナンバー] で条件分け
データベース内のエネミーデータから番号(1_敵のID)のHPを指定された変数(ここでは変数563)に代入。

という イベントを作りたいのですが。

以下は、スクリプトに記載してあるもの と 敵EVに設定してあるものです

tuku-ru2.png
tuku-ru2.png (6.16 KiB) 閲覧数: 562 回
tuku-ru1.png
tuku-ru1.png (44.41 KiB) 閲覧数: 562 回


コード: 全て選択

let get = null;
let Enemy = $gameMap.event(id).event().meta['enemyID'];
Enemy.forEach(function(event){
if(Enemy.split(,)[1] == 1 && Enemy.split(,)[2] == 2){
$gameVariables.setValue(563,$dataEnemies[Enemy.split(,)[0]].params[0]);
}});
if(!get==0){
$gameVariables.setValue(563,get.eventId());
}


enemyID が 指定されていないので見つかりません。
’ ’ が見つかりません。

スクリプトがうまく動いてくれないので困っています。

 どうにかして、メタデータを取得する方法はありますでしょうか?

名無し蛙
記事: 310
登録日時: 2015年11月23日(月) 02:46

Re: イベントIDのメタデータから変数を取得する方法について

投稿記事by 名無し蛙 » 2022年7月15日(金) 15:59

大筋は合ってそうですけどケアレスミスが目立ちますね。
困った時は一行一行console.logを挿し込んでどこでエラーが出るのか特定しましょう。
パッと見だと
①splitのデリミタを「,」ではなく「','」に変更する
②getをnull以外、一度も代入していない(5行目はgetに代入するべき)
③3行目は何の為にforEachしているのか分からない(テスト環境を作った時の名残?)

エラーと直接関係ないところだと
①splitした配列は一度適当な一時変数に入れた方が良い
②javascriptで比較する場合は等価演算子(==)ではなく厳密等価演算子(===)を使用した方が良い
③二重否定は分かりづらいからif (!get==0)ではなくif(get)の方が良い
とかですか

追記:よく見たら等価演算子の抽象性を利用して数値と文字を比較してるんですねこれ。
単純に入れ替えは出来ないけどそれでも厳密等価演算子の方が良いかは…好みですかねぇ。
簡単に不要な箇所を削って意味が通るように再構築したらこんな感じですか?

コード: 全て選択

const enemyInfo = $gameMap.event(id).event().meta['enemyID'].split(',').map(Number);
if(enemyInfo[1] === 1 && enemyInfo[2] === 2) {
    const enemyHp = $dataEnemies[enemyInfo[0]].params[0];
    $gameVariables.setValue(563, enemyHp);
}

それと
みたしや さんが書きました:①マップのイベント_メタに EnemyID と 書かれた イベント を探す。

という記述が引っ掛かるんですけど、
これは全てのイベントから特定のイベントを検索・抽出したいという事ですか?
その場合、更に条件にヒットするイベントが複数存在する場合、どのように優先順位を付けるのでしょう?
何でも良いからヒットしたイベント一つが欲しいならfindするのが適当です。

コード: 全て選択

const event = $gameMap.events().find(e => e.event().meta['enemyID']);
if (event) {
    const enemyInfo = event.event().meta['enemyID'].split(',').map(Number);
    if(enemyInfo[1] === 1 && enemyInfo[2] === 2) {
        const enemyHp = $dataEnemies[enemyInfo[0]].params[0];
        $gameVariables.setValue(563, enemyHp);
    }
}

“MV:質問” へ戻る