游戏开发学习 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(nullstring.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);
                }

            }

        }

好了,现在可以自己控制这些信息的移动了。我还加了一个刷新控制,默认的频率是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();
                       
                    }

                }

            }

        }



    }


    
}


posted on 2007-02-06 17:14  超子  阅读(512)  评论(0编辑  收藏  举报

导航