Как написать простую логику атаки для 2D-игры на C #?

1

Кроме того, атака работает, однако, основная проблема заключается в том, что я должен сделать атаку оружия в ОДНОМ НАПРАВЛЕНИИ.

Привет, я делаю поворотную игру, в которой игрок может либо двигаться, либо атаковать врагов, используя определенное оружие. Враги просто используют простую логику атаки, проверяя, находится ли игрок поблизости, а затем заставляют его нанести урон, если это так. Рядом() использует Math.Abs, чтобы найти абсолютное расстояние.

Вот старый метод Near(), используемый для атаки Enemy:

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 С#, p. 480, кстати.

* Исходный унаследованный метод Move() прост; он просто обновляет поле местоположения объекта, которое наследует его в направлении, основанном на вводе одного из 4 направлений из перечня направлений.

Я хочу сделать это сам, но на самом деле не могу понять, как должна работать логика атаки! Может ли кто-нибудь дать мне несколько намеков, чтобы указать мне в правильном направлении? Я не знаю, что они хотят, чтобы я сделал новый метод Move() overloaded for. Предполагается ли игрок прыгать до того места, где он атакует? Или у него есть другие функции? Благодарю!

Теги:
object
oop
adventure

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;
            }

Это действительно плохо. Процедура "для" избыточна - расстояние от врага может быть достигнуто. Место и цель, и навсегда потребовалось бы проверить каждого врага на каждом расстоянии. Плюс, если есть препятствия на пути. Я думаю, что "расстояние" в переопределенной функции Near() должно быть "направлением", которое отвечало бы на ваш вопрос. Я предлагаю:

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

Также функция "move()" вызывается внутри цикла "расстояние", и поэтому ее поведение непредсказуемо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню