XNA游戏程序中应该使用非null值清楚返回的函数返回null

时间:2014-01-03 10:30:08

标签: c# xna

我正在用C#编写XNA程序。

我有一个Game班,一个名为Player的班级和一个名为Attack的班级。 当我在我的Game类中构建攻击时,我将游戏实例作为参数传递出来:

Attack attack(this);

在攻击中,我有一个名为defender的Player实例。 Player类有getDefenseCard(Game game)方法。

在Attack中,我有一个defender.getDefenseCard(game)的调用,其中game是我在构造函数中传递给Attack的游戏的相同实例。

在玩家getDefenseCard(Game game)内我打电话给game.getCard(),这是我的游戏类中的一种方法,用于检查用户是否点击了卡片,如果是,则返回点击的卡片。这是通过检查鼠标的位置以及是否有点击来完成的。

行为正在寻找的是玩家选择的卡将被一直返回到处理它的攻击。这实际上是我得到的行为。

然而,我遇到了一个问题。我想让玩家选择不选卡。为了实现这一点,我创建了一个名为Card的{​​{1}}对象作为Game类的属性,并将其初始化为一个值。计划是当我的攻击对象收到此特定卡时,它将处理无防御响应。

为了获得攻击对象的noDefense,我创建了一个布尔值和一个按钮。按下按钮时,布尔值设置为true。在noDefense内,我首先检查这个布尔值是否为真。如果是这样,我将其设置为false并返回noDefense卡。

我遇到的问题是,当按钮工作且getCard方法确实输入if语句时,播放器getCardgetDefenseCard返回时收到的值为{{ 1}}对象。这令人费解,因为我正在返回一个非空的Card对象。

这是一个简化的代码,可以使整个情况的叙述更少,更具说明性:

getCard

同样,问题是我确实知道该按钮有效,null输入第一个条件,但由于某种原因,它返回class Game : Microsoft.Xna.Framework.Game { bool noDefenseSelected = false; Card noDefenseCard; Attack attack = new Attack(this); Button refuseDefense = new Button(); protected override void Initialize() { noDefenseCard = new Card("no defense"); refuseDefense.onClick += noDefenseButtonClicked; } protected override void Update(GameTime gameTime) { Attack.resolve(); } public Card getCard() { if (noDefenseSelected) { noDefenseSelected = false; return noDefenseCard; } if (mouseNotOverCard()) { return null; } if (mouseNotClicked()) { return null; } return getCardFromClick(); } public void noDefenseButtonClicked(Button b) { noDefenseSelected = true; } } class Player { public Card getDefenseCard(Game game) { return game.getCard(); } } class Attack { Game game; Player defender = new Player(); public Attack(Game game) { this.game = game; } public void resolve() { Card card = defender.getDefenseCard(game); if (card != null) { dealWithDefenseCard(card); } } } 而不是getCard。如果有人能向我解释为什么会这样,以及如何解决它,我将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:0)

我已经删除了很多东西(无论如何都没有在你发布的代码中调用)来编译它,但是一般的结构和你发布的一样,它可以在LinqPad中使用。

我觉得你没有发布的一些代码是导致问题的原因......

 void Main()
    {
        Game g= new Game();
        g.Initialize();
        Attack a = new Attack(g);
        Card c = a.resolve();
        Console.WriteLine(c.name); //prints "no defense"

    }

//just a guess as to what Card looks like.
    public class Card
    {
        public string name{get;set;}
        public Card(string name){this.name=name;}
    }

    public class Game 
    {
        bool noDefenseSelected = false;
        Card noDefenseCard;

//this is manually called in this example
        public void Initialize()
        {
           noDefenseCard = new Card("no defense");
           noDefenseSelected=true;
        }   

        public Card getCard()
        {
          if (noDefenseSelected)
          {
             noDefenseSelected = false;
             return noDefenseCard;
          }
         //all other cases return null in this example.
          return null;
        }

    }

      public  class Player
      {
         public Card getDefenseCard(Game game)
         {
           return game.getCard();
         }
      }

      public class Attack
      {
         Game game;
         Player defender = new Player();

         public Attack(Game game)
         {
            this.game = game;
         }

         public Card resolve()
         {
            Card card = defender.getDefenseCard(game);
//returning card in this case for the example so it can be printed.
            return card;
           }
}