Исправление ошибки: не может ссылаться на тип через выражение - PullRequest
1 голос
/ 08 апреля 2010

Я занимаюсь разработкой игры. Я хочу, чтобы у игровых сущностей были свои функции Damage(). При вызове они подсчитают, какой урон они хотят нанести:

public class CombatantGameModel : GameObjectModel
{
    public int Health { get; set; }

    /// <summary>
    /// If the attack hits, how much damage does it do?
    /// </summary>
    /// <param name="randomSample">A random value from [0 .. 1]. Use to introduce randomness in the attack's damage.</param>
    /// <returns>The amount of damage the attack does</returns>
    public delegate int Damage(float randomSample);

    public CombatantGameModel(GameObjectController controller) : base(controller) {}
}

public class CombatantGameObject : GameObjectController
{
    private new readonly CombatantGameModel model;
    public new virtual CombatantGameModel Model
    {
        get { return model; }
    }

    public CombatantGameObject()
    {
        model = new CombatantGameModel(this);
    }
}

Однако, когда я пытаюсь вызвать этот метод, я получаю ошибку компилятора:

    /// <summary>
    /// Calculates the results of an attack, and directly updates the GameObjects involved.
    /// </summary>
    /// <param name="attacker">The aggressor GameObject</param>
    /// <param name="victim">The GameObject under assault</param>
    public void ComputeAttackUpdate(CombatantGameObject attacker, CombatantGameObject victim)
    {
        if (worldQuery.IsColliding(attacker, victim, false))
        {
            victim.Model.Health -= attacker.Model.Damage((float) rand.NextDouble()); // error here
            Debug.WriteLine(String.Format("{0} hits {1} for {2} damage", attacker, victim, attackTraits.Damage));
        }
    }

Ошибка:

«Урон»: не может ссылаться на тип через выражение; пытаться 'HWAlphaRelease.GameObject.CombatantGameModel.Damage' вместо

Что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 08 апреля 2010

Вам нужно связать функцию с этим делегатом, прежде чем вы сможете ее вызвать.

Здесь вам не нужен делегат - с вашим кодом вам лучше иметь функцию Damage в качестве реализации интерфейса или объявить ее абстрактной (или виртуальной) в базе.GameObjectModel class, чтобы производные классы могли (или должны) переопределять его.

1 голос
/ 08 апреля 2010

На самом деле вы объявляете вложенный делегат тип с именем Damage, а не экземпляр этого типа. Думайте об этом как о разнице между классом и экземпляром класса.

Чтобы фактически использовать свой делегат, вы должны объявить поле, свойство или событие для его хранения.

Например:

// note that the delegate can be declared either in a class or outside of it.
public delegate int Damage(float randomSample);

public class CombatantGameModel /* ... */
{
    /* ... */

    public Damage DamageCalculator { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...