SRC質問掲示板Mk2

HOME HELP 新規作成 新着記事 ツリー表示 スレッド表示 トピック表示 検索 掲示板新着情報RSS配信新着情報 過去ログ

■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
引用返信/返信 削除キー/
■22937 / ResNo.1)  Re[1]: MAP攻撃を被弾したユニットだけにイベントを実行させる方法について
□投稿者/ dip -(2017/01/10(Tue) 18:27:02) [ID:0ymZETen]
    2017/01/10(Tue) 18:37:57 編集(投稿者)

    >特定の位置にいるユニットだけが地上に降りるようになってしまいます。

    特定の位置と言われても、こちらとしてはデータが判らないので正直判断に困りますね。
    あえて言うなら、ユニット自体が空中専用or宇宙専用の場合か、
    もしくは、処理自体は機能している様なので「Switch」の分岐がうまく機能していないかと予測します。

    「Switch」が原因なら、「Talk」などで特定の位置の地形タイプを確認してみた方がいいと思います。
    もしかしたら地形タイプが月面の地形が紛れているかも知れません。
    その場合は「Case」に月面を追加すれば済みますし。
引用返信/返信 削除キー/
■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変数を毎回設定することは習慣づけたいと思います。おつきあいいただきありがとうございました!
引用返信/返信 削除キー/



スレッド内ページ移動 / << 0 >>

このスレッドに書きこむ

Pass/

HOME HELP 新規作成 新着記事 ツリー表示 スレッド表示 トピック表示 検索 掲示板新着情報RSS配信新着情報 過去ログ

- Child Tree -
- Antispam Version -