游戏开发学习 02
ok,继续。现在有了一个具有一张背景的窗体了。现在我想在上面显示一些简单的信息(文本),并且希望这些信息在键盘的操作下能动起来。我找了一个1945的飞机图片,下一步我要用它来替换这些文字信息。
Step1:用到的东西,Direct3D.Font(用来处理文字的对象)、DirectInput.Device(输入设备,需要注意,Direct3D.Device 是图像设备 这两个类名称一样,在同级使用时需要显示的区分)、StopWatch(秒表类,.net frameworks 2.0 中新增的计时工具对象)。
使用Direct3D.Font对象向Direct3D.Device设备上显示文字很简单,初始化Font对象,使用它的DrawText方法就可以了,看代码 。
-- 初始化 Font --
DrawText()//写字
font.DrawText(null, string.Format("Draw at:{0} \n Frequency:{1} \n rate:{2} \n",DateTime.Now.ToString(),Stopwatch.Frequency.ToString(),stopWatch.ElapsedTicks.ToString()), point, Color.Red);
font.DrawText(null, string.Format("Draw at:{0} \n Frequency:{1} \n rate:{2} \n",DateTime.Now.ToString(),Stopwatch.Frequency.ToString(),stopWatch.ElapsedTicks.ToString()), point, Color.Red);
初始化Font对象的时候需要指定用于显示的设备,以及字体的基本信息(字形,字号)。DrawText(Sprite, string, point, Color) ,很简单。给出位置,文字,颜色就可以了。那么显然我根据键盘的输入来更新point就可以让它动起来了。
Step2:获得键盘的输入信息,使用DirectInput.Device 可以获取各种输入设备的输入信息,现在我要使用键盘输入。看代码。
-- 初始化 键盘设备(Input Device) --
关于DirectInput的初始化上面的代码是一个常规的操作,有些地方不很清楚,比如为什么要设定协作的等级,以及该表达式的具体意义?现在记住它就可以了。Acquire方法,表明开始获取该设备的输入。下面又是一个常规的操作,用一个256位的数组来存储所有按键的信息,我利用W、S、A、D 来代表上下左右,并且根据这些来更新point。看代码void UpdatePoint()
{
for (int i = 0; i < 256; i++)
keyStats[i].IsPressed = false;
foreach (Key key in input.GetPressedKeys())
{
keyStats[(int)key].IsPressed = true;
}
if(keyStats[(int)Key.W].IsPressed)
{
if (point.Y > 1)
point = new Point(point.X,point.Y - 1);
}
if (keyStats[(int)Key.S].IsPressed)
{
if (point.Y < this.Height)
point = new Point(point.X,point.Y + 1);
}
if (keyStats[(int)Key.A].IsPressed)
{
if (point.X > 1)
{
point = new Point(point.X - 1, point.Y);
}
}
if (keyStats[(int)Key.D].IsPressed)
{
if (point.X < this.Width)
{
point = new Point(point.X + 1, point.Y);
}
}
}
{
for (int i = 0; i < 256; i++)
keyStats[i].IsPressed = false;
foreach (Key key in input.GetPressedKeys())
{
keyStats[(int)key].IsPressed = true;
}
if(keyStats[(int)Key.W].IsPressed)
{
if (point.Y > 1)
point = new Point(point.X,point.Y - 1);
}
if (keyStats[(int)Key.S].IsPressed)
{
if (point.Y < this.Height)
point = new Point(point.X,point.Y + 1);
}
if (keyStats[(int)Key.A].IsPressed)
{
if (point.X > 1)
{
point = new Point(point.X - 1, point.Y);
}
}
if (keyStats[(int)Key.D].IsPressed)
{
if (point.X < this.Width)
{
point = new Point(point.X + 1, point.Y);
}
}
}
好了,现在可以自己控制这些信息的移动了。我还加了一个刷新控制,默认的频率是60,由于input的按键相应也是有一定频率限制的,所以提高设定的频率并不能提高相应的速度。但是设定了频率会节约开销,提高性能。到现在,一个简单的2d游戏最基本的特点都已经实现了。接下来要加入一些动画,和声音。我学习的例子是,微软中国的WebCast中的“视频游戏开发”系列。 本节所有代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;
using Microsoft.DirectX.DirectInput;
using DGDevice = Microsoft.DirectX.Direct3D.Device;
using DIDevice = Microsoft.DirectX.DirectInput.Device;
using D3DFont = Microsoft.DirectX.Direct3D.Font;
using GDIFont = System.Drawing.Font;
namespace GameHello02
{
public class GameWindow : Form
{
-- 私有成员 --
-- 构造函数 --
-- 初始化 Device --
-- 初始化 Texture --
-- 初始化 Font --
-- 初始化 Sprite --
-- 初始化 键盘设备(Input Device) --
-- 画图 Render() --
-- 辅助方法 --
void GameWindow_Paint(object sender, PaintEventArgs e)
{
this.Render();
}
-- 释放资源 --
static void Main()
{
using (GameWindow window = new GameWindow())
{
-- 初始化 --
while (window.Created)
{
stopWatch.Reset();
stopWatch.Start();
window.Render();
Application.DoEvents();
stopWatch.Stop();
currentFrameTime = (double)stopWatch.ElapsedTicks;
//进行时间补偿
double delta = frameTime - currentFrameTime;
if (delta > 0)
{
stopWatch.Reset();
stopWatch.Start();
while ((double)stopWatch.ElapsedTicks < delta) ;
stopWatch.Stop();
}
}
}
}
}
}
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;
using Microsoft.DirectX.DirectInput;
using DGDevice = Microsoft.DirectX.Direct3D.Device;
using DIDevice = Microsoft.DirectX.DirectInput.Device;
using D3DFont = Microsoft.DirectX.Direct3D.Font;
using GDIFont = System.Drawing.Font;
namespace GameHello02
{
public class GameWindow : Form
{
-- 私有成员 --
-- 构造函数 --
-- 初始化 Device --
-- 初始化 Texture --
-- 初始化 Font --
-- 初始化 Sprite --
-- 初始化 键盘设备(Input Device) --
-- 画图 Render() --
-- 辅助方法 --
void GameWindow_Paint(object sender, PaintEventArgs e)
{
this.Render();
}
-- 释放资源 --
static void Main()
{
using (GameWindow window = new GameWindow())
{
-- 初始化 --
while (window.Created)
{
stopWatch.Reset();
stopWatch.Start();
window.Render();
Application.DoEvents();
stopWatch.Stop();
currentFrameTime = (double)stopWatch.ElapsedTicks;
//进行时间补偿
double delta = frameTime - currentFrameTime;
if (delta > 0)
{
stopWatch.Reset();
stopWatch.Start();
while ((double)stopWatch.ElapsedTicks < delta) ;
stopWatch.Stop();
}
}
}
}
}
}