2013-03-13 77 views
2

我试图做的热门游戏“Ruzzle”为PC见:C#窗体,属性不起作用?

enter image description here

我被困在一个非常愚蠢的错误,我认为,但由于某种原因,它看起来像一个属性是不加工!

我有一个名为“check”的类,它有一个名为Used的布尔属性。如果设置为true,背景将从白色变为橙色。这是通过以下实现的:

bool _used; 

public bool Used 
{ 
    get { return _used; } 
    set { _used = value; Invalidate(); } 
} 

void Check_Paint(object sender, PaintEventArgs e) 
{ 
    Graphics area = e.Graphics; 

    if (_used==false) 
    { 
     area.FillRectangle(Brushes.White, 0, 0, Width - 1, Height - 1); 
     ... 
    } 
    else 
    { 
     area.FillRectangle(Brushes.Orange, 0, 0, Width - 1, Height - 1); 
     ... 
    } 
} 

我分配到mouseClick,我将在类Ruzzle定义事件。 类Ruzzle处理游戏至少基本上是一个二维数组Check

public event EventHandler selected; 

//in the constructor I've put this 
this.MouseClick += new MouseEventHandler(Check_MouseClick); 

最后

void Check_MouseClick(object sender, MouseEventArgs e) 
{ 
    if (selected != null) 
    { 
     selected(this, e); 
    }     

    Invalidate(); 
} 

在课堂上Ruzzle我尝试做改变Check对象的布尔属性:

public Ruzzle(Control father) 
{ 
    myGame = new Check[4, 4]; 

    for (int i = 0; i < 4; i++) 
    { 
     for(int j=0;j<4;j++) 
     {   
      myGame[i, j] = new Check(50, father,i,j); 
      myGame[i, j].Location = new Point((i * 50), (j * 50)); 
      father.Controls.Add(myGame[i, j]); 
      myGame[i, j].selected += new EventHandler(Ruzzle_selected); 
     } 
    }  
} 

void Ruzzle_selected(object sender, EventArgs e) 
{ 
    int r = (sender as Check).Row; 
    int c = (sender as Check).Column; 
    myGame[r, c].Used = true; 
} 

的和Column性工作正常监守如果我做一个MessageBox.Show我得到正确的值。 然而,当它执行Check类中的Paint方法时,Used布尔值将不会更改!

我在做什么错?

+0

虽然它可能无法解决您的问题,但请移除myGame [r,c] .Invalidate();'。这是不需要的,因为设置'Used'已经调用'Invalidate()'。 – 2013-03-13 16:01:00

+0

哎呀好的谢谢! – 2013-03-13 16:04:04

+0

您是否调试过它,以确定所使用的属性设置器是否实际上被调用? – Charleh 2013-03-13 16:15:08

回答

1

我会发布这个答案,虽然这一个是不会告诉什么是你的代码确切的问题。代码本身看起来很好,所以你必须调试它。让我给你一些关于如何调试这个问题的提示。

我可以看到两个明显的可能出现的情况,为什么你Used属性是false

  1. 它不被更改为正确true

  2. 它在某个时刻重置为false

所以你必须检查这两种可能性。首先,我们应该忽略所有Check实例,除非单击该实例,否则其他实例在调试时可能会分散您的注意力。有两种简单的方法可以做到这一点:

  1. 仅实例化一个实例。在这种情况下,如果游戏中有可能创建1x1字段,则应该创建1x1字段。

  2. 区分调试时的距离。 VS调试器中有一个很好的功能,叫做Make object Id。基本上它允许您在调试时为某个对象分配一个数字唯一标识符。稍后可以通过在调试器中观察其标识来确定特定实例是否为之前标记的实例。如果您之前没有使用过此功能,请查看上面的链接。

好吧,现在你只调试Check类的实例。让我们开始检查属性是否设置正确。有几个点,你应该检查你的属性值,例如:在这里你具备的条件

  1. Paint处理程序。

  2. 调用Invalidate方法时,设置了Used属性。 _used肯定是true

  3. 末尾的Ruzzle_selected处理程序。 Used这里属性应该是true,你应该检查它。如果它是true那么我们可以得出结论,至少它是正确设置的。

现在,让我们检查属性Used是否不重置为false。就我在代码中看到的情况而言,您应该没有可能实际想要重置它的地方。这意味着如果你会发现这样的行为,那么它可能是你正在寻找的错误。我假设除了Used属性外,您不能访问您的_used字段。在这种情况下,调试这个可能的问题非常简单,你只需要在你的属性设置器中放置一个断点,看看它是否设置为false。为了避免断点被设置为true,您可以使用breakpoint condition功能。在你的情况下,条件应该是类似于value == false && _used == true

请尝试使用这些步骤进行调试,并让我们知道它是否对您有帮助。否则它可能是我错过的东西,在这种情况下,我会延长答案。