ページ 11

【解決済】アクター間のステートを交換させるには?

Posted: 2021年8月18日(水) 16:19
by ブラインド
アクター1と2のステートを交換するとします。
アクター1にはステート4と6 アクター2にはステート7が既に付与されています。

コード: 全て選択

var p = []
$gameActors.actor(1).states().forEach(function(state) {
p.unshift(state.id)
$gameActors.actor(1).removeState(state.id)
})
if(!p.length == 0 )
{$gameVariables.setValue(1,p)}
else{$gameVariables.setValue(1,0)}
1のステートの配列を変数1に代入

コード: 全て選択

var p = []
$gameActors.actor(2).states().forEach(function(state) {
p.unshift(state.id)
$gameActors.actor(2).removeState(state.id)
})
if(!p.length == 0 )
{$gameVariables.setValue(2,p)}
else{$gameVariables.setValue(2,0)}
同じく、2のステートの配列を変数2に代入しました。

コード: 全て選択

$gameVariables.value(1).forEach(function(state) {
$gameActors.actor(2).addState(state)
})
$gameVariables.value(2).forEach(function(state) {
$gameActors.actor(1).addState(state)
})
1は2、2は1の変数からステートを付与させるという魂胆です。

最初こそ交換に成功しますが、何故か2回目や3回目から(不定)
相殺したのか、互いのステートが消えてしまいます。これはどういうことなのでしょうか?

Re: アクター間のステートを交換させるには?

Posted: 2021年8月18日(水) 18:27
by ecf5DTTzl6h6lJj02
こんばんは。
ブラインド さんが書きました:アクター1と2のステートを交換するとします。
アクター1にはステート4と6 アクター2にはステート7が既に付与されています。

コード: 全て選択

var p = []
$gameActors.actor(1).states().forEach(function(state) {
p.unshift(state.id)
$gameActors.actor(1).removeState(state.id)
})
if(!p.length == 0 )
{$gameVariables.setValue(1,p)}
else{$gameVariables.setValue(1,0)}
1のステートの配列を変数1に代入

コード: 全て選択

var p = []
$gameActors.actor(2).states().forEach(function(state) {
p.unshift(state.id)
$gameActors.actor(2).removeState(state.id)
})
if(!p.length == 0 )
{$gameVariables.setValue(2,p)}
else{$gameVariables.setValue(2,0)}
同じく、2のステートの配列を変数2に代入しました。

コード: 全て選択

$gameVariables.value(1).forEach(function(state) {
$gameActors.actor(2).addState(state)
})
$gameVariables.value(2).forEach(function(state) {
$gameActors.actor(1).addState(state)
})
1は2、2は1の変数からステートを付与させるという魂胆です。

最初こそ交換に成功しますが、何故か2回目や3回目から(不定)
相殺したのか、互いのステートが消えてしまいます。これはどういうことなのでしょうか?
addState や、removeState メソッドを実行すると、アクターの result オブジェクトに、
付与されたステート、解除されたステートの ID が追加されていくのですが、
この情報は初期化(削除)するメソッドを通らないと、残り続けます。
addState でステートを付与する際、 解除されたステートのID に自身のID番号がある場合、
ステートを付与できるか判定するメソッドが false を返すので、ステートが付与できません。
その結果、何にもステートが付与されていない、すべてのステートが解除されてしまっている状況が出来上がります。

ステートの交換が終わったタイミングで、それぞれのアクターに対して、
clearResult メソッド

コード: 全て選択

$gameActors.actor(アクターID).clearResult()
を実行してください。
それで、解決すると思います。

Re: アクター間のステートを交換させるには?

Posted: 2021年8月20日(金) 08:59
by ブラインド
addState や、removeState メソッドを実行すると、アクターの result オブジェクトに、
付与されたステート、解除されたステートの ID が追加されていくのですが、
この情報は初期化(削除)するメソッドを通らないと、残り続けます。
addState でステートを付与する際、 解除されたステートのID に自身のID番号がある場合、
ステートを付与できるか判定するメソッドが false を返すので、ステートが付与できません。
その結果、何にもステートが付与されていない、すべてのステートが解除されてしまっている状況が出来上がります。

ステートの交換が終わったタイミングで、それぞれのアクターに対して、
clearResult メソッド

コード: 全て選択

$gameActors.actor(アクターID).clearResult()
を実行してください。
それで、解決すると思います。
蓄積されていく落とし穴があったとは…
同じケースでclearResult()を入れてみたところ無事繰り返し交換に成功しました!
ありがとうございました!