.NET实时2D渲染入门·动态时钟
从小以来“坦克大战”、“魂斗罗”等游戏总令我魂牵梦绕。这些游戏的基础就是2D
实时渲染,以前没意识,直到后来找到了Direct2D
。我的2D
实时渲染入门,是从这个动态时钟
开始的。
本文将使用我写的“准游戏引擎”FlysEngine
完成。它是对Direct2D
和.NET
库SharpDX
浅层次的封装,隐藏了一些细节,简化了一些调用。同时还保留了Direct2D
的原汁原味。
本文的最终效果如下:
绘制动态时钟
要绘制动态时钟,需要有以下步骤:
- 创建一个实时渲染窗口;
- 画一个圆圈,表示时钟边缘;
- 在圆圈内等距离画上
60
个分钟刻度,其中12
个比较长,为小时刻度; - 用不同粗细、不同长短、不同颜色的画笔画上时钟、分钟和秒钟。
实时渲染窗口
using var form = new RenderWindow { ClientSize = new System.Drawing.Size(400, 400) }; form.Draw += (RenderWindow sender, DeviceContext ctx) => { ctx.Clear(Color.CornflowerBlue); }; RenderLoop.Run(form, () => form.Render(1, PresentFlags.None));
其中form.Render(1, ...)
中的1
表示垂直同步,玩过游戏的可能见过,这个设置可以在尽可能节省CPU/GPU
资源的同时得到最佳的呈现效果。
熟悉glut
的肯定知道,这种写法和glut
非常像,执行效果如下:
注意:
RenderWindow
其实继承于System.Windows.Forms.Form
,确实是基于“WinForm
”,但实质却和“拖控件”完全不一样。“控件”是模态的,本身有状态,但Direct2D
是实时渲染,界面完全没有状态,需要动态每隔一个垂直同步时间(如1/60
秒)全部清除,然后再重绘一次。
画圆圈
RenderWindow
简单封装了