1

また、攻撃は機能しますが、主な問題は、武器攻撃を一方向に行うことになっていることです。

こんにちは、プレイヤーが特定の武器を使用して敵を移動または攻撃できるターン ベースのアクション ゲームを作成しています。敵は、プレイヤーが近くにいるかどうかを確認し、近くにいる場合はダメージを与えるという単純な攻撃ロジックを使用するだけです。Nearby() は Math.Abs​​ を使用して絶対距離を見つけます。

Enemy 攻撃に使用される古い Nearby() メソッドは次のとおりです。

public bool Nearby(Point locationToCheck, int distance)
        {
            if (Math.Abs(location.X - locationToCheck.X) < distance &&
            (Math.Abs(location.Y - locationToCheck.Y) < distance))
            {
                return true;
            }
            else
            {
                return false;
            }
        }

したがって、上記のメソッドを含む Enemy クラスは、Player の位置と自身の攻撃範囲を int としてメソッドに渡し、それを自身の位置と比較してチェックし、true を返す場合はプレイヤーにダメージを与えます。

ただし、プレイヤーの攻撃はより複雑です。彼の武器は、最初に指定された方向の Nearby() 距離をチェックする必要があります。そのため、オーバーロードされた Nearby() メソッドを新たに作成して、プレイヤーの武器攻撃ロジックを操作する必要があります。これを行う方法がわかりません。どういうわけか、プレイヤーの Weapon Attack メソッドは、パラメーターを次の DamageEnemy() メソッドに渡すことになっています。

protected bool DamageEnemy(Direction direction, int radius, int damage, Random random) 
{
Point target = game.PlayerLocation;
    for (int distance = 0; distance < radius; distance++) {
        foreach (Enemy enemy in game.Enemies) {
            if (Nearby(enemy.Location, target, distance)) {
                enemy.Hit(damage, random);
                return true;
            }
        }
        target = Move(direction, target, game.Boundaries);
        }
                return false;
}

この DamageEnemy メソッドは、前述の Move() メソッドとオーバーロードされた Nearby() メソッドという 2 つの新しいオーバーロード メソッドに依存しています。これは、Oreilly Headfirst C# のチュートリアルとして行っています。ちなみに480。

*元の継承された Move() メソッドは単純です。Direction Enum からの 4 つの方向のうちの 1 つの入力に基づいて、方向を継承するオブジェクトの location フィールドを更新するだけです。

私はこれを自分でやりたいのですが、攻撃ロジックがどのように機能するはずなのか本当にわかりません! 誰かが私を正しい方向に向けるためのヒントを教えてもらえますか? 新しい Move() オーバーロードされたメソッドを何のために作成してほしいのかわかりません。プレイヤーは攻撃するポイントにジャンプすることになっていますか? それとも何か他の機能がありますか?ありがとう!

4

1 に答える 1

1
for (int distance = 0; distance < radius; distance++) {
        foreach (Enemy enemy in game.Enemies) {
            if (Nearby(enemy.Location, target, distance)) {
                enemy.Hit(damage, random);
                return true;
            }

これは本当に悪いです。「for」ルーチンは冗長です。敵の位置とターゲットから距離を取得できます。距離ごとに各敵をチェックするには永遠に時間がかかります。さらに、途中に障害物がある場合はどうなりますか。オーバーライドされた Nearby() 関数の「距離」は、質問に答える「方向」である必要があると思います。私は提案します:

    foreach (Enemy enemy in game.Enemies) {
        if (Nearby(enemy.Location, target, radius, direction)) {
            enemy.Hit(damage, random);
            return true;
        }

また、「move()」関数は distance ループ内で呼び出されるため、その動作は予測できません。

于 2014-12-16T06:19:35.253 に答える