整理的一些关于C#方面的游戏编程资料
图形设备焦点(如用户切换到了其它应用程序窗口),例如重置或者释放图形设备。这三个事件是固定的,无论什么时候发生,都必须要进行处理。否则,操作系统就要告诉事件处理程序所发生的事情,以至于事件处理程序不得不考虑这些情况。最后一个事件在图形设备改变大小时触发处理,这是一个特殊的事件,因为事件发生后可以取消,可以在程序中决定拒绝处理所发生的事件。例如,假如用户要改变游戏窗口的大小,游戏程序检测到这个事件发生了,但是可以告诉操作系统没有发生什么事,则这个事件就不会完成。这种方法通常用来防止用户在保存窗口应用程序数据之前关闭窗口。
第9-13行代码返回true,表示成功初始化图形设备。否则,捕获抛出的任何DirectX异常并返回false。
事件处理程序
在MainClass类中,有四个事件处理程序来处理上述的四种不同类型的事件,如下:
virtual void InvalidateDeviceObjects(object sender, EventArgs e)
virtual void RestoreDeviceObjects(object sender, EventArgs e)
virtual void DeleteDeviceObjects(object sender, EventArgs e)
virtual void EnvironmentResizing(object sender, CancelEventArgs e)
这四个方法都是受保护(protected)的访问权限并且没有任何实现代码。这需要根据程序响应事件的要求来决定如何编写代码。每个事件方法的第一个参数是sender,发送事件进行处理的对象。目前情况下,sender就是发送消息的Direct3D设备变量。每个事件方法参数的第二个参数是对事件信息的描述。在后面章节中有比较详尽的事件信息的描述。
游戏处理
大部分的游戏框架十分相似,都有独立的方法来执行游戏逻辑,然后绘制当前的场景给用户。此框架也不例外,提供了两个方法:FrameMove()和Render()。
protected virtual void FrameMove()
{
// TODO : Frame movement
}
FrameMove()方法内部没有一行代码,需要手动添加。在方法内可以添加所有实际的游戏逻辑运算、人工智能处理、物理模型、网络通信等等。
protected virtual void Render()
{
if (device != null)
{
device.Clear(ClearFlags.Target, Color.Blue, 1.0f, 0);
device.BeginScene();
// TODO : Scene rendering
device.EndScene();
device.Present();
}
}
Render()方法呈现游戏场景。首先使用已有的Direct3D设备,将屏幕清屏为蓝色,并且开始绘制场景。然后,结束场景绘制并且由Direct3D设备呈现该场景给观众。
下一个方法就是Run()方法,该方法只是一个简单的While循环,循环条件是Created。Created是Form窗体类的bool类型的属性。当窗体是一个合法的Form窗体的时候,Created的值总是true;当Form窗体关闭的时候,返回false。每一次循环,执行游戏逻辑、呈现场景并且让应用程序处理所有事件。其代码为: