从小以来“坦克大战”、“魂斗罗”等游戏总令我魂牵梦绕。这些游戏的基础就是2D实时渲染,以前没意识,直到后来找到了Direct2D。我的2D实时渲染入门,是从这个动态时钟开始的。

本文将使用我写的“准游戏引擎”FlysEngine完成。它是对Direct2D.NETSharpDX浅层次的封装,隐藏了一些细节,简化了一些调用。同时还保留了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简单封装了