【解決済】1つの変数にPTの並びを代入することは可能ですか?

nozomi
記事: 84
登録日時: 2018年9月26日(水) 05:07

【解決済】1つの変数にPTの並びを代入することは可能ですか?

投稿記事by nozomi » 2020年8月18日(火) 21:33

質問失礼いたします。

仮に

PTの並びがアクターID1・2・3・4の場合
変数に「1234」を代入。

PTの並びがアクターID4・1・2・3の場合
変数に「4123」を代入。


の様に、1つの変数にPTの並び順にアクターIDを代入させたいのですが

その様な事は可能でしょうか?

御存知の方、居られましたら宜しくお願い致します。
最後に編集したユーザー nozomi on 2020年8月19日(水) 15:27 [ 編集 1 回目 ]

アバター
しぐれん
記事: 973
登録日時: 2017年3月28日(火) 22:22
連絡を取る:

Re: 1つの変数にPTの並びを代入することは可能ですか?

投稿記事by しぐれん » 2020年8月18日(火) 21:51

一応可能ですが、保存して何をするのでしょうか?
現在、プラグイン依頼はお休み中です。
nozomi
記事: 84
登録日時: 2018年9月26日(水) 05:07

Re: 1つの変数にPTの並びを代入することは可能ですか?

投稿記事by nozomi » 2020年8月18日(火) 22:03

しぐれん様
お返事ありがとうございます。

PTの並びを変数に代入させ
イベントの処理を行った後に
その後に、再度PTの並びを変数に代入させ
イベントの処理前と処理後にPTの並びに変化が有るか否かで
条件分岐させたいです。

ツクールMVのデフォルトの機能でも出来ることは分かるのですが
PTの人数分の条件分岐数
PTの人数分×2個分の変数が必要だと思い

1つの変数にPTの並び順でアクターIDを代入することで
条件分岐数と、特に必要な変数を減らせられたら有り難いなと思い
質問させていただきました。
アバター
しぐれん
記事: 973
登録日時: 2017年3月28日(火) 22:22
連絡を取る:

Re: 1つの変数にPTの並びを代入することは可能ですか?

投稿記事by しぐれん » 2020年8月18日(火) 22:21

PTの並び順を文字列扱いで保存すればできますね。

コード: 全て選択

◆変数の操作:#0007 パーティ並び順記録 = ""
◆変数の操作:#0007 パーティ並び順記録 += パーティメンバー1番のアクターID
◆変数の操作:#0007 パーティ並び順記録 += パーティメンバー2番のアクターID
◆変数の操作:#0007 パーティ並び順記録 += パーティメンバー3番のアクターID

最初の操作で文字列としての記録を開始し、その後でパーティメンバーを記録していきます。
あとは、別の変数に中身をコピーして、比較しましょう。
ただし、この方法は仲間キャラが10種類以上になると使えなくなります。
そうなると、プラグインで解決した方が速くなります。
現在、プラグイン依頼はお休み中です。
nozomi
記事: 84
登録日時: 2018年9月26日(水) 05:07

Re: 1つの変数にPTの並びを代入することは可能ですか?

投稿記事by nozomi » 2020年8月18日(火) 22:56

しぐれん様
ありがとうございます!

こんな方法があったのですね!
文字列として加算していく方法は
PTの並びを記録するだけではなく
他の用途でも使えそうで大変助かります! :D

早速、PTをハロルド/ID1、テレーゼ/ID2、マーシャ/ID3の順で並べ
教えていただいた方法を参考に、画像の様にイベントを組み試してみたのですが
メッセージウインドウには「123」と表示はされず
IDを加算していった「6」と表示されてしまったのですが
何処に問題が有るか教えていただいて宜しいでしょうか
質問ばかりで申し訳ございません :cry:
添付ファイル
無題.png
無題.png (62.49 KiB) 閲覧数: 3565 回
アバター
Plasma Dark
記事: 669
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: 1つの変数にPTの並びを代入することは可能ですか?

投稿記事by Plasma Dark » 2020年8月19日(水) 06:50

PTの並び順を文字列扱いで保存すればできますね。


実はこれはできません。空文字列をセットしてしまうと、変数取得時に0が返ってきてしまうため、数値加算になります。

アクターIDの最大値が255以下かつパーティが4人以下(アクターIDを一意に表現するために必要なビット数Nxパーティ人数が32以下)であれば、Nビットずつシフトして加算してしまうのは一つの手だと思います。
ビット演算はちゃんと理解して慣れておかないとメンテナンスできなくなるので、あまり多用はしないほうが良いのですが、利用する変数の数を抑える最適化をするのであれば有用な手段の一つです。
アバター
たくろう
記事: 22
登録日時: 2020年7月01日(水) 18:18
連絡を取る:

Re: 1つの変数にPTの並びを代入することは可能ですか?

投稿記事by たくろう » 2020年8月19日(水) 09:19

nozomi さん、こんにちは!
隊列によってイベントが分岐できたら、色々楽しい展開ができそうでワクワクしますね!

しぐれんさんに書いていただいている文字列として扱う場合、
Plasma Darkさんに書いていただいているとおりそのままだと数値加算になってしまうようですね。

そのため
◆変数の操作:#0001 パーティ並び順記録 = "_"
のように、最初に文字を入れておくと文字列として扱えるようでした。

ただし、しぐれんさんに記載いただいている通り
> この方法は仲間キャラが10種類以上になると使えなくなります。
1番目/ID:1 2番目/ID:11 の場合と (→ \V[1] は _111 )
1番目/ID:11 2番目/ID:1      (→ \V[2] は _111 )
を比較した場合同じになってしまうようでした。
隊列を文字列扱いにする.png


Plasma Dark さんのビット演算の方法が柔軟に色々対応できそうな気がします。

*===**===*
もし単純に最初の状態と次の状態を比較したいだけであれば、
隊列状態を確認できる $gameParty._actors を変数に入れて比較すればできそうでした。

隊列を文字列扱いにする2.png



これでやりたいこと実現できそうでしょうか??
アバター
Plasma Dark
記事: 669
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: 1つの変数にPTの並びを代入することは可能ですか?

投稿記事by Plasma Dark » 2020年8月19日(水) 11:48

これでやりたいこと実現できそうでしょうか??


できるできないで言えば、できます。

スクリプトを書くということは、それが何を意味するものであるか理解して、何か問題が発生しても対処できる(あるいは、状況を正しく把握できる)ようにするということなので、とりあえず動くからこれで、というのはあまり推奨しません。

Game_Party クラスの持つ _actors メンバは、パーティメンバーのアクターIDを配列で保持しています。
ただ、RPGツクールMVのコード規約において、 _ で始まる変数はクラス内からのみアクセスされるという暗黙的な意味があります。
クラス外からそのメンバに直接アクセスするのはあまり行儀の良いやり方ではありません。

行儀の良いやり方ではありませんが、それを承知の上でやるのであれば、それもまた一つの選択ではあります。
実際、行儀良くやろうとすると少し回りくどいコードになります。

コード: 全て選択

$gameParty.members().map(member => member.actorId())


Game_Party クラスの members 関数はパーティメンバー全員(戦闘中は、戦闘メンバーのみ)の情報を配列で返します。
.map 以降で、その情報の中からアクターIDだけ取り出した配列にしています。
得られる結果は $gameParty._actors と同じです。
nozomi
記事: 84
登録日時: 2018年9月26日(水) 05:07

Re: 1つの変数にPTの並びを代入することは可能ですか?

投稿記事by nozomi » 2020年8月19日(水) 14:37

たくろう様、Plasma Dark様
お返事ありがとうございます!

変数のスクリプトから$gameParty._actorsを代入することにより
PTの並びを変数に代入する事はできたのですが
何故かPTの並びを変更すると、並び変更前に代入していた値まで
随時、変更されてしまい

Plasma Dark様が記述されている
$gameParty.members().map(member => member.actorId())を使用することで
イベントコマンドを使用した間のみのPTの並び順を代入する事ができました :D

後はイベント前のPTの並び、イベント後のPTの並びを別々の変数に代入させ
条件分岐させるだけ・・・
と、試しに画像のようなイベントを組んでみたのですが
イベント前、イベント後の変数の値(並び順)が同じでも
値(並び順)が違うと判定されてしまいます・・・

$gameParty.members().map(member => member.actorId())を代入させた
変数の値を正しく比較させようとしたらどのようにしたら良いでしょうか?

重ね重ね、質問ばかり本当に申し訳ございません :cry:
添付ファイル
無題.png
アバター
Plasma Dark
記事: 669
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: 1つの変数にPTの並びを代入することは可能ですか?

投稿記事by Plasma Dark » 2020年8月19日(水) 14:59

イベント前、イベント後の変数の値(並び順)が同じでも
値(並び順)が違うと判定されてしまいます・・・


配列同士の比較なので、まあそうなりますね。
(js において [1, 2, 3] === [1, 2, 3] は偽です)

多少雑でも順序さえ比較できればよいのであれば、joinなりで文字列として連結してしまってから比較する手はあります。

コード: 全て選択

$gameParty.members().map(member => member.actorId()).join("_")


もうちょっと行儀よくやりたい場合はArray.prototype.someなりを使って書く手もありますが、流石に冗長なコードになるのでそこまでしなくてもまあ良いんじゃないでしょうか。

“MV:質問” へ戻る