我需要在C#/ Windows Forms中敲出一个快速动画来进行万圣节显示.只是一些2D形状在坚实的背景上移动.由于这只是一个快速的一次性项目,我真的不想安装和学习一整套新的工具.(DirectX开发工具包,Silverlight,Flash等.)我还必须在多台计算机上安装它,因此除了基本的.Net框架(2.0)之外的任何东西都会让人痛苦.
对于工具,我有VS2k8,25年的开发经验,独轮车,大屠杀斗篷,大约2天就可以解决这个问题.自从在我的Atari 130XE上使用汇编程序以来,我没有完成动画(对于页面翻转和播放器/导弹图形来说很好!)
建议吗?以下是我想知道的一些事情:
我可以通过摆弄它的OnPaint处理程序来绘制任何空的小部件(如面板),对吗?这就是我绘制自定义小部件的方式.有没有比这更好的技术?
在Windows窗体中是否存在针对此类事物的页面翻转技术?我不是在寻找高帧速率,只需要根据需要进行少量闪烁/绘图.
谢谢.
Post Mortem Edit ..."几天后编码"
好吧,项目已经完成.下面的链接派上用场,虽然其中有几个是404.(我希望SO允许不止一个回复被标记为"正确").我必须克服的最大问题是闪烁,当我试图直接在表单上绘制时,这是一个持久的错误.
使用Form的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); } }
我刚从Timer循环内部调用了PaintPlayField.根本没有闪烁.
以您想要的帧速率启动计时器.在每个计时器中,根据您想要实现的动画运动,在屏幕(您的模型)上旋转形状的内部表示,然后调用Invalidate(true)
.在OnPaint内部只需在屏幕上绘制模型.
哦是的,你可能想要打开Double Buffering(这就像自动页面翻转一样).
2d游戏入门
基于计时器的动画
这两个都给出了很好的动画示例.代码相当简单.当我需要为我的儿子做一个快速动画时,我使用了这些.