C#DIRECTX文字对战游戏.docx
《C#DIRECTX文字对战游戏.docx》由会员分享,可在线阅读,更多相关《C#DIRECTX文字对战游戏.docx(32页珍藏版)》请在冰豆网上搜索。
C#DIRECTX文字对战游戏
摘要:
C#进行游戏编程一直受到一些C++程序员的怀疑和猜忌,是不是真的C#就不能进行游戏编程呢?
回答当然是否定的,因为,微软已经发布了DirectX9.0SDK开发包,使得C#进行游戏编程简单易行,本篇在.NET环境下,用C#调用DirectX进行游戏编程,通过简单而又明朗的编程实例揭示C#DirectX编程的奥秘,在本篇的开始,作者对.NET、C#、DirectX及游戏制作的相关知识都作了介绍和讲解,然后,一步步的制作“文字对战游戏”,相信读完本文,你一定会受益非浅。
关键词:
C#DirectX.NET“文字对战游戏”
一、.NET概述
1..NET是什么,刚刚开始接触.NET的人不竟要问,是啊,.NET到底是什么,它能完成哪些功能,微软对我们的问题作出了精典的回答:
.NETFramework是一种新的计算平台,它简化了在高度分布式Internet环境中的应用程序开发,能够快速的创建Windows应用程序、WEB程序以及移动平台WindowsMobile的应用程序,随着.NET2.0版的发布,.NET的功能越来越强大。
.NET2.0分为.NETFramework2.0和.NETCompactFramework2.0(简称.NETCF2.0),其它.NETFramework2.0主要用于Windows系统的编程开发,而.NETCF2.0作为.NETFramework2.0的精装版,主要用于WindowsMobile手机操作系统的编程。
2.在.NET环境下,可以使用的编程语言很多,如:
C#、C++、VB等,到底使用哪种语言更适合于你,这要看你的爱好了,对我来说,我更热衷于C#语言,因此,本篇将使用C#语言对“文字对战游戏”进行编程及介绍。
二、C#语言概述
1.C#是微软新推出的一种编程语言。
其功能强大。
它的学习和使用象VB一样简单。
只要稍有一点编程知识,都非常容易上手学习C#。
2.由于.NET框架类库对套接字、TCP、HTTP等协议的支持,C#的网络编程功能也相当强大。
3.C#可以直接调用GDI+进行绘图、图形和多媒体编程。
而GDI+的强大功能绝对让你大吃一惊。
4.DirectX编程,相信大家并不陌生,自DirectX7.0诞生以来,就有了基于VB编程的DirectX库DxVBLib,同样,DirectX9.0C诞生及DirectX9SDK开发包的推出,在C#中使用DirectX进行多媒体及游戏编程变得简单易行,在本篇中,我们将要学习C#中调用DirectX进行“文字对战游戏”的编程。
5.ASP.net编程,在.NET还没有出现之前,用ASP进行WEB程序编程,是每个程序员做梦都想精通的,早期在网络上运行的80%的WEB程序是都是用ASP编写,而现在,学了ASP.net,我相信你一定会酷爱ASP.net,而C#,可以直接建立ASP.net,其可视化界面也做得相当不错。
6.组件编程:
我只能告诉你,我从来没有见过可以向C#一样简单、快速、高效编写组件的开发语言,剩下的你自己猜想。
7.数据库编程:
在C#中通过调用ADO.net对数据库进行读、写、查询等操作,C#编写数据库应用程序也一样简单。
8.如此强大的功能,难怪微软声称,C#是编写.NETFramework应用程序最合适的语言,本人也有同感。
三、C#DirectX游戏编程基础
DirectX技术是微软公司推出一种基于WINDOWS下与硬件设备无关的多媒体及游戏编程技术,DirectX的出现,使WINDOWS下的多媒体及游戏编程变得容易,且性能有较大的提升,而且,DirectX不仅和WINDOWS驱动程序有良好的兼容,还能WINDOWS图形设备接口,即WINDOWSGDI兼容,在DirectX9.0以前,通常只能在C++和VB中调用DirectX进行编程,但随着DirectX9.0和DirectX9SDK的推出,在C#中进行DirectX编程非常简单,在本篇中,你将学习如何在C#中调用DirectX进行编程。
1.DirectX9.0C和DirectX9SDK开发包的安装
要调试和编译本篇中的程序,必须先安装DirectX9.0C和DirectX9SDK开发包,下面告诉你如何安装:
(1)安装WindowsXpsp2操作系统,安装完毕后DirectX9.0C是默认已经安装,如果你的操作系统是其它版本的操作系统,那么需要单独安装DirectX9.0C。
(2)安装MicrosoftVisualStudio.NET2005版以上的编程工具。
(3)安装DirectX9SDK开发包,一共是两个安装程序:
dx90asdk.exe和dxsdk_apr2005.exe,安装其中一个就可以了,安装完成后,我们就可以进行DirectX游戏编程了。
2.C#DirectDraw的使用方法
DirectDraw是DirectX的一个分枝,专门用于处理2D图形和平面图形,是一项非常好用的技术,Windows下几乎所有2D游戏,包括很多网络游戏都采用DirectDraw技术进行编程,因此,学好DirectDraw技术是游戏编程所必不可少的,下面,让我们一步步的学习如何使用DirectDraw进行编程。
(1)对DirectDraw类进行引用:
单击菜单“项目”—>“添加引用”—>“.NET”,选择“Microsoft.DirectX.DirectDraw”,单击“确定”。
(2)在源代码中添加以下命名空间的引用:
usingMicrosoft.DirectX;
usingMicrosoft.DirectX.DirectDraw;
以上两行代码完成对DirectX和DirectDraw命名空间的引用,只有通过以上命名空间的引用,才能在程序对DirectDraw的编程。
(3)定义DirectDraw设备并进行初始化:
DevicedisplayDevice=null;
此行代码把DirectDraw设备定义为displayDevice,并赋初始值为null,对DirectDraw设备进行定义并初始化后,在程序中就可以使用displayDevice代表DirectDraw进行工作了。
(4)定义表面:
Surfacefront=null;//主表面.
Surfaceback=null;//后表面.
SurfacesurfaceBmp=null;//加载位图的离屏表面.
Surfacetext=null;//加载文字的离屏表面.
表面,搞过DirectDraw编程的人都知道,表面实际上是一个内存块,在上述代码中定义了四个表面,front主表面的内容是直接显示在显示器上,可以看得见的内容,back后表面的内容,不直接显示在显示器,后表面的内容只存储在内存中,后表面在内容要在显示器上显示,我们必须把后表面的内容拷贝到前表面中,或者采用翻转的办法将后表面变为主表面,后表面变为主表面后,内容当然显示中显示器中了,所以,在DirectDraw编程中,通常把后表面作为缓冲区,在后表面中进行图形处理,处理结束后再拷贝到主表面,或者向刚刚所说的,把后表面变为主表面,这样就可以避免由于复杂的图形处理过程在显示器上显示造成的闪烁,因为图形处理过程在后表面中进行。
surfaceBmp表面被定义为加载位图的离屏表面,同样也是一个内存块,text表面被定义为加载文字的离屏表面,也是一个内存块,如果我们要把surfaceBmp表面和text表面的内容同时在显示器中显示,我们应该怎么做呢,就是把surfaceBmp表面的内容先拷贝到后表面back中,再把text表面的内容拷贝到后表面back中,然后,把后表面的back内容拷贝到主表面front中,假设surfaceBmp表面是一幅位图,text表面中是文字,经过上述操作后,我们就可以在显示器看到图形和文字了。
(5)创建DirectDraw设备:
displayDevice=newDevice();在我们把displayDevice定义为DirectDraw设备后,我们需要创建它,在C#中,创建DirectDraw设备就一行代码,非常的简单。
(6)设置显示模式:
displayDevice.SetCooperativeLevel(this,CooperativeLevelFlags.FullscreenExclusive);
//设置显示设备为当前窗口,且为全屏独占方式
.displayDevice.SetDisplayMode(800,600,16,0,true);//设置显示模式为800x600分辩率,颜色为16M色。
玩过游戏的人都清楚,好多游戏都支持多种显示模式,现在大都数游戏都支持1024x768显示模式,而且可以切换窗口和全屏模式,那么,在实际编程中是如何实现的呢?
上述代码应该给了你很好的回答。
(7)设置透明色:
ColorKeykey=newColorKey();
key.ColorSpaceHighValue=key.ColorSpaceLowValue=0;//设置颜色为黑色
flags=ColorKeyFlags.SourceDraw;
surfaceBmp.SetColorKey(flags,key);//设置页面透明色.
在这里,有人肯定会问,何为透明色?
设置透明色有什么作用?
别忙,让我告诉你,先请看下图:
这张图是一张90x90的位图,如果我们在图形处理时,不设置透明色,我们看到的跟上图一模一样,但如果在图形处理时,我设置透明色为此图的背景色(本图背景色为黑色),在图形处理时对这种颜色不进行处理,我们看到的图形就为下图
这样来举例,应该明白透明色的意义了吧,在游戏编程中,谁愿意看到那周围那些黑呼呼的东西呢,当然得把它处理掉。
(8)加载位图:
surfaceBmp=newSurface(bitmapFileName1,description,displayDevice);
在游戏编程中,需要处理很多图形,如背景图,人物图形,花草树木等很多的图形,那么,这些图形是这样加载到程序中呢,上述代码很简单,那就是通过一个位图文件建立一个位图表面,bitmapFileName1变量为图形文件名,可以包含路径,description为表面,displayDevice为DirectDraw设备。
(9)表面拷贝:
上面讲到,在图形处理中需要进行表面的拷贝操作,DirectDraw的表面拷贝操作非常简单,请看下面的代码。
back.DrawFast(0,0,surfaceBmp,DrawFastFlags.DoNotWait|DrawFastFlags.SourceColorKey);
//全图拷贝
back.DrawFast(0,0,surfaceBmp,surRect,DrawFastFlags.DoNotWait|DrawFastFlags.SourceColorKey);
//矩形拷贝
back.DrawFast(30,40,text,DrawFastFlags.DoNotWait|DrawFastFlags.SourceColorKey);//不带透明色的拷贝
表面拷贝使用DrawFast方法,第一个参数为目标表面的X座标,第二个参数为目标表面的Y座标,第三个参数为要进行拷贝的表面,第四个参数决定拷贝整个表面或者是表面的一部分,第五个参数决定拷贝方式。
第一行代码作用是把surfaceBmp表面的全部内容拷贝到back表面座标0,0的地方,并对透明色进行处理。
第二行代码作用是把surfaceBmp表面的surRect矩形框指定的内容拷贝到back表面座标0,0的地方,并对透明色进行处理。
第三行代码作用是把text表面的全部内容拷贝到back表面座标30,40的地方,并对透明色进行处理。
(10)表面翻转:
前面讲到,要将后表面的内容在显示器进行显示,需要将后表面翻转为主表面,表面翻转使用以下方法:
front.Flip(back,FlipFlags.DoNotWait);
第一个参数为要翻转为主表面为表面,第二个参数为翻转模式。
上述代码把back表面翻转为主表面。
好了,说了这么多,让我们看一个DirectDraw的实例吧。
usingSystem;
usingSystem.Drawing;
usingSystem.Collections;
usingSystem.ComponentModel;
usingSystem.Windows.Forms;
usingSystem.Data;
usingMicrosoft.DirectX;
usingMicrosoft.DirectX.DirectDraw;
namespacedxDraw
{
///
///Form1的摘要说明。
///
publicclassForm1:
System.Windows.Forms.Form
{
privateSystem.ComponentModel.IContainercomponents;
DevicedisplayDevice=null;//Draw显示设备.
Surfacefront=null;//主表面.
Surfaceback=null;//后表面.
SurfacesurfaceBmp=null;//加载位图的离屏表面.
Surfacetext=null;//加载文字的离屏表面.
privateSystem.Windows.Forms.Timertimer1;//Paletteentryarray.
stringbitmapFileName1="black.bmp";
intnx;
//intny;
publicForm1()
{
//
//Windows窗体设计器支持所必需的
//
InitializeComponent();
//
//TODO:
在InitializeComponent调用后添加任何构造函数代码
//
}
///
///清理所有正在使用的资源。
///
protectedoverridevoidDispose(booldisposing)
{
if(disposing)
{
displayDevice.RestoreDisplayMode();//恢复设置
displayDevice.SetCooperativeLevel(this,CooperativeLevelFlags.Normal);
if(components!
=null)
{
components.Dispose();
}
}
base.Dispose(disposing);
}
#regionWindows窗体设计器生成的代码
///
///设计器支持所需的方法-不要使用代码编辑器修改
///此方法的内容。
///
privatevoidInitializeComponent()
{
ponents=newSystem.ComponentModel.Container();
this.timer1=newSystem.Windows.Forms.Timer(ponents);
//
//timer1
//
this.timer1.Interval=10;
this.timer1.Tick+=newSystem.EventHandler(this.timer1_Tick);
//
//Form1
//
this.AutoScaleBaseSize=newSystem.Drawing.Size(21,46);
this.ClientSize=newSystem.Drawing.Size(292,266);
this.Font=newSystem.Drawing.Font("宋体",30F,System.Drawing.FontStyle.Regular,System.Drawing.GraphicsUnit.Point,((System.Byte)(134)));
this.Name="Form1";
this.Text="Form1";
this.KeyDown+=newSystem.Windows.Forms.KeyEventHandler(this.Form1_KeyDown);
this.Load+=newSystem.EventHandler(this.Form1_Load);
}
#endregion
///
///应用程序的主入口点。
///
[STAThread]
staticvoidMain()
{
Application.Run(newForm1());
}
privatevoidForm1_Load(objectsender,System.EventArgse)
{
InitializeDirectDraw();
}
privatevoidInitializeDirectDraw()
{
SurfaceDescriptiondescription=newSurfaceDescription();//目标表面
ColorKeyFlagsflags=newColorKeyFlags();
displayDevice=newDevice();//创建DirectDraw设备.
displayDevice.SetCooperativeLevel(this,CooperativeLevelFlags.FullscreenExclusive);//设置显示设备为当前窗口,且为全屏独占方式
try
{
displayDevice.SetDisplayMode(800,600,16,0,true);//设置显示模式
}
catch(UnsupportedException)
{
MessageBox.Show("不支持当前的模式,请重新设置","警告");
Close();
return;
}
description.SurfaceCaps.PrimarySurface=description.SurfaceCaps.Flip=description.SurfaceCaps.Complex=true;
description.BackBufferCount=1;//为目标表面建立一个后表面
front=newSurface(description,displayDevice);//创建基于description的主表面.
SurfaceCapscaps=newSurfaceCaps();
caps.BackBuffer=true;
back=front.GetAttachedSurface(caps);//从主表面获取后表面.
description.Clear();//清除.
surfaceBmp=newSurface(bitmapFileName1,description,displayDevice);//通过位图创建离屏表面.
ColorKeykey=newColorKey();
key.ColorSpaceHighValue=key.ColorSpaceLowValue=0;//设置颜色为黑色
flags=ColorKeyFlags.SourceDraw;
surfaceBmp.SetColorKey(flags,key);//设置页面透明色.
description.Clear();
description.SurfaceCaps.OffScreenPlain=true;
description.Width=500;//设置目标表面的宽度和高度
description.Height=40;
text=newSurface(description,displayDevice);//通过目标表面创建离屏表面
text.ForeColor=Color.White;
text.ColorFill(0);
text.FontHandle=this.Font.ToHfont();//设置字体为当前窗口的字体
text.DrawText(0,0,"按Esc键退出,A键动画演示",false);
text.SetColorKey(flags,key);//设置页面透明色.
RectanglesurRect=newRectangle(0,0,600,400);
back.ColorFill(144);
//back.DrawFast(0,0,surfaceBmp,DrawFastFlags.DoNotWait|DrawFastFlags.SourceColorKey);//全图拷贝
back.DrawFast(0,0,surfaceBmp,surRect,DrawFastFlags.DoNotWait|DrawFastFlags.SourceColorKey);//矩形拷贝
back.DrawFast(30,40,text,DrawFastFlags.DoNotWait|DrawFastFlags.SourceColorKey);//不带透明色的拷贝
back.FontHandle=this.Font.ToHfont();//设置字体为当前窗口的字体
back.ForeColor=Color.Red;
back.DrawText(0,0,"CLS",false);
front.Flip(back,FlipFlags.DoNotWait);
}
privatevoidForm1_KeyDown(objectsender,System.Windows.Forms.KeyEventArgse)
{
if(e.KeyCode==Keys.Escape)
{
Close();
}
if(e.KeyCode==Keys.A)
timer1.Enabled=true;
}
privatevoidtimer1_Tick(objectsender,Syst