之前的一章,我提到在你创建的简单蓝色屏幕后实际上有许多事情发生。让我们对那段代码看得更深一点,看看实际上是什么在运行。打开你在第1章创建的游戏项目以便开始。
看看场景之后
program.cs文件相当直接。你的Main方法,创建了一个新的对象类型Game1,并执行它的Run方法,放在这个文件里。
你的游戏真正的东西在Game1.cs文件中。那个文件的代码将看起来如下:
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using Microsoft.Xna.Framework;
5 using Microsoft.Xna.Framework.Audio;
6 using Microsoft.Xna.Framework.Content;
7 using Microsoft.Xna.Framework.GamerServices;
8 using Microsoft.Xna.Framework.Graphics;
9 using Microsoft.Xna.Framework.Input;
10 using Microsoft.Xna.Framework.Media;
11 using Microsoft.Xna.Framework.Net;
12 using Microsoft.Xna.Framework.Storage;
13 namespace Collision
14 {
15 /// <summary>
16 /// This is the main type for your game
17 /// </summary>
18 public class Game1 : Microsoft.Xna.Framework.Game
19 {
20 GraphicsDeviceManager graphics;
21 SpriteBatch spriteBatch;
22 A Look Behind the Scenes | 9
23 public Game1()
24 {
25 graphics = new GraphicsDeviceManager(this);
26 Content.RootDirectory = "Content";
27 }
28 protected override void Initialize()
29 {
30 // TODO: Add your initialization logic here
31 base.Initialize();
32 }
33 protected override void LoadContent()
34 {
35 // Create a new SpriteBatch, which can be used to draw textures.
36 spriteBatch = new SpriteBatch(GraphicsDevice);
37 // TODO: use this.Content to load your game content here
38 }
39 protected override void UnloadContent()
40 {
41 // TODO: Unload any non ContentManager content here
42 }
43 protected override void Update(GameTime gameTime)
44 {
45 // Allows the game to exit
46 if (GamePad.GetState(PlayerIndex.One).Buttons.Back ==
47 ButtonState.Pressed)
48 this.Exit();
49 // TODO: Add your update logic here
50 base.Update(gameTime);
51 }
52 protected override void Draw(GameTime gameTime)
53 {
54 GraphicsDevice.Clear(Color.CornflowerBlue);
55 // TODO: Add your drawing code here
56 base.Draw(gameTime);
57 }
58 }
59 }
在这个代码中你会注意到几个类层次(class-level)的变量被自动提供,还有Game1的构造器和5个其他方法。第一个类层次的变量是类型GraphicsDeviceManager.这是非常重要的对象,因为它提供你,作为一个开发者,一种访问你PC、Xbox360或Zune上设备的方式。GraphicsDeviceManager对象有一个属性叫GraphicsDevice,代表你机器上的实际图形设备。因为那个图形设备用作你的XNA游戏和图形卡(或更精确的是GPU)间的中间机构,在你的XNA游戏中你在屏幕上做的每样事都会通过这个对象运行。
第二个变量是SpriteBatch类的一个实例 。这是你用来绘制精灵的核心对象。在计算机图形术语里,一个精灵被定义为一个整合到一个更大的场景中的2D或3D图像。2D游戏通过绘制多个精灵来制作(玩家精灵、敌人精灵、背景精灵等)。通过这章,你将能使用这个概念并绘制你自己的精灵。
Initialize方法用来初始化变量和其他与Game1对象相关的对象。你的图像设备对象此刻会初始化并能被用于Initialize方法中来帮助你初始化其他依赖它设置的对象。你会用这个方法来初始化得分值和本书以后章节中其他这样的项。
LoadContent方法在Initialize方法后调用,还用在游戏图像内容需要重载时调用(例如,图像设备因玩家改变显示设置重置,或其他类似事情)LoadContent方法是你加载所有图像和其他内容的地方,包括图像、模型、声音等等。另外,因你当前的工程什么也不做,这个方法就没什么事发生。
在LoadConten方法完成后,Game1对象进入类似游戏循环的东西。几乎所有的游戏用某种形式的游戏循环。
在XNA中,游戏循环只包含两个方法:Update和Draw。你应该试着在Draw方法里做尽可能少的事情,除了绘制你的场景。你的游戏中运行的其他事情(涉及移动对象、检测碰撞,更新分数、检查游戏结束逻辑等等)应该发生在Update方法里。