生きているアクターと死んでいるアクターの現在座標を取得したい

アバター
剣崎 宗二
記事: 683
登録日時: 2016年11月12日(土) 20:36
連絡を取る:

Re: 生きているアクターと死んでいるアクターの現在座標を取得したい

投稿記事by 剣崎 宗二 » 2022年10月07日(金) 10:36

論よりショーゴ さんが書きました:紐づけできないのにどうやって取得しに行くのでしょうか?


剣崎 宗二 さんが書きました:z[0].x(存在しない)を取得したい時は、代わりに存在している$gamePlayer.xを取得しに行く、という形ですね。

強制的にこれをする、と言う事です。
これ以上の説明は私には無理ですね…

----
-出先に居る場合回答が未テスト状態である事が多い為、テストは重々にお願いいたします。
-基本自分や友人の問題解決は自分で1からプラグインを書いているので、「こういうプラグインはありますか」に対しては助けになれません。ご了承ください。
アバター
Plasma Dark
記事: 669
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: 生きているアクターと死んでいるアクターの現在座標を取得したい

投稿記事by Plasma Dark » 2022年10月07日(金) 13:14

僕も$gamePlayer.followers().follower(n)とz[n]を紐づけようと、
forを回して配列内の要素からデータを参照するなどやりましたが、結局グチャグチャになってしまって叶いませんでした。


この説明は良くないですね。方針を提案した側に対して「試したけどできなかった」以上の情報を与えていません。
何をどのように試して、どのようにうまくいかなかったのかをできるだけ具体的に説明してください。

コードを書いたのであれば、どこにどう書いて実行したのか、齟齬なく伝わるようにしてください。
イベントコマンドであれば、MVエディタにはテキストとしてコピーする機能が備わっています。
プラグインを書いて試しているのであれば、コードをすべて貼り付けましょう。
長くなりすぎるようなら、gistなどの外部サービスを利用してリンクを貼っても良いと思います。

何か問題を解決しようとするとき、試したことと、試したことによって得られた結果の説明は必須です。


さておき、うまくいかなかった理由を推測してみると、剣崎さんの提示されたコードでは、

コード: 全て選択

$gameParty.aliveMembers().concat($gameParty.deadMembers());


となっていますが、これは必ずしも InCoffin.js の並び順と一致しません。
InCoffin.js の並び順を再現するにはもう少しだけ複雑なコードを書く必要があります。

コード: 全て選択

$gameParty.aliveBattleMembers().concat($gameParty.battleMembers().filter(actor => actor.isDead()));


パーティメンバーが最大12人いるということなので、戦闘メンバー以外のメンバーも多く(デフォルト設定なら最大8人)いるはずです。
フォロワーとして表示されるのは戦闘メンバーのみなので、戦闘メンバーのみに絞って並べる必要があります。


ゴリ押しのzの作り方についてはこれでできるんではないかと思います。
コードを書くのであれば Game_Follower.prototype.actor を順序通りになるように再定義してあげる(正しい形の「InCoffin.js」を組む)ほうがメンテナンスしやすそうだなあとは思いますが、初学者にそれをさせるのも酷でしょう。
(であるからこそ、剣崎さんも邪道の方法を提示してくださったわけで)
論よりショーゴ
記事: 24
登録日時: 2021年6月17日(木) 15:33

Re: 生きているアクターと死んでいるアクターの現在座標を取得したい

投稿記事by 論よりショーゴ » 2022年10月08日(土) 14:57

お二人ともありがとうございます。

神無月サスケ様の「DeadMemberToCoffin.js」という神プラグインのおかげで
万事解決しました。
InCoffin.jsの完全な上位互換プラグインといった感じで
死亡したキャラを本当の意味で並び替えてくれるので、足元の座標が狂わずに済みました。

色々とお騒がせしてすいませんでした。
論よりショーゴ
記事: 24
登録日時: 2021年6月17日(木) 15:33

Re: 生きているアクターと死んでいるアクターの現在座標を取得したい

投稿記事by 論よりショーゴ » 2022年10月11日(火) 15:05

ダメでした。

仕様上の理由から「DeadMemberToCoffin.js」で運用していくのは難しそうです。

やはり「InCoffin.js」に戻して考え直す他なさそうです。

すいません。
Plasma Dark様にご質問なのですが、
$gameParty.aliveMembers().concat($gameParty.deadMembers());
と、
$gameParty.aliveBattleMembers().concat($gameParty.battleMembers().filter(actor => actor.isDead()));
の違いは何でしょうか?

下のコードにすることで、なぜごり押しのzが可能になるのでしょうか?

一度は終わらせた質問をぶり返してすいません。
最後に編集したユーザー 論よりショーゴ on 2022年10月16日(日) 14:56 [ 編集 1 回目 ]
アバター
Plasma Dark
記事: 669
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: 生きているアクターと死んでいるアクターの現在座標を取得したい

投稿記事by Plasma Dark » 2022年10月12日(水) 03:33

仕様上の理由から「DeadMemberToCoffin.js」で運用していくのは難しそうです。


この仕様上の理由が詳しく説明されないところに、回答者として強い不安を感じます。
この書き方では、回答者に対して「あなたの回答が徒労に終わる可能性は小さくない」と示しているようなものです。

前回の回答の意味が伝わっていないようなので、もう一度書きます。

何をどのように試して、どのようにうまくいかなかったのかをできるだけ具体的に説明してください。
何か問題を解決しようとするとき、試したことと、試したことによって得られた結果の説明は必須です。

$gameParty.aliveMembers().concat($gameParty.deadMembers());
と、
$gameParty.aliveBattleMembers().concat($gameParty.battleMembers().filter(actor => actor.isDead()));
の違いは何でしょうか?


前回の回答にある通りです。
フォロワーとして表示されるのは戦闘メンバーのみなので、戦闘メンバーのみに絞って並べる必要があります。

$gameParty.aliveMembers() や $gameParty.deadMembers() は、それぞれ全てのパーティメンバーの中で生きているアクター、戦闘不能のアクター一覧を配列として返します。
訂正後のほうは簡単な英語が読めれば意味が推測できるものなので、読んでみてください。
論よりショーゴ
記事: 24
登録日時: 2021年6月17日(木) 15:33

Re: 生きているアクターと死んでいるアクターの現在座標を取得したい

投稿記事by 論よりショーゴ » 2022年10月16日(日) 03:47

$gamePlayerの中にアクター情報がないのに
どうやって紐づけられるというのか、その方法も明示されない中で
「力技でできる」と漠然とお二方とも言われていますが
本当にできるのでしょうか?
どうも物理的にできる気がしません。

$gameParty.aliveBattleMembers().concat($gameParty.battleMembers().filter(actor => actor.isDead()))[0]._actorId;
$gameParty.aliveBattleMembers().concat($gameParty.battleMembers().filter(actor => actor.isDead()))[1]._actorId;
$gameParty.aliveBattleMembers().concat($gameParty.battleMembers().filter(actor => actor.isDead()))[2]._actorId;
$gameParty.aliveBattleMembers().concat($gameParty.battleMembers().filter(actor => actor.isDead()))[3]._actorId;

この4人のうち、1番目と3番目が死んでいた場合、
$gamePlayerとどうやって紐づけるのでしょうか。

for(var i = 0; i < $gameParty.aliveBattleMembers().concat($gameParty.battleMembers().filter(actor => actor.isDead())).length; i++){
if(i==0){
if($gameParty.aliveBattleMembers().concat($gameParty.battleMembers().filter(actor => actor.isDead()))[0]._actorId == $gameParty.members()[0]._actorId){
$gameVariables.setValue(1,$gamePlayer._x);
$gameVariables.setValue(2,$gamePlayer._y);
}
if($gameParty.aliveBattleMembers().concat($gameParty.battleMembers().filter(actor => actor.isDead()))[0]._actorId == $gameParty.members()[1]._actorId){
$gameVariables.setValue(1,$gamePlayer.followers().follower(0).x);
$gameVariables.setValue(2,$gamePlayer.followers().follower(0).y);
}
if($gameParty.aliveBattleMembers().concat($gameParty.battleMembers().filter(actor => actor.isDead()))[0]._actorId == $gameParty.members()[2]._actorId){
$gameVariables.setValue(1,$gamePlayer.followers().follower(1).x);
$gameVariables.setValue(2,$gamePlayer.followers().follower(1).y);
}
if($gameParty.aliveBattleMembers().concat($gameParty.battleMembers().filter(actor => actor.isDead()))[0]._actorId == $gameParty.members()[3]._actorId){
$gameVariables.setValue(1,$gamePlayer.followers().follower(2).x);
$gameVariables.setValue(2,$gamePlayer.followers().follower(2).y);
}
}
if(i==1){
if($gameParty.aliveBattleMembers().concat($gameParty.battleMembers().filter(actor => actor.isDead()))[1]._actorId == $gameParty.members()[0]._actorId){
$gameVariables.setValue(3,$gamePlayer._x);
$gameVariables.setValue(4,$gamePlayer._y);
}
if($gameParty.aliveBattleMembers().concat($gameParty.battleMembers().filter(actor => actor.isDead()))[1]._actorId == $gameParty.members()[1]._actorId){
$gameVariables.setValue(3,$gamePlayer.followers().follower(0).x);
$gameVariables.setValue(4,$gamePlayer.followers().follower(0).y);
}
if($gameParty.aliveBattleMembers().concat($gameParty.battleMembers().filter(actor => actor.isDead()))[1]._actorId == $gameParty.members()[2]._actorId){
$gameVariables.setValue(3,$gamePlayer.followers().follower(1).x);
$gameVariables.setValue(4,$gamePlayer.followers().follower(1).y);
}
if($gameParty.aliveBattleMembers().concat($gameParty.battleMembers().filter(actor => actor.isDead()))[1]._actorId == $gameParty.members()[3]._actorId){
$gameVariables.setValue(3,$gamePlayer.followers().follower(2).x);
$gameVariables.setValue(4,$gamePlayer.followers().follower(2).y);
}
}
if(i==2){
※以下略
}
if(i==3){
※以下略
}
}

結局、配列の順番が違う$gameParty.members()と比較しなければならないので
無理ではないでしょうか。
アバター
ドラムカン
記事: 178
登録日時: 2019年11月04日(月) 23:02

Re:

投稿記事by ドラムカン » 2022年10月16日(日) 05:14

横から失礼します。
気になったので回答させていただきます。

コード: 全て選択

if($gameParty.aliveBattleMembers().concat($gameParty.battleMembers().filter(actor => actor.isDead()))[n]._actorId == $gameParty.members()[n]._actorId){
}


このコードが余計で、上記のif文を除けば、
希望されているとおりの順番で座標が取れるのではないでしょうか?

それと、コードを載せるときは、タグを利用したほうが可読性が良くなります。
[Code]と書かれているボタンを押して、そのタグの中にコードを書きます。

私も若輩者で色々な質問サイトでよく説法を受け、悔しい思いをしてきたため、
悪意を持たない第三者の意見として受け取っていただけると幸いなのですが、

今ぶつかっている問題や、それに対して実行したことをしっかりと明示しなければ
せっかく善意で回答してくださっている方々に、余分な手間を強いることになるため
今後の両者(質問者さんと回答者さん両方)のことを考えて、
Plasma Dark 様もアドバイスしてくださっているのだと思います。

物の言い方で随分と印象が変わるのが文章の難しいところと言いますか、
時にはムッとすることもあるかもしれませんが、
「何の見返りもない中、回答してくださっている時点で、悪意はないだろう」と
考えるだけでも随分、受け取り方が違います。
中にはストレス発散で質問者さんに知識マウントを取ってくる方もいるかもしれませんが、
基本的には皆さん善意です。

解決が難しい壁にぶち当たってイライラしている中で色々と説法をたれてすみません。
ゲーム開発、頑張ってください。
最後に編集したユーザー ドラムカン on 2023年6月25日(日) 21:53 [ 編集 2 回目 ]
論よりショーゴ
記事: 24
登録日時: 2021年6月17日(木) 15:33

Re: 生きているアクターと死んでいるアクターの現在座標を取得したい

投稿記事by 論よりショーゴ » 2022年10月16日(日) 14:52

ドラムカン 様

うまくいきました。
色々とありがとうございます。
正直イライラしてました。

質問する側のほうが早く解決したい気持ちは強いと思います。
情報を明確に出さないのは、別に面倒だからとかそういうのではなくて
必要ない情報だと判断したからです。
最初の質問で既に問題点は十分に伝えているはずですから
「DeadMemberToCoffin.jsを導入してどううまくいかなかったのか」なんて、別に伝える必要はないでしょう。
これはもう理不尽な説教にしか受け取れませんでした。

まあすべては僕の頭の悪さが招いてることですけど
おっしゃるように、ものの言い方って文章だと特に大事だなって思います。

ありがとうございました。
アバター
Plasma Dark
記事: 669
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: 生きているアクターと死んでいるアクターの現在座標を取得したい

投稿記事by Plasma Dark » 2022年10月16日(日) 16:03

すでにお望みの挙動にはなったようですが、そこに至るまでの理屈を改めて説明しておきます。

アクターの情報(IDや戦闘メンバー内の並び順)から、そのアクターが表示されている座標を取得したい、というのがそもそもの要求でした。
しかし、戦闘メンバーの実際の並びと、InCoffin.jsで並べ替えられたプレイヤーとフォロワーの並びが違うため、 $gameParty.members() で取得した配列と表示上の並び順を対応付けられずに困っている、ということでしたね。

では、戦闘メンバーの並びから、InCoffin.jsで並べ替えた表示上の順番を再現するような新しい配列zを作りましょう。というのが剣崎さんが示してくださったゴリ押しの方法です。

コード: 全て選択

const z = $gameParty.aliveBattleMembers().concat($gameParty.battleMembers().filter(actor => actor.isDead()));


InCoffin.jsの並べ替え順を再現したので、z[0]は表示上の$gamePlayerに、1以上に整数Nについて、z[N]は表示上の$gamePlayer.followers().follower(N-1)に対応しているはずです。

元々の戦闘メンバー4人について、n番目のアクターの表示上の座標XYを、変数n, n+1に代入したいということであればこんなコードになります。

コード: 全て選択

z.forEach((actor, index) => {
  const character = index === 0 ? $gamePlayer : $gamePlayer.followers().follower(index-1);
  $gameVariables.setValue(actor.index() * 2 + 1, character.x);
  $gameVariables.setValue(actor.index() * 2 + 2, character.y);
});


今ぶつかっている問題や、それに対して実行したことをしっかりと明示しなければ
せっかく善意で回答してくださっている方々に、余分な手間を強いることになるため
今後の両者(質問者さんと回答者さん両方)のことを考えて、
Plasma Dark 様もアドバイスしてくださっているのだと思います。


フォローありがとうございます。私も説教臭い言葉の選び方をしてしまいがちなのは自覚しているので、気をつけなければいけませんね。

最初の質問で既に問題点は十分に伝えているはずですから
「DeadMemberToCoffin.jsを導入してどううまくいかなかったのか」なんて、別に伝える必要はないでしょう。
これはもう理不尽な説教にしか受け取れませんでした。


せっかくドラムカンさんにフォロー頂いたところ大変心苦しいのですが、これには反論させてください。

回答者は、質問者が作るゲームの全体像も、詳細な仕様も、試行錯誤の詳細もすべて、質問者から与えられる情報から読み取る他ありません。

仕様上の理由と書かれたものが何かわからない限り、回答者が今後提示するかもしれない回答も、それまで提示された回答も
全てその仕様上の理由とやらのために徒労に終わる可能性があるのです。
回答が徒労に終わるということはすなわち、質問者がその回答を見る労力・時間も無駄になるということです。

問題の解決を試みて、ある試行が失敗したとき、その失敗の原因を分析・言語化することは解決の大きな助けになります。
一連の書き込みを見るに、この言語化を怠ってしまっていないか心配になり、キツめの言葉選びになってしまっていたかもしれません。

決して、意地悪に理不尽な説教を垂れていたわけではない、ということは主張させてください。
論よりショーゴ
記事: 24
登録日時: 2021年6月17日(木) 15:33

Re: 生きているアクターと死んでいるアクターの現在座標を取得したい

投稿記事by 論よりショーゴ » 2022年10月16日(日) 17:41

Plasma Dark様

感情的になってしまってすいません。
開発が思うように進まない怒りを、あろうことか協力してくれようとしている人にぶつけてしまいました。
Plasma Darkさんのレスを読んで、
今深く反省しています。

「これだけ伝えれば十分だろう」というのはこちら側の勝手な思い込みに過ぎず
ゲームの仕様を全く知らない他者からすれば、全然足りないと思うのは当然のことでした。

>回答が徒労に終わるということはすなわち、質問者がその回答を見る労力・時間も無駄になるということです。
自分で自分の首を絞めていたということですね。
言語化を怠ったといわれると、確かに返す言葉がありません。

いい勉強になりました。
ありがとうございました。

“MV:質問” へ戻る