C#Events更加挣扎

时间:2018-04-20 16:23:16

标签: c#

我正在制作一个简单的小程序/游戏,我正在模拟对峙。我想要一个事件在其中一个敌人对象瞄准另一个时触发(以便它可以相应地调整其信任属性)。

在' Enemy'上课时,我已经提到了以下内容(我已经删除了具有属性和构造函数的部分,因此这并没有占用太多空间):

    public event EventHandler RexAim;
    public void OnRexAim()
    {
        if (RexAim != null)
            RexAim(this, EventArgs.Empty);
    }

    public void RexAimAt()
    {
        Console.WriteLine("This is the aiming method leaping into action.");
        OnRexAim();
    }

然后在Program类中,我有这个:

class Program
{
    static void Main(string[] args)
    {
        // Constructing the characters so I can use them in things:
        Enemy rex = new Enemy(100, -100, 5, 2, "Rex");
        Enemy pearl = new Enemy(100, -50, -5, 0, "Pearl");
        Enemy archie = new Enemy(75, -100, 0, 3, "Archie");
        Enemy betty = new Enemy(100, -75, 0, 5, "Betty");

        pearl.RexAim += HandleRexAim;

        rex.RexAimAt();

    }

    public static void HandleRexAim(object sender, EventArgs eventArgs)
    {
        Console.WriteLine("This should show up if the event worked properly.");
    }

}

但是当我运行它时,我得到的只是"这是瞄准方法跃进行动"显示。

我确定我在这里犯了一个非常基本的错误(我是初学者),但我无法解决那些不能正常工作的问题。

提前感谢您对这么新的人的耐心!

2 个答案:

答案 0 :(得分:2)

有点不清楚你在这里想要实现的目标,但我怀疑事件不一定是正确的工具。如果我理解,您需要Enemy才能AimAt另一个Enemy并且会更新Trust中的某个州(您称之为Enemy)被瞄准。在我看来,更好的方法是做类似的事情:

public class Enemy
{
    public void AimAt(Enemy opponent)
    {
        Console.WriteLine($"{Name} is aiming at {opponent.Name}");
        opponent.AimedAt(this);
    }

    private void AimedAtBy(Enemy opponent)
    {
        // update trust between this and opponent
        Console.WriteLine($"{Name} trusts {opponent.Name} less because they are pointing a gun at them!");
    }
}

然后你会做类似的事情:

Enemy rex = new Enemy(100, -100, 5, 2, "Rex");
Enemy pearl = new Enemy(100, -50, -5, 0, "Pearl");
Enemy archie = new Enemy(75, -100, 0, 3, "Archie");
Enemy betty = new Enemy(100, -75, 0, 5, "Betty");

然后:

rex.AimAt(pearl);

应输出:

Rex is aiming at Pearl
Pearl trusts Rex less because they are pointing a gun at them!

有很多变量可能会进入这样的设计,但它是一个起点。

Eric Lippert撰写的这个系列是一个非常好的资源:

https://ericlippert.com/2015/04/27/wizards-and-warriors-part-one/

答案 1 :(得分:0)

    pearl.RexAim += HandleRexAim;

    rex.RexAimAt();

这是你的问题。你附加了pearl.RexAim活动。然后你调用rex.RexAimAt,它会触发rex.RexAim事件,它没有附加任何内容。

要查看您期望的输出,请将其更改为“pearl.RexAimAt();”。

请阅读@Matt Burland的答案,了解有关事件/建议的更深入信息。