假设你从来没有使用过
VC# Express
,首先打开程序
:
让我们来创建你的第一个游戏,选择
File -> new project
选择
Windows Game
(
XNA
)摸版,输入一个你喜欢的名字,然后单击
OK
。
恭喜,你已经使用
XNA
创建了你的第一个
windows
游戏
^_^
选择
Build-> Build Solution
,然后按下
F5
(或者
Debug -> Start Debugging
),现在可以看到你的程序在运行了:一个淡蓝色的窗口。
好吧,我承认它并不是很有吸引力,但作为
nxa
的“
hello world
”程序,它其实传达了许多很重要的概念。来看看模板生成的代码:
打开
Program.cs
文件:
using
System;
namespace
WindowsGame1
{
static class Program
{
///<summary>
/// The main entry point for the application.
///</summary>
static void Main(string[] args)
{
using (Game1 game = new Game1())
{
game.Run();
}
}
}
}
很简单,所有程序都需要一个入口点,这里就是程序开始运行的地方。在main方法中,我们创建了Game1类的一个实例,并且调用了它的run方法。
来看看类Game1,大部分工作都在这里完成。打开Game1.cs文件:
using
System;
using
System.Collections.Generic;
using
Microsoft.Xna.Framework;
using
Microsoft.Xna.Framework.Audio;
using
Microsoft.Xna.Framework.Components;
using
Microsoft.Xna.Framework.Graphics;
using
Microsoft.Xna.Framework.Input;
using
Microsoft.Xna.Framework.Storage;
namespace
WindowsGame1
{
///<summary>
/// This is the main type for your game
///</summary>
partial class Game1 : Microsoft.Xna.Framework.Game
{
public Game1()
{
InitializeComponent();
}
protected override void Update()
{
// The time since Update was called last
float elapsed = (float)ElapsedTime.TotalSeconds;
// TODO: Add your game logic here
// Let the GameComponents update
UpdateComponents();
}
protected override void Draw()
{
// Make sure we have a valid device
if (!graphics.EnsureDevice())
return;
graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
graphics.GraphicsDevice.BeginScene();
// TODO: Add your drawing code here
// Let the GameComponents draw
DrawComponents();
graphics.GraphicsDevice.EndScene();
graphics.GraphicsDevice.Present();
}
}
}
这里的代码同样简单明了。
Game1
继承于
Microsoft.Xna.Famework.Game
,
Game
类是一个游戏的基本骨架。这个对象把你从创建窗口、设置图形卡等其他琐碎设置的操作中解放出来,省略了大量每次编写游戏时都需要重复的代码。如果你熟悉
MDX
,那么这个类的功能相当于
sdk sample framework
中的
Framework
类
,搭建了游戏的基本框架,设置了许多属性。
首先,无论你否使用,代码自动添加了
XNA
的几个程序集的引用。一般来说,总是会用到这些程序集,因此保留这些代码。接下来,实现了一个默认的构造函数,
Update
方法以及
Draw
方法。
我们依次来看这几个方法:
protected
override void Update()
{
float elapsed = (float)ElapsedTime.TotalSeconds;
UpdateComponents();
}
一旦程序开始运行之后,就会不停调用Update()方法。可以把这里认为是你的“game loop”。这里将有大量的事件将要发生,包括AI计算,玩家的位置移动,输入等等,所有更新操作都在这里处理。对这个程序来说,我们只是简单的更新程序运行至今的时间。之后,调用了UpdateComponents()方法,它将自动调用程序中其他子组件的Update方法。确保调用这个方法很重要,组件(component)在xna中扮演了很重要的角色,为了保证这些组件的行为正确,这是必须的。
protected
override void Draw()
{
if (!graphics.EnsureDevice())
return
;
graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
graphics.GraphicsDevice.BeginScene();
DrawComponents();
graphics.GraphicsDevice.EndScene();
graphics.GraphicsDevice.Present();
}
这里是程序的心脏也是灵魂部分。它完成了实在在屏幕上绘图的操作。当然,代码依然很简单。当程序创建时,将会创建一个名为
graphics
的对象,它是
GraphicsComponent
类的一个实例。
GraphicsComponent
是
XNA
中一个很重要也是很基本的类,提供了原来
MDX
中
Presentationparameters
和
Deivce
的功能。特别是
GraphicsComponent
的
GraphicsDevice
成员,其方法和属性和
MDX
中的
Device
都是类似的。
来看代码:
-
首先,确保创建了可用的设备,否则,跳出这个方法
-
把屏幕清理为背景颜色
Cornflower Blur
,当然,这里可以把背景设置为任何颜色,但通常都是黑色。
-
告诉显卡你将要开始在场景中绘制物体
-
告诉每个子组件绘制其本身
-
告诉图形卡绘图操作已经完成
-
最后,把绘制好的图形呈现到屏幕上
简单明了。
好了,这里你可能会问如何改变窗口的大小呢,如何全屏显示呢?嗯嗯,在Solution Explorer中右击Game1,选择设计视图。选择graphics组件。如前所属,我们在程序运行时就创建了一个
GraphicsComponent
对象。看一下属性窗口:
这些都是
GraphicsComponent
所暴露的默认公共属性。如果需要全屏显示,只需要把
IsFullScreen
的值该为
true
就可以了。如果你查看代码,可以看到在
Game1
的
InitializeComponent()
方法
中自动生成了
this
.graphics.IsFullScreen = true;
。如何还需要自动改变窗口大小,则需要改变Game1的AllowUserResizing属性,在构造函数中添加
this
.AllowUserResizing = true;
,此外,你还可以改变Game1的IsMouseVisible属性,选择是否显示鼠标。
再次强调,组件在XNA中的重要性。你的游戏是一个组件,同样,他也包含了许多其他组件,你可以把组件理解为搭建游戏的积木。你已经看到了,在update和draw方法中,我们依次调用每一个组件的update和draw方法。这个效果将会传播到每个组件的子组件。将来,我们将会看到更多的组件,比如目录组件,地形组件,FPS计数器之类的助手组件等等。后面的章节我们将逐渐讨论这些组件。
ok
,第一讲到此结束。
File-> Save All
…
. ^_^