如何在 C# 中为 2D 游戏编写简单的攻击逻辑

本文关键字:简单 攻击 游戏 中为 2D | 更新日期: 2023-09-27 18:34:17

另外,攻击有效,但是,主要问题是我应该使武器攻击 在一个方向上。

嗨,我正在制作一款回合制动作游戏,玩家可以在其中移动或攻击敌人,使用某种武器。敌人只是使用一个简单的攻击逻辑来检查玩家是否附近,如果是这样,就会让他受到伤害。Near(( 使用 Math.Abs 来查找绝对距离。

这是用于敌人攻击的旧 Near(( 方法:

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 类将玩家位置传递到该方法中,和它自己的攻击范围作为一个int,然后根据它自己的位置进行检查,并破坏播放器,如果返回 true。

但是,玩家攻击更为复杂。他的武器必须检查附近((距离首先在给定的方向上。所以我需要编写一个新的重载 Near(( 方法来使用玩家的武器攻击逻辑。我不知道该怎么做。不知何故,玩家的武器攻击方法应该将参数传递到以下 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(( 方法和重载的 Near(( 方法。顺便说一下,我正在将这作为Oreilly Headfirst C#中的教程,第480页。

*原始继承的 Move(( 方法很简单;它只是根据来自方向枚举的 4 个方向之一的输入,在某个方向上更新继承它的对象的位置字段。

我想自己做这个,但真的不知道攻击逻辑应该如何工作!谁能给我一些提示来指出我正确的方向?我不知道他们希望我制作新的 Move(( 重载方法是为了什么。玩家应该跳到他攻击的点吗?还是它有其他功能?谢谢!

如何在 C# 中为 2D 游戏编写简单的攻击逻辑

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"例程是多余的 - 可以与敌人保持距离。位置和目标,并且需要很长时间才能检查每个距离的敌人。另外,如果路上有障碍怎么办。我认为被覆盖的 Near(( 函数中的"距离"应该是"方向",这将回答您的问题。我建议:

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

此外,"move(("函数在距离"循环中被调用,因此它的行为是不可预测的。