游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2878|回复: 0

使用Manged DirectX 9.0 --- Part I

[复制链接]

21

主题

78

帖子

103

积分

注册会员

Rank: 2

积分
103
发表于 2003-8-14 01:14:00 | 显示全部楼层 |阅读模式
我们的目的是做一个引擎, 所以一开始就把所有DirectX编程的部分封装起来.
各功能模块用类来实现, 这些类放在同一个名字空间中, 我起的名字是DXEngine.
其中二维绘图的部分封装在Graphics2D类中.
给出完整的代码, 目的是想说明如何来实现封装.
Graphics2D类最初具备的功能是绘制图片和文字,以及使用颜色键绘图.
以后会逐步添加和完善起来.


  1. using System;
  2. using System.Windows.Forms;
  3. using System.Drawing;
  4. using Microsoft.DirectX;
  5. using Microsoft.DirectX.DirectDraw;

  6. namespace DXEngine
  7. {
  8.         public delegate void DrawFunc(Graphics2D g2d);
  9.         public struct Picture
  10.         {
  11.                 public Surface BitmapSurface;
  12.                 public bool UseColorKey;
  13.                 public Picture(Surface surf)
  14.                 {
  15.                         BitmapSurface=surf;
  16.                         UseColorKey=false;
  17.                 }
  18.                 public Picture(Surface surf,Color colorkey)
  19.                 {
  20.                         BitmapSurface=surf;
  21.                         ColorKey key=new ColorKey();
  22.                         int rgb=ColorTranslator.ToWin32(colorkey);//这个函数的作用跟RGB(x,x,x)是一样的
  23.                         key.ColorSpaceLowValue=rgb;
  24.                         key.ColorSpaceHighValue=rgb;
  25.                         BitmapSurface.SetColorKey(ColorKeyFlags.SourceDraw,key);
  26.                         UseColorKey=true;
  27.                 }
  28.         }
  29.         /// <summary>
  30.         /// Graphic2D 的摘要说明:
  31.         /// Graphic2D类负责所有二维图形的绘制
  32.         /// </summary>
  33.         public class Graphics2D
  34.         {
  35.                 Control Window=null;
  36.                 Device display = null;
  37.                 SurfaceDescription description;
  38.                 Surface front = null;
  39.                 Surface back = null;
  40.                 Clipper clip = null;
  41.                 int ScreenWidth=800;
  42.                 int ScreenHeight=600;
  43.                 public int bitPerPixel=16;

  44.                 public Graphics2D(Control window,int width,int height)
  45.                 {
  46.                         //
  47.                         // TODO: 在此处添加构造函数逻辑
  48.                         //
  49.                         this.Window=window;
  50.                         this.ScreenWidth=width;
  51.                         this.ScreenHeight=height;
  52.                         this.InitDirectDraw();
  53.                 }
  54.                 public event DrawFunc OnDraw;
  55.                 /// <summary>
  56.                 /// 执行初始化
  57.                 /// </summary>
  58.                 private void InitDirectDraw()
  59.                 {                       
  60.                         display = new Device(); // 创建显示设备.
  61.                         display.SetCooperativeLevel(this.Window,CooperativeLevelFlags.FullscreenExclusive);//全屏独占模式
  62.                         display.SetDisplayMode(ScreenWidth, ScreenHeight, bitPerPixel, 0, false);//设置分辨率,色深
  63.          
  64.                         description = new SurfaceDescription();// 新建一个页面描述
  65.                         description.SurfaceCaps.PrimarySurface = true;//为主页面
  66.                         description.SurfaceCaps.Flip = true;//有换页链
  67.                         description.SurfaceCaps.Complex = true;//有后台缓存
  68.                         description.BackBufferCount = 1;//一个后台缓存
  69.                         front = new Surface(description, display);//得到主页面

  70.                         clip = new Clipper(display);//裁剪器
  71.                         clip.Window = Window;
  72.                         front.Clipper = clip;

  73.                         SurfaceCaps caps = new SurfaceCaps();
  74.                         caps.BackBuffer = true;
  75.                         back = front.GetAttachedSurface(caps);//缓冲页面
  76.        
  77.                 }
  78.                 public Picture CreateBitmapFromBMP(string filename)
  79.                 {
  80.                         description.Clear();// 每次新建一个页面时,页面描述要清空一下
  81.                         description.SurfaceCaps.OffScreenPlain=true;
  82.                         Surface BitmapSurface=new Surface(filename,description,display);
  83.                         return new Picture(BitmapSurface);
  84.                 }
  85.                 public Picture CreateBitmapFromBMP(string filename,Color key)
  86.                 {
  87.                         description.Clear();
  88.                         description.SurfaceCaps.OffScreenPlain=true;
  89.                         Surface BitmapSurface=new Surface(filename,description,display);
  90.                         return new Picture(BitmapSurface,key);
  91.                 }
  92.                 public void DrawBitmapBMP(int x,int y,Picture bitmap)
  93.                 {
  94.                         if(bitmap.UseColorKey==false)
  95.                         {
  96.                                 back.DrawFast(x,y,bitmap.BitmapSurface,DrawFastFlags.Wait);
  97.                         }
  98.                         else
  99.                         {
  100.                                 back.DrawFast(x,y,bitmap.BitmapSurface,DrawFastFlags.Wait|DrawFastFlags.SourceColorKey);
  101.                         }
  102.                 }
  103.                 public void DrawText(int x,int y,string text,Color forecolor)
  104.                 {
  105.                         back.ForeColor=forecolor;
  106.                         back.DrawText(x,y,text,true);
  107.                 }
  108.                 public void Draw()
  109.                 {
  110.                         if (front == null)
  111.                         {
  112.                                 return;
  113.                         }
  114.                         try
  115.                         {
  116.                                 front.Flip(back, FlipFlags.Wait);
  117.                                 this.OnDraw(this);
  118.                         }

  119.                         catch(WasStillDrawingException)
  120.                         {
  121.                                 return;
  122.                         }
  123.                         catch(SurfaceLostException)
  124.                         {
  125.                                 RestoreSurfaces();//恢复页面
  126.                         }
  127.                 }
  128.                 private void RestoreSurfaces()
  129.                 {
  130.                         display.RestoreAllSurfaces();
  131.                         this.OnDraw(this);
  132.                         return;
  133.                 }
  134.         }
  135. }



复制代码


怎么样, C#的代码是不是比C++清爽多了!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2024-11-24 06:15

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表