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() 方法。我这样做是作为 Oreilly Headfirst C#, p. 中的教程。顺便说一句,480。

*原来继承的Move()方法很简单;它只是根据来自 Direction Enum 的 4 个方向之一的输入更新继承它的对象的位置字段。

我想自己做,但真的不知道攻击逻辑应该如何工作!谁能给我一些提示以指出正确的方向?我不知道他们希望我为什么创建新的 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()”函数在距离循环内被调用,因此它的行为是不可预测的。

于 2014-12-16T06:19:35.253 回答