2011-01-20 25 views
3

我正在C#窗体表单应用程序中制作炸弹人游戏。它有300多个放置在面板上的图画框(墙)。炸弹人的画箱本身也在该面板上。C#只有刷新图片框/面板时,告诉他们刷新?

当bombermans picturebox的位置发生变化时,面板上的所有控件都会自动刷新。由于该面板上有太多的控件,并且由于picturebox的位置每秒会改变多次,所以当我尝试移动时,该程序会变得迟缓。

我想要控制面板(及其控件)的刷新事件,因为我认为只有需要刷新的picturebox才能通过编程方式刷新问题。

我希望有人能帮助我这个!

Ruud。

+1

请勿使用图片框。重写窗体的OnPaint()方法并使用e.Graphics.DrawImage()绘制墙。 – 2011-01-20 08:50:32

回答

0

如果移动孩子,父母必须刷新,因为它可能需要绘制孩子以前所在的区域。这也意味着(父母)的所有孩子都会得到更新。

OTH,使用如此多的控件可能不是一个好主意。我建议你保留描述墙的数据结构,然后用它在Panel(或你的自定义控件)中绘制它。通过在面板/父级别捕获鼠标/键盘事件,您可以编写自己的命中测试逻辑(鼠标或键盘在墙边界内点击)。有了正确的组织数据结构,点击测试可以非常有效。

+0

最后一段没有参数。 – 2011-01-20 08:47:49

0

您正在尝试绘制整个表格,这肯定需要时间。如果你只想改变表格的一部分,在你的情况下是将炸弹人移动到新的位置,只需使你想要重新绘制的区域失效,然后将它传递给Invalidate方法。

做一些类似的事情。

//Invalidate previous position of bomberman 
Rectangle invalid = new Rectangle(picturebox1.Location.x,picturebox1.Location.y,picturebox1.Width,picturebox1.Height); 
Invalidate(invalid); 
//Add code to move your picture box and then call above two lines again 
invalid = new Rectangle(picturebox1.Location.x,picturebox1.Location.y,picturebox1.Width,picturebox1.Height); 
Invalidate(invalid); 

注肯定,但财产以后类似抛光的代码将工作...

这里是供参考的例子的链接。 http://msdn.microsoft.com/en-us/library/ms229628.aspx

+0

这已经自动发生,根本不写任何代码。 – 2011-01-20 08:47:25