我需要在C#/ Windows Forms中快速制作一个万圣节动画。 只是一些2D形状在纯色背景上移动。 由于这只是一个快速的项目,我真的不想安装和学习一个全新的工具集。(DirectX开发工具包,Silverlight,Flash等)我还必须在多台计算机上安装它,因此任何超出基本.NET框架(2.0)的东西都会很麻烦。
对于工具,我有VS2k8,25年的开发经验,一辆手推车,大屠杀斗篷,以及大约2天的时间来完成这个项目。自从使用我的Atari 130XE (hooray for page flipping and player/missile graphics!)以来,我已经没有做过动画了。
有什么建议吗?以下是我想知道的一些事情:
- 我可以通过调整其OnPaint处理程序来绘制任何空widget(如面板),对吧? 这就是我绘制自定义小部件的方式。 是否有更好的技术比这个?
- 是否有适用于Windows Forms的页面翻转技术? 我不需要高帧率,只需要尽可能少的闪烁/绘图。
谢谢。
事后编辑……“几天编码之后”
好了,项目完成了。下面的链接很有用,尽管其中一些链接是404。 (我希望SO允许标记多个答复为“正确”)。 我必须克服的最大问题是闪烁以及当我尝试直接在表单上绘制时出现的持久性错误。
- 对于表单使用OnPaint事件:不好的想法。 我从来没有使其工作过; 很多神秘的错误(堆栈溢出或ArgumentNullExceptions)。 我最终使用大小填充表单的面板,这很好用。
- 使用OnPaint方法也很慢。 在网上某个地方我读到说构建PaintEventArgs很慢,他们没有开玩笑。 当我放弃这个时,许多闪烁消失了。 跳过OnPaint / Invalidate()并自己绘制。
设置表单上所有的“双缓冲区”选项仍然留下了一些需要修复的闪烁。(而且我发现有冲突的文档说“将它们设置在控件上”和“将它们设置在表单上”。 好吧,控件没有.SetStyle()方法。)我没有测试过没有它们会发生什么(
this
就是表单):this.SetStyle(ControlStyles.UserPaint, true); this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
因此,这段代码的工作原理看起来像这样(pf
是面板控件):
void PaintPlayField()
{
Bitmap bufl = new Bitmap(pf.Width, pf.Height);
using (Graphics g = Graphics.FromImage(bufl))
{
g.FillRectangle(Brushes.Black, new Rectangle(0, 0, pf.Width, pf.Height));
DrawItems(g);
DrawMoreItems(g);
pf.CreateGraphics().DrawImageUnscaled(bufl, 0, 0);
}
}
我刚刚从我的计时器循环中调用了PaintPlayField函数。没有任何闪烁。
Bitmap
,只要宽度和高度不变。每一帧都重新分配它是浪费的。当完成使用时,应该将其处理掉,就像pf.CreateGraphics()
返回值一样。 - Drew Noakes