一个典型的游戏应用程序将自定义描画窗体的内容。 应用程序通过覆盖一个控件的OnPaint()事件然后自定义处理窗口的描画。
| protected override void OnPaint(PaintEventArgs paintg) { Graphics gx = paintg.Graphics; // Custom draw using the graphics object } |
每当一个控件开始描画时,它的背景首先自动地刷新。 举例来说,在OnPaint()描画控件内容的过程中,它的背景先使用this.Backcolor中指定的颜色描画。 但是上面提到的这种应用程序自己描画窗体的情况可能并不太理想;在应用程序完成前景着色以前,背景的自动着色可能导致背景的瞬间闪烁。
为了防止这种默认的情况发生,每当一个应用程序覆盖OnPaint()方法的时候,强烈建议也覆盖OnPaintBackground ()方法重画背景本身。 象在下面的例程中一样,应用程序可以处理OnPaint()中的所有的描画,而空着OnPaintBackground()。
| protected override void OnPaintBackground(PaintEventArgs paintg) { // Left empty, avoids undesirable flickering } |
用于着色的Off Screen位图技术
你可以通过获取用于屏幕的图形对象,在屏内描画,通过调用一个控件的this.CreateGraphics()直接画到上面。 要牢记,当屏内图形对象不再需要的时候,一定要把它去除。不这样做可能会使显示设备的资源紧张。
如前面章节所述,你可以通过PaintEventArgs.Graphics访问OnPaint()和OnPaintBackground()方法中的屏幕图形对象。一旦这些描画方法被执行,这些图形对象就会被自动去除。
游戏程序在屏幕上直接描画往往并不理想。因为当你在屏幕上描画许多对象的时候,你将看到屏幕闪动。为了避免屏幕闪动,游戏开发者通常使用屏外描画技术。
主要的思想是创建一个屏外位图,获得它的图形对象,执行关于它的所有的描画操作(在内存中)并且复制生成的位图到屏幕上。
| // Create off-screen graphics Bitmap bmpOff = new Bitmap(this.ClientRectangle.Width, this.ClientRectangle.Height); Graphics gxOff = Graphics.FromImage(bmpOff); |
在这个例子里,我将创建一个正好是游戏窗体客户区大小的屏外位图。 基于需要,它的尺寸是可以改变的。 然而,维持屏外和屏内图形边界大小关系为1:1将非常有益,尤其是当需要翻译屏内和屏外子图形的坐标时。
| // Draw to off-screen graphics, using Graphics.Draw APIs // Create on-screen graphics Graphics gxOn = this.CreateGraphics(); // Copy off-screen image onto on-screen gxOn.DrawImage(bmpOff, 0, 0, this.ClientRectangle, GraphicsUnit.Pixel); // Destroy on-screen graphics gxOn.Dispose(); |
这个技术避免了屏幕的闪动,并且当内存中所有的屏外描画操作都在进行的时候也非常快。
子图形
像位图这样的图象都是以矩形形式出现,但是在现实世界中大部分的子图形是不规则形状的(并不是矩形的)。 所以我们需要找到办法让我们从一个矩形图象中提取出一个不规则子图形图象。专题:http://www.qqread.com/dotnet/u292184000.html
更多内容请看游戏开发、网络游戏攻略、.NET Framework新手入门专题,或进入讨论组讨论。
相关专题
- 游戏开发 (2107篇文章)
- 网络游戏攻略 (4329篇文章)
- .NET Framework新手入门 (132篇文章)
- .NET移动与嵌入式技术 (5950篇文章)
- .NET开发手册 (5652篇文章)
- 电信运营商专栏 (4024篇文章)
- Wlan组网----家庭专题 (4184篇文章)
- 网络游戏开发 (141篇文章)
- 游戏策划 (287篇文章)
- 程序设计 (226篇文章)
- vb.net入门——ToolBar 控件的使用 (267次浏览)
- vb.net入门——OpenFileDialog 组件的使用 (75次浏览)
- vb.net入门——FontDialog 组件的使用 (52次浏览)
- vb.net用Graphics画一个五角星 (46次浏览)
- vb.net入门——FolderBrowserDialog 组件的使 (45次浏览)
- vb.net绘制干扰点 (44次浏览)
- vb.net入门——ColorDialog 组件的使用 (41次浏览)
- vb.net巧用ToolTip控件获取鼠标坐标 (39次浏览)
- 用vb.net创建一个鼠标绘图程序 (39次浏览)
- vb.net入门——SaveFileDialog 组件的使用 (38次浏览)



