我正在用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语句时,播放器getCard
在getDefenseCard
返回时收到的值为{{ 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
。如果有人能向我解释为什么会这样,以及如何解决它,我将不胜感激。谢谢。
答案 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;
}
}