创建第一个XNA程序:Hello XNA

移动开发
下面创建一个简单的Windows Phone 7的XNA程序,只是一个Hello XNA的文本,从屏幕的左上角一直往右下角移动,通过该例子来开始Windows Phone 7 XNA的游戏编程。

下面创建一个简单的Windows Phone 7的XNA程序,只是一个Hello XNA的文本,从屏幕的左上角一直往右下角移动,通过该例子来开始Windows Phone 7 XNA的游戏编程。

新建一个项目后可以看到这样的一个项目工程结构,如图所示。

项目工程结构

Content项目是表示游戏的资源文件,相关游戏的资源就需要在Content目录下进行添加。

看一下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.Input.Touch;  
  11. using Microsoft.Xna.Framework.Media;  
  12.  
  13. namespace HelloWorldXNA  
  14. {  
  15.     /// <summary> 
  16.     /// 游戏的主要主体类  
  17.     /// </summary> 
  18.     public class Game1 : Microsoft.Xna.Framework.Game  
  19.     {  
  20.         GraphicsDeviceManager graphics;//用于管理图形设备  
  21.         SpriteBatch spriteBatch;//游戏的图形设备来画2D对象  
  22.  
  23.         SpriteFont spriteFont1;//字体  
  24.         Viewport viewport;//窗体  
  25.         Vector2 textSize;//字体大小 二维向量  
  26.         Vector2 textPosition;//字体位置  
  27.  
  28.         public Game1()  
  29.         {  
  30.             graphics = new GraphicsDeviceManager(this);  
  31.             Content.RootDirectory = "Content";  
  32.  
  33.             // Frame rate is 30 fps by default for Windows Phone.  
  34.             TargetElapsedTime = TimeSpan.FromTicks(333333);  
  35.  
  36.             // Extend battery life under lock.  
  37.             InactiveSleepTime = TimeSpan.FromSeconds(1);  
  38.         }  
  39.  
  40.         /// <summary> 
  41.         /// 游戏运行前的一些初始化  
  42.         /// </summary> 
  43.         protected override void Initialize()  
  44.         {  
  45.             //在这里添加游戏的一些初始化处理  
  46.             base.Initialize();  
  47.         }  
  48.  
  49.         /// <summary> 
  50.         /// 加载游戏资源,LoadContent只会执行一次  
  51.         /// </summary> 
  52.         protected override void LoadContent()  
  53.         {  
  54.             // Create a new SpriteBatch, which can be used to draw textures.  
  55.             spriteBatch = new SpriteBatch(GraphicsDevice);  
  56.  
  57.             // TODO: use this.Content to load your game content here  
  58.             viewport = this.GraphicsDevice.Viewport;//获取游戏的窗体  
  59.             spriteFont1 = this.Content.Load<SpriteFont>("SpriteFont1");//加载字体资源  
  60.             textSize = spriteFont1.MeasureString("Hello,XNA!");//返回字符创的高度和宽度  
  61.             textPosition = new Vector2(0, 0);  
  62.         }  
  63.  
  64.         /// <summary> 
  65.         /// 游戏退出,回收资源  
  66.         /// </summary> 
  67.         protected override void UnloadContent()  
  68.         {  
  69.             // TODO: Unload any non ContentManager content here  
  70.         }  
  71.  
  72.         /// <summary> 
  73.         /// 绘制游戏前的更新处理  
  74.         /// </summary> 
  75.         /// <param name="gameTime">游戏的当前时间对象</param> 
  76.         protected override void Update(GameTime gameTime)  
  77.         {  
  78.             // Allows the game to exit  
  79.             if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)  
  80.                 this.Exit();  
  81.  
  82.             // TODO: Add your update logic here  
  83.             if (textPosition.X < viewport.Height)  
  84.             {  
  85.                 textPosition.Y += 10 * (float)gameTime.ElapsedGameTime.TotalSeconds;  
  86.                 textPosition.X += 20 * (float)gameTime.ElapsedGameTime.TotalSeconds;  
  87.             }  
  88.             else  
  89.             {  
  90.                 textPosition.Y -10000 * (float)gameTime.ElapsedGameTime.TotalSeconds;  
  91.                 textPosition.X -20000 * (float)gameTime.ElapsedGameTime.TotalSeconds;  
  92.             }  
  93.  
  94.             base.Update(gameTime);  
  95.         }  
  96.  
  97.         /// <summary> 
  98.         /// 绘制游戏  
  99.         /// </summary> 
  100.         /// <param name="gameTime">游戏的当前时间对象</param> 
  101.         protected override void Draw(GameTime gameTime)  
  102.         {  
  103.             GraphicsDevice.Clear(Color.CornflowerBlue);  
  104.  
  105.             // TODO: Add your drawing code here  
  106.             spriteBatch.Begin();  
  107.             spriteBatch.DrawString(spriteFont1, "Hello,XNA!", textPosition, Color.Red);  
  108.             spriteBatch.End();  
  109.  
  110.             base.Draw(gameTime);  
  111.         }  
  112.     }  

 

运行的效果如下:

运行效果

对于新建一个XNA for WP7的工程,可以看到在它的工程文件中,有:Initialize(), LoadContent(), Update(),Draw()这几个主要的函数,那由些也就可以看得出XNA开发游戏的一个基本架构了:

Loading:用来加载保证游戏可以正常运行的所有资源等,这个状态在整个系统中只在游戏开始前运行,也就是说整个游戏的生命周期中只运行一次。

Update:这个状态是由所设置的时间间隔来驱动的,在每个时间间隔里重新计算游戏中各角色的状态,以及游戏分值和各种游戏逻辑。一般默认为每秒30次(帧),如果设置间隔过大,游戏可能无法启动。

Draw:这个状态也是由所设置的时间间隔来驱动的,用来绘制各种变化到显示设置上。

对于XNA资源,在创建新的工程时,就一起创建了一个Content工程,所有的资源(图片、声音、视频、字体、3D造形、纹理等)都要加载到这个工程中,并被这个工程编译为.xnb格式的XNA二进制文件,这样才可以加载到游戏中,并被调用。

XNA游戏的生命周期如图所示:

XNA游戏的生命周期

1.GraphicsDeviceManager:在XNA类库介绍中提到的该类型是非常重要的。它为开发者提供方法来管理目标设备的显卡资源。简单地说就是调用显卡的一个接口,该对象的GraphicsDevice属性代表当前目标设备的显卡。

2.SpriteBatch:该对象主要的作用是绘制文字和2D图像。在游戏开发过程中,它的作用是非常重要的,因为游戏需要大部分图片、文字和声音等素材资源。所有游戏中需要显示的画面都必须经过SpriteBatch对象中的Draw方法来绘制。

3.Initialize( ):该方法用来初始化游戏程序的变量和对象。它允许游戏在运行之前做一些初始化的工作。可以在此查询任何需要的服务和载入与图形无关的内容。例如,显卡设备、游戏分数设置等。

4.LoadContent( ):当初始化完毕后,程序就进入LoadContent,该方法用来加载游戏的素材,包括游戏的模式、声音、图像等。这个方法在一个游戏中只会被调用一次,并且是加载所有素材的地方。

5.Update( ):该方法相当于Direct3D中的FrameMove,简单地说就是在图形上修改当前画面。它主要用于游戏执行一些逻辑,如:刷新画面、检查碰撞、更新分数、检测游戏进程、收集输入数据以及播放音频等。

6.Draw( ):该方法相当于Windows编程的Paint或者OnPaint,是系统自动绘图的方法。

游戏程序执行完LoadContent后,开始进入一个游戏循环,无论用什么语言编写游戏程序,都需要一个游戏循环,这也是游戏程序与应用程序的***区别。在XNA游戏项目中,游戏循环主要由Update和Draw两个方法组成。

原文链接:http://www.cnblogs.com/linzheng/archive/2011/09/20/2182964.html

【编辑推荐】

  1. XNA游戏开发中横竖屏的设置
  2. 详解Windows Phone XNA 4.0 3D游戏开发
  3. 爆料:C#和XNA可以在iOS和Android平台使用
责任编辑:王晓东 来源: 博客
相关推荐

2013-10-30 22:10:28

Clouda程序

2024-03-13 13:53:10

C++程序开发

2011-06-08 10:24:38

Windows Pho 应用程序

2011-06-08 10:01:36

Windows Pho 应用程序

2010-08-04 13:16:23

Flex项目

2023-06-01 08:24:08

OpenAIChatGPTPython

2023-05-19 08:49:58

SQLAlchemy数据库

2009-06-26 16:07:43

MyEclipse开发Hibernate程序

2010-07-30 14:50:38

Flex项目

2013-12-26 15:25:15

Android开发安装开发环境Hello World

2011-03-10 10:45:47

Azure“Hello Worl

2011-06-24 13:38:32

QT 编译 安装

2022-11-01 07:23:55

Dockernetcore程序

2012-05-22 14:26:15

XNA 横竖屏设置

2012-05-28 15:55:47

XNA 重力感应

2009-07-17 16:10:42

JRuby入门教程

2010-03-25 16:04:56

Python程序执行

2011-07-06 18:31:21

Xcode 4 iPhone 模拟器

2011-07-06 18:10:20

Xcode 4 iPhone

2009-03-13 15:23:01

女程序员编程张绮霞
点赞
收藏

51CTO技术栈公众号