オーバーワールドでの戦闘攻撃?

Hit Countのコードを完成させる間のちょっとした余談ですが…

攻撃タイプ6のダメージ計算式を複製し、タイプ5の直下にタイプ7として配置しました。新しいコードブロックの上部にある「タイプ7」の部分は、これを設定するためのものだと推測しています。

攻撃タイプ6自体は、タイプ4の直下にあります。

また、Self Switch B=Onのすべてのインスタンスを、Last Hit=Hit Countに置き換えるべきでしょうか?

更新でエラーが発生しました

api_key = "a quick brown fox"
fetch("https://api.example.com/data", headers: { 'Authorization' => api_key })

修正をご協力ください。

2-フォーム4のSブラストは、現在全くノックバックを起こしていない可能性があります。また、命中した敵に対して奇妙な状態変化を引き起こす確率もあります。具体的には、ダメージを受けずにダメージ状態に固定されてしまいます。敵は新しいブレンドモードで光り、速度が6に設定され、その後たまに同じ場所で往復し始めます。これは完全に不規則です。以下がブラストと攻撃タイプ5のコードです。

  ◆コメント:ACTION 4 (S)
  ◆条件分岐:ActionTimer2 > 0
    ◆変数操作:#0218 ActionTimer2 -= 1
    ◆条件分岐:ActionTimer2 = 0
      ◆自己スイッチ操作:D = OFF
      ◆SE再生:Maris Haven SFX/Fighting/BSFX STUTTER (100, 100, 0)
      ◆
    :終了
    ◆
  :終了
  ◆条件分岐:スクリプト:Input.isTriggered("action4")
    ◆条件分岐:ActionTimer2 = 0
      ◆スイッチ操作:#0181 ATTACKING = ON
      ◆変数操作:#0197 ATTACK TYPE = 5
      ◆変数操作:#0213 AtkX = プレイヤーのマップX座標
      ◆変数操作:#0214 AtkY = プレイヤーのマップY座標
      ◆変数操作:#0215 AtkDir = プレイヤーの方向
      ◆条件分岐:AtkDir = 2
        ◆イベントの場所設定:攻撃衝突体, ({AtkX},{AtkY}) (方向: 下)
        ◆
      :終了
      ◆条件分岐:AtkDir = 4
        ◆イベントの場所設定:攻撃衝突体, ({AtkX},{AtkY}) (方向: 左)
        ◆
      :終了
      ◆条件分岐:AtkDir = 6
        ◆イベントの場所設定:攻撃衝突体, ({AtkX},{AtkY}) (方向: 右)
        ◆
      :終了
      ◆条件分岐:AtkDir = 8
        ◆イベントの場所設定:攻撃衝突体, ({AtkX},{AtkY}) (方向: 上)
        ◆
      :終了
      ◆スイッチ操作:#0185 RecoilGo = ON
      ◆共通イベント:SCREENSHAKE MEDIUM
      ◆移動経路設定:攻撃衝突体 (スキップ, 待ち)
      :移動経路設定:◇透明 OFF
      :移動経路設定:◇SE:Maris Haven SFX/Fighting/BSFX SMACK (100, 100, 0)
      :移動経路設定:◇画像:MH VitalAttacks1(3)
      :移動経路設定:◇速度:5
      :移動経路設定:◇1歩前進
      :移動経路設定:◇1歩前進
      :移動経路設定:◇1歩前進
      :移動経路設定:◇1歩前進
      :移動経路設定:◇1歩前進
      :移動経路設定:◇1歩前進
      :移動経路設定:◇1歩前進
      :移動経路設定:◇1歩前進
      :移動経路設定:◇1歩前進
      :移動経路設定:◇1歩前進
      :移動経路設定:◇1歩前進
      :移動経路設定:◇1歩前進
      :移動経路設定:◇1歩前進
      :移動経路設定:◇1歩前進
      :移動経路設定:◇1歩前進
      :移動経路設定:◇1歩前進
      :移動経路設定:◇1歩前進
      :移動経路設定:◇1歩前進
      :移動経路設定:◇1歩前進
      :移動経路設定:◇1歩前進
      :移動経路設定:◇1歩前進
      :移動経路設定:◇1歩前進
      :移動経路設定:◇1歩前進
      :移動経路設定:◇1歩前進
      :移動経路設定:◇1歩前進
      :移動経路設定:◇1歩前進
      :移動経路設定:◇1歩前進
      :移動経路設定:◇1歩前進
      :移動経路設定:◇1歩前進
      :移動経路設定:◇透明 ON
      ◆スイッチ操作:#0181 ATTACKING = OFF
      ◆変数操作:#0218 ActionTimer2 = 300
      ◆自己スイッチ操作:D = ON
      ◆
    :終了
    ◆
  :終了
        ◆条件分岐:ATTACK TYPE = 5
          ◆変数操作:#0189 SV: このイベントHP -= SV: ダメージ
          ◆変数操作:#0194 SV: 自分のX = Math.round(this.character(0)._realX)
          ◆変数操作:#0195 SV: 自分のY = Math.round(this.character(0)._realY)
          ◆イベントの場所設定:このイベント, ({SV: 自分のX},{SV: 自分のY})
          ◆スクリプト:this.character(0).setDirection(10 - $gameMap.event(63).direction());
          ◆移動経路設定:このイベント (スキップ, 待ち)
          :移動経路設定:◇ブレンドモード:加算
          :移動経路設定:◇速度:5
          :移動経路設定:◇SE:Maris Haven SFX/Fighting/BSFX BLASTAWAY (100, 100, 0)
          ◆ループ
            ◆変数操作:#0194 SV: 自分のX = Math.round(this.character(0)._realX)
            ◆変数操作:#0195 SV: 自分のY = Math.round(this.character(0)._realY)
            ◆移動経路設定:このイベント (スキップ, 待ち)
            :移動経路設定:◇1歩後退
            ◆変数操作:#0244 SV: ノックバックX = このイベントのマップX座標
            ◆変数操作:#0245 SV: ノックバックY = このイベントのマップY座標
            ◆条件分岐:SV: ノックバックX = SV: 自分のX
              ◆条件分岐:SV: ノックバックY = SV: 自分のY
                ◆ループを抜ける
                ◆
              :終了
              ◆
            :終了
            ◆
          :上記を繰り返す
          ◆移動経路設定:このイベント (スキップ, 待ち)
          :移動経路設定:◇ブレンドモード:通常
          :移動経路設定:◇速度:4
          :移動経路設定:◇待ち:5フレーム
          ◆
        :終了

3-Sラムもまた、現在全くノックバックを起こしていない可能性があります。Sボタンを押して自動で動かす場合です。Sボタンを押した後、ラムした敵に向かって矢印キーを押し続けていると、前述の奇妙な状態変化と同じ現象が発生します。ラムが停止した後も壁に押し込むことができ、その後速度6で動き回り、最終的には自己消滅します。これについて全く見当がつかないのですが、以下がラムと攻撃タイプ3のコードです。

◆条件分岐:VITAL SHAPE = 3
  ◆コメント:s
  ◆変数操作:#0197 ATTACK TYPE = 2
  ◆共通イベント:SCREENSHAKE MEDIUM
  ◆SE再生:Maris Haven SFX/Fighting/BSFX STUTTER 1 (100, 100, 0)
  ◆スイッチ操作:#0181 ATTACKING = ON
  ◆変数操作:#0225 移動パワー = 130
  ◆移動経路設定:プレイヤー (スキップ, 待ち)
  :移動経路設定:◇速度:6
  :移動経路設定:◇ブレンドモード:スクリーン
  :移動経路設定:◇1歩前進
  :移動経路設定:◇1歩前進
  :移動経路設定:◇1歩前進
  :移動経路設定:◇1歩前進
  :移動経路設定:◇ブレンドモード:通常
  :移動経路設定:◇速度:4
  ◆スイッチ操作:#0181 ATTACKING = OFF
  ◆スイッチ操作:#0182 MOVEMENT ATTACK = OFF
  ◆スイッチ操作:#0187 PREVENTER = OFF
  ◆
:終了
        ◆条件分岐:ATTACK TYPE = 3
          ◆共通イベント:DAMAGE SFX
          ◆変数操作:#0189 SV: このイベントHP -= SV: ダメージ
          ◆移動経路設定:このイベント (待ち)
          :移動経路設定:◇ブレンドモード:加算
          :移動経路設定:◇待ち:30フレーム
          :移動経路設定:◇ブレンドモード:通常
          ◆
        :終了

4-フォーム1と2のS攻撃は、現在全くノックバックを起こしていません。まだタイプ5に設定されているので、何かに当たるまで後ろに飛ばされるはずですが、そこで何かが間違っている可能性があります。以下がコードです。

◆条件分岐:VITAL SHAPE = 1
  ◆変数操作:#0197 ATTACK TYPE = 5
  ◆変数操作:#0225 移動パワー = 130
  ◆移動経路設定:プレイヤー (待ち)
  :移動経路設定:◇ブレンドモード:スクリーン
  :移動経路設定:◇SE:Maris Haven SFX/Fighting/BSFX QUICK HIT (100, 100, 0)
  :移動経路設定:◇ジャンプ:+0, +0
  :移動経路設定:◇ブレンドモード:通常
  ◆共通イベント:SCREENSHAKE MEDIUM
  ◆スイッチ操作:#0181 ATTACKING = ON
  ◆移動経路設定:攻撃衝突体 (待ち)
  :移動経路設定:◇SE:Maris Haven SFX/Fighting/BSFX SMACK (100, 100, 0)
  :移動経路設定:◇画像:MH VitalAttacks1(6)
  :移動経路設定:◇透明 OFF
  :移動経路設定:◇速度:6
  :移動経路設定:◇1歩前進
  :移動経路設定:◇1歩前進
  :移動経路設定:◇透明 ON
  ◆スイッチ操作:#0181 ATTACKING = OFF
  ◆スイッチ操作:#0182 MOVEMENT ATTACK = OFF
  ◆スイッチ操作:#0187 PREVENTER = OFF
  ◆
:終了
◆条件分岐:VITAL SHAPE = 2
  ◆変数操作:#0197 ATTACK TYPE = 5
  ◆変数操作:#0225 移動パワー = 130
  ◆移動経路設定:プレイヤー (待ち)
  :移動経路設定:◇ブレンドモード:スクリーン
  :移動経路設定:◇SE:Maris Haven SFX/Fighting/BSFX RISING (100, 150, 0)
  :移動経路設定:◇1歩後退
  ◆移動経路設定:プレイヤー (待ち)
  :移動経路設定:◇速度:6
  :移動経路設定:◇1歩前進
  :移動経路設定:◇速度:4
  :移動経路設定:◇ブレンドモード:通常
  ◆共通イベント:SCREENSHAKE MEDIUM
  ◆スイッチ操作:#0181 ATTACKING = ON
  ◆イベントの場所設定:攻撃衝突体, ({BPlayer X},{BPlayer Y})
  ◆移動経路設定:攻撃衝突体 (待ち)
  :移動経路設定:◇歩行アニメーション ON
  :移動経路設定:◇スクリプト:$gameMap.event(63).setPriorityType(2);
  :移動経路設定:◇画像:MH VitalAttacks1(7)
  :移動経路設定:◇透明 OFF
  :移動経路設定:◇速度:6
  :移動経路設定:◇1歩前進
  :移動経路設定:◇SE:Maris Haven SFX/Fighting/BSFX BIG HIT 2 (100, 100, 0)
  :移動経路設定:◇不透明度:200
  :移動経路設定:◇待ち:60フレーム
  :移動経路設定:◇不透明度:150
  :移動経路設定:◇待ち:5フレーム
  :移動経路設定:◇不透明度:100
  :移動経路設定:◇待ち:5フレーム
  :移動経路設定:◇不透明度:50
  :移動経路設定:◇待ち:5フレーム
  :移動経路設定:◇歩行アニメーション OFF
  :移動経路設定:◇透明 ON
  :移動経路設定:◇スクリプト:$gameMap.event(63).setPriorityType(1);
  :移動経路設定:◇不透明度:255
  :移動経路設定:◇ブレンドモード:通常
  ◆スイッチ操作:#0181 ATTACKING = OFF
  ◆スイッチ操作:#0182 MOVEMENT ATTACK = OFF
  ◆スイッチ操作:#0187 PREVENTER = OFF
  ◆
:終了

4.5-時々、フォーム2のS攻撃でSを押した後、処理が固まることがあります。全く動かなくなり、ソフトロック状態になります。

5-フォーム6の彷徨う攻撃衝突体は、依然として敵を回避しているようです-当たっているかどうかは分かりません。また、狭い場所では、(動けない場合はスキップ) がすべてのステップを瞬時に処理し、敵が消えすぎてしまう気がします。タイルが占有されているかどうかに関係なく、敵を完全に無視してランダムに移動させる方法はありますか?

6-トラップは一見動作しているようですが、非常に不安定で、なぜそうなるのか正確には分かりません。敵がそれを避けようとして、手前で止まり、横から当たるような挙動に見えるのですが、定かではありません。さらにテストします。また、敵がトラップに乗った場合はダメージを受けますが、乗ったまま立ち止まっている場合はダメージを受けません。

7-フォーム6の固有の通常攻撃は修正されました!攻撃タイプ1のダメージ計算式に条件分岐を追加し、MULTI STRIKING=1の場合、より速いノックバックが発生するようにしました。これで必要なダメージを全て受け取ることができます!

10-連打はフォーム1で期待通りに動作しています。それがテスト対象だったのです!コードを2, 3, 5, 7にも追加します。

11-これは条件付きなのでテストが難しいのですが、攻撃衝突体の側面に歩いて入るという状況が再度発生しないか注視します。

2, 3, 4 について。これらは1つの問題だと考えており、私が提供したループに起因しています。ループ内の各ステップは独立した移動ルートであり、あるルートが終了し次のルートが始まる間のフレームで、敵の自律移動が処理されます。頻度が「最高」に設定されている場合、敵はその場で自分のステップを踏むことができます。ノックバック後のステップの直後に「後退」ステップが入ると、ループは敵が動いていないと判断し、1タイルで停止します。これはノックバックが全く発生していないように見えます。横へのステップは敵を回転させるため、次の「後退」ステップはそれを無効化し、敵はその場で揺れ動くようになります。また、ループが末尾の「ブレンドモード: 通常」に到達しないため、敵は点灯したままになります。矢印キーを押して追従する場合、敵が自分に近づくステップがブロックされるため、ループは壁まで継続して実行されます。

解決策は、ノックバックの間、敵の自律移動を無効にすることです。これを行うには、最初のルートの前と最後のルートの後にスクリプト行を2つ追加します。以下はこれらを含めたタイプ5の例です。タイプ2も同様の場所に同じ2行を追加します:

◆If: ATTACK TYPE = 5
  ◆Control Variables: #0189 SV: This event HP -= SV: Damage
  ◆Control Variables: #0194 SV: My X = Math.round(this.character(0)._realX)
  ◆Control Variables: #0195 SV: My Y = Math.round(this.character(0)._realY)
  ◆Set Event Location: This Event, ({SV: My X},{SV: My Y})
  ◆Script: this.character(0).setDirection(10 - $gameMap.event(63).direction());
  ◆Script: this.character(0)._locked = true;
  ◆Set Movement Route: This Event (Skip, Wait)
    : Blend Mode: Additive
    : Speed: 5
    : SE: Maris Haven SFX/Fighting/BSFX BLASTAWAY (100, 100, 0)
  ◆Loop
    ◆Control Variables: #0194 SV: My X = Math.round(this.character(0)._realX)
    ◆Control Variables: #0195 SV: My Y = Math.round(this.character(0)._realY)
    ◆Set Movement Route: This Event (Skip, Wait)
      : 1 Step Backward
    ◆Control Variables: #0244 SV: KB X = Map X of This Event
    ◆Control Variables: #0245 SV: KB Y = Map Y of This Event
    ◆If: SV: KB X = SV: My X
      ◆If: SV: KB Y = SV: My Y
        ◆Break Loop
      ◆End
    ◆End
  ◆Repeat Above
  ◆Set Movement Route: This Event (Skip, Wait)
    : Blend Mode: Normal
    : Speed: 4
    : Wait: 5 frames
  ◆Script: this.character(0)._locked = false;
◆End

_locked は、会話中にイベントを固定するためにエンジンが使用するフラグです。これによりイベントの自律移動は停止しますが、移動ルートは機能し続けます。

それでも不具合が発生する場合、敵の自律移動の設定(タイプ、速度、頻度)はどうなっていますか?それによって、速度6がどこから来ているのかもわかります。タイプ2とタイプ5のルートでは速度は設定されていないからです。

3 について、ラムは ATTACK TYPE = 2 を設定するため、タイプ3ではなくタイプ2の分岐に入ります。また、フォーム4の爆発は Move Power を設定しないため、ダメージは最後の攻撃で使われた値を借用します。ATTACK TYPE = 5 の下に Move Power の行を追加すれば修正できます。

4.5 について。フォーム2の両プレイヤールートには Wait が設定されていますが、Skip If Cannot Move は設定されていません。Sを押した瞬間、背後に壁や敵がいると「後退」ステップが発生できず、永遠にリトライし、ハンドラーも永遠に待機してしまいます。両方のルートで Skip をオンにすると修正できます。2つ目のルートにも必要です。後退中に敵があなたの前方のタイルに移動してくる可能性があるためです。

5 について。はい。ウォーダルートの「Move at Random」を、以下の行を含むスクリプトコマンドに置き換えてください:

const ds = [2, 4, 6, 8].filter(d => this.isMapPassable(this.x, this.y, d)); if (ds.length) { const t = this.isThrough(); this.setThrough(true); this.moveStraight(ds[Math.randomInt(ds.length)]); this.setThrough(t); }

これは壁が塞いでいない方向のみを選択し、敵をすり抜けて進むため、狭い空間でもブロックされたステップを無駄にせず、すべてのステップを使用します。Through OFF と Through ON の行はルートから外せます。このスクリプトが自身で壁の処理を行うためです。正しく動作しているか確認するには、テストとして If: SV: Distance ≤ 1 の中に Play SE を配置し、すべてのヒットで音が鳴ることを確認します。

6 について。回避や停止は、トラップ設置中に攻撃の衝突判定で Through がオフになっているためと思われます。フォーム6は PREVENTER に含まれていないため、最後の行の前にウォーダルートが何らかの原因で切断されていないか疑問です。もしそうなら、末尾の Through ON が実行されず、衝突判定が固体のままになっている可能性があります。上記のスクリプトに対してその2行を削除すれば、この問題は解消されます。横からのヒットは、再びステップの問題です。敵のマップ座標は、トラップに向かってステップを踏み始める瞬間にトラップ上に移動するため、見た目は隣にいるにもかかわらずヒットが判定されます。

その場に立っている間に1回だけヒットし、それ以上ヒットしないのは、現在の「再武装ブロック」の動作です。敵が上に立っている間もヒットし続けたい場合は、底部のチェックに ≠ 6 を追加し、1と3と同じようにしてください。そうすると、30フレームのフラッシュ効果により、約0.5秒ごとに1回ヒットするようになります:

◆If: ATTACK TYPE ≠ 1
  ◆If: ATTACK TYPE ≠ 3
    ◆If: ATTACK TYPE ≠ 6
      ◆Control Variables: #0XXX SV: Last Hit = Hit Count
    ◆End
  ◆End
◆End

7 と 10 について、素晴らしいですね。11 についても、そのように聞こえます。

2-フォーム4のSブラストは完了したと思います!

3-おっと。タイプ2のコードはこちらです。

        ◆If:ATTACK TYPE = 2
          ◆変数操作:#0189 SV: このイベントのHP -= SV: ダメージ
          ◆変数操作:#0194 SV: 自分のX = Math.round(this.character(0)._realX)
          ◆変数操作:#0195 SV: 自分のY = Math.round(this.character(0)._realY)
          ◆イベントの位置設定:このイベント、({SV: 自分のX},{SV: 自分のY})
          ◆スクリプト:this.character(0)._locked = true;
          ◆移動ルートの設定:このイベント (スキップ、待機)
          :移動ルートの設定:◇ブレンドモード:加算
          :移動ルートの設定:◇速度:5
          :移動ルートの設定:◇プレイヤーに向ける
          :移動ルートの設定:◇SE:マリス・ヘイヴン SFX/戦闘/BSFX BLASTAWAY (100, 100, 0)
          ◆ループ
            ◆変数操作:#0194 SV: 自分のX = Math.round(this.character(0)._realX)
            ◆変数操作:#0195 SV: 自分のY = Math.round(this.character(0)._realY)
            ◆移動ルートの設定:このイベント (スキップ、待機)
            :移動ルートの設定:◇1歩後退
            ◆変数操作:#0244 SV: 吹き飛ばしX = このイベントのマップX座標
            ◆変数操作:#0245 SV: 吹き飛ばしY = このイベントのマップY座標
            ◆If:SV: 吹き飛ばしX = SV: 自分のX
              ◆If:SV: 吹き飛ばしY = SV: 自分のY
                ◆ループを抜ける
                ◆
              :End
              ◆
            :End
            ◆
          :上記を繰り返す
          ◆移動ルートの設定:このイベント (スキップ、待機)
          :移動ルートの設定:◇ブレンドモード:通常
          :移動ルートの設定:◇速度:4
          :移動ルートの設定:◇待機:5フレーム
          ◆スクリプト:this.character(0)._locked = false;
          ◆
        :End

4-敵がフォーム1または2の真前のタイルに立っている場合、なぜか吹き飛ばされないようです?少なくとも1回、1タイル離れた敵は正常に吹き飛ばされるのを見たことがありますが、敵が真前にいると一貫して吹き飛ばされません。

5-フォーム6のワanderingアタック(放浪攻撃)はほぼ機能しています!ただし、敵に直接接触せずに横を通り過ぎた場合でもヒットとして判定されているようです。

6-フォーム8のトラップでは、敵がトラップの側面に歩いて入り、当たったときに一瞬停止します(敵はトラップの上に立っているのではなく、横に立っているにもかかわらず)。その後、トラップをすり抜けて歩きます。ただし、≠6のチェックにより継続的なダメージを受けるので、それは素晴らしいことです。

  1. 素敵ですね!
  2. その通りです。
  3. Sを押す直前にパンチを出していませんか?敵は「攻撃中」がOFFになるか、ヒットカウントが増加したときにだけ再武装します。パンチがまだ発動中の状態でSを押すと、「攻撃中」がその間にOFFにならないため、直前にパンチした敵はまだ「ヒット済み」とみなされ、爆発はそれを貫通できません。フォーム1では衝突判定も配置されないため、パンチがまだ発動中の場合、爆発はパンチが止まった位置から始まるため、前方の敵をすり抜けることがあります。通常、その前方の敵こそが直前にパンチした敵であり、それが常にその敵に当たる理由です。

「攻撃中 = ON」の下に「ヒットカウント += 1」を追加すると、攻撃開始時にすべてが再武装します。フォーム4の攻撃方向(AtkDir)の分岐は、衝突判定を正しい方向にあなたの方へ戻します。以下は、両方を追加したフォーム1です:

◆If: VITAL SHAPE = 1
  ◆Control Variables: #0197 ATTACK TYPE = 5
  ◆Control Variables: #0225 Move Power = 130
  ◆Set Movement Route: Player (Wait)
    : Blend Mode: Screen
    : SE: Maris Haven SFX/Fighting/BSFX QUICK HIT (100, 100, 0)
    : Jump: +0, +0
    : Blend Mode: Normal
  ◆Common Event: SCREENSHAKE MEDIUM
  ◆Control Switches: #0181 ATTACKING = ON
  ◆Control Variables: #0242 Hit Count += 1
  ◆Control Variables: #0213 AtkX = Map X of Player
  ◆Control Variables: #0214 AtkY = Map Y of Player
  ◆Control Variables: #0215 AtkDir = Direction of Player
  ◆If: AtkDir = 2
    ◆Set Event Location: Attack collision, ({AtkX},{AtkY}) (Direction: Down)
  ◆End
  ◆If: AtkDir = 4
    ◆Set Event Location: Attack collision, ({AtkX},{AtkY}) (Direction: Left)
  ◆End
  ◆If: AtkDir = 6
    ◆Set Event Location: Attack collision, ({AtkX},{AtkY}) (Direction: Right)
  ◆End
  ◆If: AtkDir = 8
    ◆Set Event Location: Attack collision, ({AtkX},{AtkY}) (Direction: Up)
  ◆End
  ◆Set Movement Route: Attack collision (Wait)
    : SE: Maris Haven SFX/Fighting/BSFX SMACK (100, 100, 0)
    : Image: MH VitalAttacks1(6)
    : Transparent OFF
    : Speed: 6
    : 1 Step Forward
    : 1 Step Forward
    : Transparent ON
  ◆Control Switches: #0181 ATTACKING = OFF
  ◆Control Switches: #0182 MOVEMENT ATTACK = OFF
  ◆Control Switches: #0187 PREVENTER = OFF
◆End

フォーム2でも、「攻撃中 = ON」の下に同じヒットカウントの行を追加します。また、フォーム2の「イベント位置の設定」を、同じAtkX、AtkY、AtkDirの行と4つの分岐に置き換えると、常にあなたの向いている方向を向くようになります。ヒットカウントの行は、「攻撃中」をONにするすべての攻撃に入れるべきです。これにより、前の攻撃によって次の攻撃がブロックされることはありません。もし、パンチを出していないのにそれでも発生する場合、前方の敵はダメージを受けても動かないのか、それとも全くダメージを受けないのか確認してください。

  1. これはタイプ7ブロックにある「≤ 1」の部分です。以前、ウオーダー(徘徊敵)がタイル上に移動できなかった頃に、敵の隣接タイルをチェックしていました。現在は敵を通り抜けて歩くようになったため、「= 0」に変更し、実際に重なっているものだけをヒットさせるようにします:
◆If: SV: Distance = 0
  1. 連続ダメージが正常に動作しているとのこと、よかったですね。横からのヒットは、敵のマップX座標とY座標が、トラップに向かって歩み始めた瞬間にトラップ上にジャンプするため、見た目上は隣にいてもヒットが着弾してしまうようです。敵の位置を衝突判定と同じ方法で丸めることで、この問題を修正できるはずです。ヒットセクションの5行のダメージ処理の直上にある2行を、以下のように変更してください:
◆Control Variables: #0194 SV: My X = Math.round(this.character(0)._realX)
◆Control Variables: #0195 SV: My Y = Math.round(this.character(0)._realY)

これにより、すべての攻撃は敵がタイルの半分を超えて乗るまで待機するため、トラップ上だけでなく、他の場所でも整合性が良くなるはずです。タイプ6が「≠」チェックに含まれたことで、ヒットセクションの上部にあるタイプ6の再武装ブロックは機能しなくなっているため、あってもなくても構いません。

3-完全に機能しています!

4-まず第一に、ゲーム内のすべての攻撃技で、ATTACKING=ONに設定されているものには、その行の下にHit Count+1を記述する必要があるということですか?
第二に、フォーム1は完全に機能するようになりました!
フォーム2のS攻撃はほぼ完全に機能しています。
時折、複数の敵にヒットしますが、1体のみが一時的にノックバックされるだけです。
また、敵にヒットしてもノックバックされないことがあります。ある時は、ダメージもフラッシュエフェクトも一切ありませんでした。
さらに、これも別のケースで、敵が横に位置するとノックバックされることがあります。
しかし稀に、敵のグループの中で、横からその上に歩いてきて、ダメージを受けずに平気なケースを見たことがあります。
おそらく、背後のタイルに歩き始めたことで技術的に「互いをブロック」しているというバグかもしれませんが、正直わかりません。
すべてのS攻撃に、横に立っている敵がダメージを受けないようにする機能が必要ですか?それがどのように発生するのか、どうすればよいでしょうか?

5-完全に機能しています!

6-その2行は、正確にはどこに記述すればよいですか?攻撃タイプ4のダメージブロックの直上ですか?

3と5。いいですね!

  1. はい、各 ATTACKING = ON の直下です。注意すべき点は、攻撃開始時に1回だけ実行されるようにすることです。もしフレームごとに実行される場所に配置すると、すべての敵がフレームごとに再武装(リセット)されてしまいます。

Form 2の横ヒットは、6の2つの行で修正する部分です。これらはすべての攻撃で共有されるヒットセクションに配置されるため、一度設定すれば、すべてのS攻撃は敵がタイルの半分を超えて進入するまで待機するようになります。攻撃ごとに追加の設定は必要ありません。

一瞬だけノックバックされる敵は、停止ルール(stop rule)が関係している可能性があります。Sがヒットしたすべての敵は同じ方向に押し出されるため、2匹目の敵が1匹目の敵に衝突してそこで停止することがあります。ヒットしても動かないのも同じ現象かもしれません。もし壁や他の敵がその背後にあれば、最初のステップが失敗し、ループがすぐに終了するため、点滅してダメージを受けはしますが、位置は変わりません。

歩いてきてダメージを受けなかった敵、および全く点滅しなかった敵については、それらが同じS攻撃中にすでに1回ヒットしていたのではないかと考えています。Last Hit(最後のヒット)機能により、各敵は1回の攻撃で1回しかヒットを受けられないため、押し出されても衝突判定が残っている間に再び進入した敵はスキップされます。Form 2にはすでにHit Count(ヒット数)の行が追加されていますか? これがないと、S攻撃の直前にパンチした敵も同様にスキップされてしまいます。

  1. これらは、ATTACK TYPE = 2 ブロックの直後にある SV: My X = Map X of This Event および SV: My Y = Map Y of This Event の行と置き換わります。つまり、型4の上に位置し、その間に5つのダメージ計算行が挟まれます:
    ◆If: ATTACK TYPE = 2
      (unchanged)
    ◆End
    ◆Control Variables: #0194 SV: My X = Math.round(this.character(0)._realX)
    ◆Control Variables: #0195 SV: My Y = Math.round(this.character(0)._realY)
    ◆Control Variables: #0232 SV: Damage = Player ATK
    ◆Control Variables: #0232 SV: Damage *= Move Power
    ◆Control Variables: #0233 SV: Def Calc = SV: This Event DEF
    ◆Control Variables: #0233 SV: Def Calc += 100
    ◆Control Variables: #0232 SV: Damage /= SV: Def Calc
    ◆If: ATTACK TYPE = 4

上部の型6ブロック内のペアは、そのまま維持されます。

4- はい、おそらく「攻撃中=オン」の各インスタンスの下にヒットカウントを追加しました。
フォーム6の「移動攻撃」と、フォーム8の「画面全体攻撃」および「罠」にもヒットカウントを追加すべきでしょうか?
それらはおそらく最もユニークな動きなので、ただ確認しています。

フォーム2のS攻撃はまだ奇妙な状態です。
横方向のヒットは確かに修正されており、もう発生しません。
複数回、敵を攻撃した際、敵が非常に明確に私の真前のタイルにスナップし、その後ノックバックされませんでした。敵の背後に他の敵がいてもいなくても同様でした。
敵がノックバックされるかどうかは、されない場合と同じくらい一貫性がありません。

攻撃には「攻撃中オン」の下にヒットカウントがあります。

攻撃の衝突が消えるまでプレイヤーは立ち尽くすよう強制されますが、これが何かに関連するかはわかりません。

6- 敵は罠の横を止まらずに通過しますが、現在、罠の上に留まり続けた場合の一貫したダメージが停止したようです。敵は罠から離れてはじめて再びダメージを受けます。これはヒットカウントがないべきものなのでしょうか?

  1. はい、3つとも該当します。それぞれが開始された際に1回ずつです。

フォーム2では、次にスナップして動かない場合、点滅している間、どの方向を向いていますか?ノックバックでプレイヤーの方を向かせ、その後後退します。プレイヤーを向いている場合、押し返す方向は正しいですが、後退が何かによって妨げられています。プレイヤーを背に向けている場合、プレイヤーに向かって押し返されており、プレイヤーがそれをブロックしていることになります。

また、それは爆発発生前に歩行中だったもの(大きなスナップを行うもの)だけですか?それとも、すでにプレイヤーの前に立っている静止した敵も同じ動作をしますか?また、最後に確認したときから何度か変更されている現在のフォーム2のSブロックのスクリーンショットもいただければ、理解に役立ちます。

  1. ヒットカウントは関係ありません。それはトラップが解除される際に1回だけ実行されます。1回ヒットした後、敵が後退し始めるときにもう1回ヒットするのは、トラップのヒットが「最終ヒット」をマークしているためと思われます。上部のブロックは、敵が後退し始めた瞬間にこれをクリアします。丸みのある位置では、敵はまだ最初の半歩分トラップ上にいるため、もう1回ダメージを受けます。下部のチェックで「≠ 6」はまだ残っていますか?また、タイプ6のブランチに「Last Hit = Hit Count」という独自の行がないか確認してください。

4-ここではフォーム2のSブロックです。

◆If:VITAL SHAPE = 2
  ◆制御変数:#0197 ATTACK TYPE = 5
  ◆制御変数:#0225 Move Power = 130
  ◆移動経路の設定:プレイヤー (スキップ、待機)
  :移動経路の設定:◇ブレンドモード:画面
  :移動経路の設定:◇SE:Maris Haven SFX/Fighting/BSFX RISING (100, 150, 0)
  :移動経路の設定:◇1歩後退
  ◆移動経路の設定:プレイヤー (スキップ、待機)
  :移動経路の設定:◇速度:6
  :移動経路の設定:◇1歩前進
  :移動経路の設定:◇速度:4
  :移動経路の設定:◇ブレンドモード:通常
  ◆共通イベント:SCREENSHAKE MEDIUM
  ◆制御スイッチ:#0181 ATTACKING = ON
  ◆制御変数:#0242 Hit Count += 1
  ◆制御変数:#0213 AtkX = プレイヤーのマップX座標
  ◆制御変数:#0214 AtkY = プレイヤーのマップY座標
  ◆制御変数:#0215 AtkDir = プレイヤーの向き
  ◆If:AtkDir = 2
    ◆制御変数:#0210 ShieldY += 1
    ◆イベント位置の設定:攻撃衝突、({AtkX},{AtkY}) (方向:下)
    ◆
  :End
  ◆If:AtkDir = 4
    ◆制御変数:#0209 ShieldX -= 1
    ◆イベント位置の設定:攻撃衝突、({AtkX},{AtkY}) (方向:左)
    ◆
  :End
  ◆If:AtkDir = 6
    ◆制御変数:#0209 ShieldX += 1
    ◆イベント位置の設定:攻撃衝突、({AtkX},{AtkY}) (方向:右)
    ◆
  :End
  ◆If:AtkDir = 8
    ◆制御変数:#0210 ShieldY -= 1
    ◆イベント位置の設定:攻撃衝突、({AtkX},{AtkY}) (方向:上)
    ◆
  :End
  ◆移動経路の設定:攻撃衝突 (スキップ、待機)
  :移動経路の設定:◇歩行アニメーション ON
  :移動経路の設定:◇スクリプト:$gameMap.event(63).setPriorityType(2);
  :移動経路の設定:◇画像:MH VitalAttacks1(7)
  :移動経路の設定:◇透過 OFF
  :移動経路の設定:◇速度:6
  :移動経路の設定:◇1歩前進
  :移動経路の設定:◇SE:Maris Haven SFX/Fighting/BSFX BIG HIT 2 (100, 100, 0)
  :移動経路の設定:◇透明度:200
  :移動経路の設定:◇待機:60フレーム
  :移動経路の設定:◇透明度:150
  :移動経路の設定:◇待機:5フレーム
  :移動経路の設定:◇透明度:100
  :移動経路の設定:◇待機:5フレーム
  :移動経路の設定:◇透明度:50
  :移動経路の設定:◇待機:5フレーム
  :移動経路の設定:◇歩行アニメーション OFF
  :移動経路の設定:◇透過 ON
  :移動経路の設定:◇スクリプト:$gameMap.event(63).setPriorityType(1);
  :移動経路の設定:◇透明度:255
  :移動経路の設定:◇ブレンドモード:通常
  ◆制御スイッチ:#0181 ATTACKING = OFF
  ◆制御スイッチ:#0182 MOVEMENT ATTACK = OFF
  ◆制御スイッチ:#0187 PREVENTER = OFF
  ◆
:End

私から1タイル離れた敵が、攻撃衝突に近づきすぎた瞬間、私の真前に瞬時に移動するのを見ました。敵は私の方を向いており、後ろに吹き飛ばされたようには見えませんでしたが、正確な記憶はありません。

ある状況では、3体の敵がダメージを受けました。1体目と3体目は吹き飛ばされましたが、2体目は吹き飛ばされませんでした。
その後すぐに、2体の敵が連続してダメージを受けましたが、1体目は吹き飛ばされ、2体目は吹き飛ばされませんでした。

全体的には正常に動作しているようですが、いくつかの不自然な挙動があります。

6-はい、攻撃タイプ6のダメージ処理には「最後のhit=hit count」の行があります。私はそれを削除しましたが、敵はトラップの上に立ったままダメージを1回しか受けません。再びダメージを受けるのは、彼らが後ろにステップを踏み戻した時だけです。

  1. このブロックは正常に動作しているように見えます。そこで、停止ルールが再び適用されているが、より狭い範囲で機能しているのではないかと疑問に思っています。衝突は1秒以上そのタイルに留まるため、最初の敵が打ち出された後も、他の敵が次々と衝突します。衝突したものはすべて同じ方向に押し飛ばされるため、2番目の敵の最初のステップは、まだ飛行中の1番目の敵の経路の上に着地します。1番目の敵は経路ごとに1タイルずつ移動し、2番目の敵がステップを試みる際にまだ次のタイルをクリアしていない場合、そのステップは失敗し、ループはすぐに終了します。これは、1番目と3番目の敵が打ち出されるが、2番目は打ち出されないという現象に当てはまります。なぜなら、3番目の敵が衝突した時点では、1番目の敵はすでに遠くへ去っていたからです。

もし、諦める前に1回のリトライを試すようにしたらどうでしょうか?「SV: KB Retry」は新しい自己変数です。ループの直上でこれを0に設定し、タイプ5のブランチにある「ループを中断」を以下のように置き換えます:

◆もし: SV: KB Retry = 0

◆変数の制御: #0XXX SV: KB Retry = 1

◆待機: 10フレーム

: それ以外

◆ループを中断

◆終了

これにより、1回ステップがブロックされた場合、その状態を待機して再試行できるようになります。ただし、壁に衝突した敵は、終了するまでにさらに10フレーム間点滅し続けるという注意点があります。

  1. まだ1回しかヒットしないため、何かしらの要因で「最後のヒット」が設定されているようです。「≠ 6」は「≠ 3」の中にネストされていますか?「≠ 3」が「≠ 1」の中にネストされているのと同じように、「最後のヒット」の行がその3つすべての中に含まれているのでしょうか?もし「≠ 6」が他の2つの下に独立したIf文としてある場合、「最後のヒット」の行は「≠ 6」がチェックされる前に実行されてしまいます。すでにネストされている場合、ヒットセクションの下部のスクリーンショットがあると助けになります。

4-これはタイプ5の他の攻撃にも影響しますか?また、長い待機時間と点滅は、10フレームを1フレームにすることで解消されますか?

タイプ2のSを完全に書き換えるか、問題点を除去するために何らかの変更を加えた方が簡単な場合、ある程度であればそれで構いません。6についても同様です。

(追記:そうは言っても、問題が止まったようなので、少し楽観しすぎだったかもしれません。ただし、敵が衝突判定タイルに歩み寄ったとき、タイルに対してまだ視覚的な「カクつき」が残っているようです。しかし、もしそれがタイルの半分にしか適用されていないのであれば、ノックバックされるためにはそこに存在しなければならないため、これ以上どうすることもできないのでしょう。)

6-

何かご意見はありますか?

  1. 停止してよかったですね!もしリトライを追加する前に停止していたのであれば、リトライは外しておいたほうがいいでしょう。もし追加したのであれば、これはノックバックのステップがブロックされた場合にのみ機能するため、自由に移動する他のタイプ5の攻撃には影響しません。ただし、1フレームまで下げるのはやめたほうがいいです。速度5の場合、敵はタイルを横断するのに約8フレームかかるため、1フレームでは前の敵が避けるには時間が足りず、リトライは再び失敗してしまいます。8フレームくらいあれば十分でしょう。

スナップはそのままでも問題ありません。これは敵がステップの途中でヒットしたときだけ表示されます。なぜなら、押される前にタイル上に配置されなければならないからです。

  1. このネストは正しいように見えるので、下部の「Last Hit」行はすでにトラップを捕捉していないはずです。試しにクイックテストを行ってみてください。「If: SV: Last Hit ≠ Hit Count」の直下に、以下を追加してください:
◆If: ATTACK TYPE = 6
  ◆Play SE: Cursor1 (90, 100, 0)
◆End

その後、敵をトラップの上に立たせてみてください。もしビープ音が連続して鳴る場合は、ヒットが通っており、下部のどこか(おそらく位置チェック)がそれを阻止していることを意味します。もし一度ビープ音が鳴って静かになる場合は、他の何かがまだ「Last Hit」を設定しており、敵のページ内で他の「SV: Last Hit」行を探すべきです。

つまり、敵側のコード全体で SV: Last Hit = Hit Count のインスタンスは1つだけ存在するということでしょうか?

SV: Damage や Def Calc などの設定行のすぐ下にある Attack Type 4 に1つあります。
さらにその下の Attack Type 7 にも1つあります。
そして、ダメージ計算が行われる部分にある Attack Type 0 にも1つあります。

いいえ、タイプ4と7は自身のチェックを維持する必要があります。これらは位置チェックの外側に位置しているため、下部のチェックはそれらに到達せず、それぞれ独自のチェックが必要です。

ただし、タイプ0のものは除外できます。下部のチェックはすでにタイプ0をカバーしています。これがトラップの問題にも関係しているのかもしれません。もしその行が「If: ATTACK TYPE = 0」の分岐内に収められていない場合、トラップを含むすべての攻撃に対して実行され、即座にヒットとしてマークされてしまいます。これを削除して、トラップが再び連続してヒットするかどうか試してみてください。

いいえ、まだ踏んでいると1ポイントのダメージしか受けません。

これが私のコードです。実際にビープ音も鳴っていないようです。

ビープ音が鳴らないので、少なくとも最初のヒット時ですら鳴らないことから、トラップはタイプ6としてヒットしていないように思えます。トラップが設置された状態のときに「ATTACK TYPE」がまだ3のままであるのか、それとも何かがそれを後で変更するのか気になります。タイプ3のブランチは1回しかヒットしないので、それが当てはまる可能性があります。

Form 8のトラップブロックにある「ATTACK TYPE」の行が6になっているか確認してください。もし6になっているなら、「If: ATTACK TYPE = 6」の外に「Play SE」を移動して、あらゆる攻撃でビープ音が鳴るようにしてみてください。もしそれでビープ音が鳴るなら、トラップが設置されている間にタイプが変更されていることになります。トラップブロックのスクリーンショットも役立つかもしれません。

そう、以前も言ったように、いつも小さなことでつまづいちゃうんですよね。
設定が7になってたんですが、それを6に変更したら、無事動作するようになりました。

そんなことで気づくなんてちょっと恥ずかしいですが、少なくとも直りました。本当にありがとうございます。

あと少しで、敵の攻撃機能に移る前に、雑多なバトルシステムの残りの問題が片付きます。それらを一括りにして、まとめて送ろうと思います。

今のところ、敵の攻撃能力に移行する前に解決すべき雑多なバトルシステムの課題はこれらです。1、2、6はすべて関連しています。

1-フォーム7のA(アクション)計算式です。間違っているのは承知していますが、数値の設定方法が分かりません、笑。攻撃力を50%強化し、防御力を35%低下させ、タイマーが切れたら通常値に戻したいと考えています。

2-各フォームごとにプレイヤーのステータスを変更するにはどうすればよいでしょうか?つまり、一部のフォームでは攻撃力(ATK)や防御力(DEF)が高くなったり低くなったりするようにしたいです。ステータス強化がアクティブな際にスイッチによってオフになる、フォーム変数に基づいてステータスを設定する並列処理を作成することは可能でしょうか?(HPは変更しません。)

3-フォーム5のAとSのアクションは未完了です。これらは最後に保存されています。というのも、このフォームはかなり複雑だからです。現在、共同開発者と詳細を調整しているところなので、これらについては後ほど対応することになります。

4-敵のスポーンシステムが少しおかしいです。画面上に同時に存在する敵の最大数を6体に制限し、6体いる間はそれ以上スポーンさせたくないです。敵が倒されるまで待機させます。現状では、敵を1体倒すごとに、最大で2体までスポーンしてしまいます。

  ◆コメント:このコードブロックは、画面上に敵が多すぎるときにこのイベントを一時停止します。
  :コメント:
  :コメント:画面上の敵が6体未満になったら、処理を続行できるようになります。
  :コメント:
  :コメント:vvvvv
  ◆ラベル:チェック
  ◆条件分岐:画面上の敵数 RN? ≧ 2
    ◆コメント:これが真の場合、何もしません。6体以上は多すぎます。
    :コメント:
    :コメント:覚えておいてください、これらのイベントがスポーンするたびに
    :コメント:画面上の敵数 RN は1増え、敵が倒されると1減らされます。
    ◆コメント:このコードブロックは、イベントが3体目の敵が画面上にいるかどうかを
    :コメント:再確認するまでの待機時間を決定します。
    ◆変数の操作:#0191 SV: どのくらい待つか? = 1〜6の乱数
    ◆条件分岐:SV: どのくらい待つか? = 1
      ◆待機:60フレーム
      ◆
    :分岐終了
    ◆条件分岐:SV: どのくらい待つか? = 2
      ◆待機:120フレーム
      ◆
    :分岐終了
    ◆条件分岐:SV: どのくらい待つか? = 3
      ◆待機:180フレーム
      ◆
    :分岐終了
    ◆条件分岐:SV: どのくらい待つか? = 4
      ◆待機:240フレーム
      ◆
    :分岐終了
    ◆条件分岐:SV: どのくらい待つか? = 5
      ◆待機:270フレーム
      ◆
    :分岐終了
    ◆条件分岐:SV: どのくらい待つか? = 6
      ◆待機:300フレーム
      ◆
    :分岐終了
    ◆ラベルへジャンプ:チェック
    ◆
  :それ以外
    ◆コメント:このコードブロックは、イベントが次のイベントに進むまでの
    :コメント:待機時間を決定し、スポーンが固まらないようにします。
    ◆変数の操作:#0191 SV: どのくらい待つか? = 1〜6の乱数
    ◆条件分岐:SV: どのくらい待つか? = 1
      ◆待機:60フレーム
      ◆
    :分岐終了
    ◆条件分岐:SV: どのくらい待つか? = 2
      ◆待機:120フレーム
      ◆
    :分岐終了
    ◆条件分岐:SV: どのくらい待つか? = 3
      ◆待機:180フレーム
      ◆
    :分岐終了
    ◆条件分岐:SV: どのくらい待つか? = 4
      ◆待機:240フレーム
      ◆
    :分岐終了
    ◆条件分岐:SV: どのくらい待つか? = 5
      ◆待機:270フレーム
      ◆
    :分岐終了
    ◆条件分岐:SV: どのくらい待つか? = 6
      ◆待機:300フレーム
      ◆
    :分岐終了
    ◆ラベルへジャンプ:GO ONWARD TWO
    ◆
  :分岐終了
  ◆ラベル:GO ONWARD TWO
  ◆コメント:-
  :コメント:-
  :コメント:-
  :コメント:-
  :コメント:-
  :コメント:-
  ◆コメント:このイベントは、これらのイベントが正常にスポーンするたびに1増える
  :コメント:変数の数を参照して、すでに6体がスポーンしているかどうかを確認します。
  :コメント:6体がすでにスポーンしている場合、このイベントは自身がスポーンするかどうか
  :コメント:判定します。スポーンしないことになった場合、「倒した敵」に1を加えます。
  :コメント:この変数が12に達すると、プレイヤーの勝利となります。
  ◆条件分岐:スポーンした敵の数 ≧ 6
    ◆変数の操作:#0187 スポーンするか? = 1〜2の乱数
    ◆条件分岐:スポーンするか? = 1
      ◆ラベルへジャンプ:GO ONWARD THREE
      ◆
    :それ以外
      ◆変数の操作:#0188 倒した敵 += 1
      ◆イベント処理を終了
      ◆
    :分岐終了
    ◆
  :それ以外
    ◆ラベルへジャンプ:GO ONWARD THREE
    ◆
  :分岐終了
  ◆ラベル:GO ONWARD THREE
  ◆コメント:この待機の直後、敵は画面上に存在するものとしてカウントされます。
  :コメント:これにより、スポーンの集中を防ぎます。
  ◆変数の操作:#0184 画面上の敵数 RN? += 1

5-矢印キーでプレイヤーが移動できないようにするボタン切替機能を実装したいです。つまり、キーを押したときにその場で向きを変えるだけにしたいです。並列処理とスイッチを使用してこれを行うことは可能でしょうか?

6-他のステータス強化とは独立して、プレイヤーのステータスを強化する特定のアイテムを実装したいです。例えば、プレイヤーがフォームアクションを使用して攻撃力を10秒間1.5倍にし、その後リセットするとします。同時に、同じく攻撃力を10秒間1.5倍にするアイテムを使用することも可能です。これらは互いに独立しているようにしたいです。つまり、一方のリセットがもう一方の強化効果を即座に相殺しないようにします。