Страница 1 из 1

Типы брони/атаки

СообщениеДобавлено: 17 сен 2017, 22:34
olimpset
В голову не приходит, как с помощью ООП (нужных паттернов) сделать механику повреждений, где урон зависит от типов оружия и брони.

К примеру есть танк. В него попала пуля из винтовки, урон 1 хп.
В танк попал снаряд - 50хп.
Огнемет - 0 хп.
То бишь, у танка явно толстая броня и стоит иммунитет на обычные пули.
Так вот как сделать это. Что бы при атаке,учитывался тип брони и тип атаки.
Кроме как switch-case в голову ничего не приходит, уверен, есть лучшие решения.
Подскажите паттерны, или псевдо кодом поясните.

Re: Типы брони/атаки

СообщениеДобавлено: 18 сен 2017, 08:31
IDoNotExist
Если надо реализовать прям разное поведение для разных типов снаряда, то это вроде как называется "стратегия", а именно, создаёшь базовый абстрактный класс/интерфейс снаряда, в нём создаёшь метод, который будет вызываться при попадании в "броню":
Синтаксис:
Используется csharp
public abstact class ProjectileBase
{
    public int damage = 10;

    public abstract void OnTankHit(TankHealth th);
}
 


Затем реализуешь конкретные классы снарядов и прописываешь в каждом своё поведение по отношению к "броне":
Синтаксис:
Используется csharp
public class RifleBullet : ProjectileBase
{
    public override void OnTankHit(TankHealth th)
    {
        int realDamage = Mathf.Max(0, damage - th.armor);
        th.OnDamage(damage);
    }
}

public class Flame: ProjectileBase
{
    public override void OnTankHit(TankHealth th)
    {
        th.OnDamage(0);
    }
}

 


Но это один фиг не является панацеей от "некрасивого" кода, у тебя вполне могут возникнуть задачи в которых такой вариант будет только костылём. Так что вполне возможно что switch case не такой уж плохой вариант.

Re: Типы брони/атаки

СообщениеДобавлено: 18 сен 2017, 10:21
snezhok_13
Сделать класс Damage, в нем поле enum DamageType (в котором Fire, Grenade, TankWeapon, RegularBullet и тп).
В обработчике DealDamage проверяешь Vulnerability к типу (можно сделать это Dictionary<DamageType, float>). В float нормализованный фактор урона - 0 неуязвим, 1 полностью уязвим.

Такой подход позволит броню сделать, исчерпаемую, неисчерпаемую, бонусы какие угодно.

Re: Типы брони/атаки

СообщениеДобавлено: 18 сен 2017, 16:17
olimpset
snezhok_13 писал(а):Сделать класс Damage, в нем поле enum DamageType (в котором Fire, Grenade, TankWeapon, RegularBullet и тп).
В обработчике DealDamage проверяешь Vulnerability к типу (можно сделать это Dictionary<DamageType, float>). В float нормализованный фактор урона - 0 неуязвим, 1 полностью уязвим.

Такой подход позволит броню сделать, исчерпаемую, неисчерпаемую, бонусы какие угодно.


Возможно этот вариант будет лучший. А может и человека, который ответил выше (с паттерном стратегия). Подумаю еще.