■記事リスト / ▼下のスレッド
■22936 / 親記事) |
MAP攻撃を被弾したユニットだけにイベントを実行させる方法について
|
□投稿者/ えむよん -(2017/01/10(Tue) 03:38:29) [ID:Gamvme9Z]
| MAP攻撃を被弾した空中にいるユニットだけを地上に降ろすというインクルを組んでいるのですが、うまく動作しません。
目標は、M投L2属性のマップ攻撃が命中してHPが低下した敵だけを地上に降ろす動作です。
以下のように組んでみたのですが、テストプレイしてみたところ被弾した敵の一部にしか地上に降りるイベントが実行されませんでした。また、この状況には再現性があり、乱数系列非保存の状態でも特定の位置にいるユニットだけが地上に降りるようになってしまいます。
よろしければアドバイスをお願いします。
使用 パイロット名 グラビティフォール: GF対象ユニット数 = 0 ForEach 全 出撃 If Abs(X(対象ユニットID) - X(目標地点)) + Abs(Y(対象ユニットID) - Y(目標地点)) < 3 Then GF対象ユニット数 = GF対象ユニット数 + 1 GF対象ユニット一覧[GF対象ユニット数] = 対象ユニットID GF使用前HP[GF対象ユニット数] = HP(対象ユニットID) EndIf Next Exit
使用後 パイロット名 グラビティフォール: For i = 1 to GF対象ユニット数 If HP(GF対象ユニット一覧[i]) < GF使用前HP[i] Then If Area(GF対象ユニット一覧[i]) = 空中 Then Set 墜落する地形 Info(マップ, X(GF対象ユニット一覧[i]), Y(GF対象ユニット一覧[i]), 地形クラス) Switch 墜落する地形 Case 陸 屋内 ChangeArea GF対象ユニット一覧[i] 地上 Case 水 ChangeArea GF対象ユニット一覧[i] 水中 Case Else EndSw PlayEffect 地面衝撃 GF対象ユニット一覧[i] EndIf EndIf Next Exit
|
|
|
▽[全レス6件(ResNo.2-6 表示)]
■22938 / ResNo.2) |
Re[2]: MAP攻撃を被弾したユニットだけにイベントを実行させる方法について
|
□投稿者/ えむよん -(2017/01/10(Tue) 23:47:24) [ID:Gamvme9Z]
| 素早い返信ありがとうございます。
テスト戦闘では、適正AAAA空陸水のユニットを平地マップに配置してテストしています。 特定の位置というのは説明不足で申し訳なかったのですが、例えば
○ ○○○ ○☆○ ○
というように☆の位置にM投L2のマップ攻撃を打ち込んだ場合、
○ ○●○ ○☆● ●
のように黒丸の部分のユニットだけが毎回地上に降りる、という現象です。
地形に関しては
平 平平平 林林平 林
のようになっていますね。
実際に、
For i = 1 to GF対象ユニット数 Talk システム $(GF対象ユニット一覧[i])、$(Info(マップ, X(GF対象ユニット一覧[i]), Y(GF対象ユニット一覧[i]), 地形クラス)) End
のように毎回Talkでタイプを吐かせるようにすると、 『ユニット名、陸』と対象ユニットの数だけ表示されました。 よって地形は全部陸で間違いないと思うのですが……
気になる現象としては、 上記で『ユニット名、陸』と出る前に、必ず『ユニット名』だけがTalk される現象くらいでしょうか。
『ユニット名』 ↓ウィンドウ更新 『ユニット名、陸』
と一回のTalk 文に対し2回表示されますね。ちょっと理由がよくわからないですが、解決のヒントにはなるでしょうか。
|
|
|
■22939 / ResNo.3) |
Re[3]: MAP攻撃を被弾したユニットだけにイベントを実行させる方法について
|
□投稿者/ えむよん -(2017/01/11(Wed) 00:09:14) [ID:Gamvme9Z]
| どうやら原因をみつけたらしいので、連続になりますが投稿します 以下の部分ですが、
使用後 パイロット名 グラビティフォール: For i = 1 to GF対象ユニット数 If HP(GF対象ユニット一覧[i]) < GF使用前HP[i] Then If Area(GF対象ユニット一覧[i]) = 空中 Then Set 墜落する地形 Info(マップ, X(GF対象ユニット一覧[i]), Y(GF対象ユニット一覧[i]), 地形クラス) Switch 墜落する地形 Case 陸 屋内 ChangeArea GF対象ユニット一覧[i] 地上 Case 水 ChangeArea GF対象ユニット一覧[i] 水中 Case Else
EndSw PlayEffect 地面衝撃 GF対象ユニット一覧[i] EndIf EndIf Next Exit
>PlayEffect 地面衝撃 GF対象ユニット一覧[i]
この一行を削除すると意図していた通りに動作することがわかりました。 戦闘アニメマニュアルを熟読して解決方法を探すことにします。 お騒がせして申し訳ありませんでした。
|
解決済み! |
|
■22940 / ResNo.4) |
Re[4]: MAP攻撃を被弾したユニットだけにイベントを実行させる方法について
|
□投稿者/ えむよん -(2017/01/11(Wed) 00:36:40) [ID:Gamvme9Z]
| 解決済みではあるのですが一応わかったことを残しておきます。
上記の動作についてはPlayEffectコマンドを削除すると正常に動作しました。 そこで、SpecialPowerAnimeコマンドで代用してみたところ、こちらは正常に動作しました。
For構文でループさせた中にPlayEffectコマンドを入れるとループが正常に作動しないバグが本体側に存在するように思われます。
|
|
|
■22942 / ResNo.5) |
Re[5]: MAP攻撃を被弾したユニットだけにイベントを実行させる方法について
|
□投稿者/ dip -(2017/01/11(Wed) 19:50:25) [ID:rA60gafX]
| 2017/01/11(Wed) 23:07:39 編集(投稿者)
>>上記で『ユニット名、陸』と出る前に、必ず『ユニット名』だけがTalk される現象くらいでしょうか。
ユニットIDには「:」が挿入されているので「Talk」の仕様で「:」がある事でメッセージを段階的に表示する機能が働いているためだと思います。 ユニット名を確認する場合はUnit関数を用いれば問題がなくなると思います。
>>For構文でループさせた中にPlayEffectコマンドを入れるとループが正常に作動しないバグが本体側に存在するように思われます。
解決しているようですが、バグの原因らしきものが判ったので一応ご報告を。
PlayEffectコマンドが原因と言うより、再生するアニメの「戦闘アニメ_地面衝撃」が「Loacl」を使わずに変数「i」を設定しているのが原因かと思われます。 SpecialPowerAnimeコマンドも再生するアニメが「Loacl」を使わず、変数「i」を設定していると同様の不具合が起こると予想されます。 解決方法としては「Loacl」を使い変数「i」を設定するか、「For」に使う変数を「j」などに変えれば解決するかと思います。
ただ、ループ処理中に、他のサブルーチンを呼び出す場合は、変数の競合は今後も起こる可能性があるので、 別のイベントに使う変数以外(今回の場合は使用後イベントの「i」)は「Loacl」を使う習慣を持った方が、いいかも知れません。
|
|
|
■22943 / ResNo.6) |
Re[6]: MAP攻撃を被弾したユニットだけにイベントを実行させる方法について
|
□投稿者/ えむよん -(2017/01/11(Wed) 23:29:13) [ID:Gamvme9Z]
| >ユニットID 変数表示で参照しても改行コマンドと認識してしまうんですね>Talk コマンド
>Local変数 こちらも変数を適当な名前に変更したらPlayEffectコマンドでも正常に動作するようになりました
インクルード中に変数を設定する際にLocal変数を毎回設定することは習慣づけたいと思います。おつきあいいただきありがとうございました!
|
|
|
■記事リスト /
レス記事表示 →
[親記事-6]
|