在 C# WinForms 中,每当制作一个小游戏时,我都会编写一个快速类,该类是 System.Windows.Forms.Panel 的子类,并在构造函数中将 DoubleBuffered 设置为 true。然后您可以重写 OnPaint 方法来显示游戏元素。我已经这样做了2到3年了,但我真的想拥抱 WPF 和 XAML,我非常喜欢它用于常规应用程序布局。在 WPF 中,有什么等效方法可以实现这一点?
更新:昨天我很匆忙地回答了这个问题,因为我也研究了一下WPF来制作游戏,所以我不想让提问者没有得到正确的答案。
事实如下:
WPF的目标是简化丰富UI的开发。首先,微软认识到Forms编码方式混合了行为和演示。这是不好的,既对应用程序设计又对可维护性都有影响。此外,在Forms中,每个东西都必须编码;库本身为用户做的很少。例如,如果你想要一个外观不同的按钮,你必须重写它的Draw
方法,然后以某种方式绘制代表它的任何图形。
使用WPF,行为与演示分离。例如,什么是按钮?在Windows中,我们知道它是一个带有圆角的框,但是看看周围...你的鼠标滚轮也是一个按钮,尽管它看起来与Windows默认按钮完全不同。成为按钮意味着具有特定的行为(主要是点击),而不是看起来像一个框。使用WPF,这非常简单。您定义一个按钮,然后使用图像或文本来呈现给用户。
当然,所有这些都是有代价的;例如,WPF比Forms慢。游戏需要快速运行并尽量不浪费资源。在游戏中,每个行为往往都是编码的(当然不包括UI),每个演示都是定制的(2D图形或3D对象),因此您仍然需要进行大量编码。因此,您正在使用一种昂贵的技术,但却抛弃了其大部分优点。
但我不是专家。您可以查看此处的博客,其中一位前微软员工尝试了近两年时间使用WPF来制作游戏。他得出结论:
您可能已经注意到,该博客已经有一段时间没有更新了。 WPF性能似乎无法胜任严肃的游戏,所以我放弃了,将使用XNA制作游戏。我认为这不值得为了WPF框架而奋斗...
从那里,我得出了大部分结论。
您可以尝试使用WinForms宿主在WPF中添加Windows Forms自定义控件,并使用OnPaint进行绘制。
//WPF XAML
<WindowsFormsHost x:Name="formsHost" HorizontalAlignment="Left" Visibility="Visible" Grid.Column="0" Grid.Row="0"></WindowsFormsHost>
//WPF CodeBehind
YourCustomWinFormsControls panel = new YourCustomWinFormsControls ();
panel.Width = XXX;
panel.Height = XXX;
formsHost.Child = panel;
//WinForms Custome Control Code
protected override void OnPaint(PaintEventArgs pe)
{
//DO STUFF HERE
base.OnPaint(pe);
}
有几个容器可以用来显示内容。你想要使用的是Canvas(唯一带有坐标系统的容器)更多细节
关键在于你想要制作什么样的游戏。使用XAML,可以制作一些基本的应用程序式游戏(基本绘图等)。如果需要更多功能,考虑使用XNA。 XAML的优点是易于通过处理程序与用户交互,例如,可以轻松地将字符串写入屏幕上,这对于XNA来说有点困难。此外,使用XAML,您可以为IE(XABP),Windows Phone和Silverlight制作游戏。
你之前做的那个表单有点像循环式游戏。
Update(); Paint();
这更适合XNA。但是,如果您想要使用WPF和Xaml,请使用Canvans和LayoutUpdate Handler。