技术开发 频道

使用XNA开发Windows Phone 7游戏

  【IT168技术】游戏始终是一个平台发展的源动力,对于微软windows phone来说更是发展关键。前几篇文章介绍了微软XNA框架的一些概念,本节内容主要是给大家介绍如何构使用XNA开发Windows Phone 7游戏。

建立Windows Phone 7游戏项目
▲图书介绍

  提示:

  Windows Phone 7下开发XNA游戏,需要计算机的显卡支持DirectX 9。

  一、 建立Windows Phone 7游戏项目

  1.创建一个新的Windows Phone 7游戏工程

  1)在开始菜单上运行Visual Studio 2010 Express for Windows Phone。

  2)单击File,选择New Project选项,新建一个Windows Phone 7的工程。

  3)在New Project窗口中,选择XNA Game Studio 4.0。

  4)选择Windows Phone Game(4.0)。在窗口的底部Name文本框中输入工程名称My Game。如图4-2所示。

使用XNA开发Windows Phone 7游戏

  ▲图4-2 建立XNA项目

  5)单击OK按钮,这样就建好一个Windows Phone 7 Game项目了。

  提示:

  可以填入自己喜欢的工程名字,同时亦可以改变工程的路径。

  2.添加素材

  1)确定Solution Explorer窗口中已经显示IDE。右击My GameContent(Content),在弹出的菜单中,选择Add,接着在子菜单中选择Existing Item。在弹出的路径窗口中,选择以下路径:My Game\My Game\My Game\GameThumbnail.png,然后单击OK按钮。

  2)添加一个声音文件,方法如上。路径设为My Game\My Game\My Game\Game-Thumbnail.png,然后单击OK按钮。

  提示:

  可以选择不一样的图片或者声音。注意声音只支持wav格式的。不同的计算机中有可能找不到这些文件,可以通过搜索找到这些文件,然后在添加素材的时候指定对应的路径就可以了。

  3)最终情况如图4-3所示。

建立Windows Phone 7游戏项目
▲图4-3 添加素材

  3.添加代码

  1)打开Game1.cs文件,在SpriteBatch spriteBatchg下面添加以下代码:

Texture2D texture_1;
Texture2D texture_2;
Vector2 spritePosition_1;
Vector2 spritePosition_2;

Vector2 spriteSpeed_1
= new Vector2(25.0f, 25.0f);
Vector2 spriteSpeed_2
= new Vector2(50.0f, 50.0f);
int sprite_1_Height;
int sprite_1_Width;
int sprite_2_Height;
int sprite_2_Width;

SoundEffect soundEffect;

  2)用以下代码替代原来的LoadContent()方法:

protected override void LoadContent()
{
    
// Create a new SpriteBatch, which can be used to draw textures.
    spriteBatch
= new SpriteBatch(GraphicsDevice);

    spriteBatch
= new SpriteBatch(GraphicsDevice);
    texture_1
= Content.Load<Texture2D>("GameThumbnail");
    texture_2
= Content.Load<Texture2D>("GameThumbnail");

    soundEffect
= Content.Load<SoundEffect>("Windows Ding");

    spritePosition_1.X
= 0;
    spritePosition_1.Y
= 0;

    spritePosition_2.X
= graphics.GraphicsDevice.Viewport.Width - texture_1.Width;
    spritePosition_2.Y
= graphics.GraphicsDevice.Viewport.Height - texture_1.Height;

    sprite_1_Height
= texture_1.Bounds.Height;
    sprite_1_Width
= texture_1.Bounds.Width;

    sprite_2_Height
= texture_2.Bounds.Height;
    sprite_2_Width
= texture_2.Bounds.Width;

}

  3)用以下代码替代原来的Draw(GameTime gameTime)方法:

protected override void Draw(GameTime gameTime)
{
    graphics.GraphicsDevice.Clear(Color.CornflowerBlue);

    
// Draw the sprite.
    spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend);
    spriteBatch.Draw(texture_1, spritePosition_1, Color.White);
    spriteBatch.End();

    spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.Opaque);
    spriteBatch.Draw(texture_2, spritePosition_2, Color.Gray);
    spriteBatch.End();

    base.Draw(gameTime);

}

  4)用以下代码替代原来的Update(GameTime gameTime)方法:

protected override void Update(GameTime gameTime)
{
                
// Allows the game to exit
    
if (GamePad.GetState(PlayerIndex.One).Buttons.Back ==ButtonState.Pressed)
    this.Exit();

    
// Move the sprite around.
    UpdateSprite(gameTime, ref spritePosition_1, ref spriteSpeed_1);
    UpdateSprite(gameTime, ref spritePosition_2, ref spriteSpeed_2);
    CheckForCollision();

    base.Update(gameTime);

}

  5)另外添加UpdateSprite 和 CheckForCollision这两个函数。

void UpdateSprite(GameTime gameTime, ref Vector2 spritePosition, ref Vector2 spriteSpeed)
{
    
// Move the sprite by speed, scaled by elapsed time.
    spritePosition
+= spriteSpeed * (float)gameTime.ElapsedGameTime.TotalSeconds;

    
int MaxX =graphics.GraphicsDevice.Viewport.Width - texture_1.Width;
    
int MinX = 0;
    
int MaxY = graphics.GraphicsDevice.Viewport.Height - texture_1.Height;
    
int MinY = 0;

    
// Check for bounce.
    
if (spritePosition.X > MaxX)
    {
        spriteSpeed.X
*= -1;
        spritePosition.X
= MaxX;
    }

    
else if (spritePosition.X < MinX)
    {
        spriteSpeed.X
*= -1;

        spritePosition.X
= MinX;
    }

    
if (spritePosition.Y > MaxY)
    {
        spriteSpeed.Y
*= -1;
        spritePosition.Y
= MaxY;
    }

    
else if (spritePosition.Y < MinY)
    {
        spriteSpeed.Y
*= -1;
        spritePosition.Y
= MinY;
    }

}

void CheckForCollision()
{
    BoundingBox bb1
= new BoundingBox(new Vector3(spritePosition_1.X - (sprite_1_Width / 2),
                             spritePosition_1.Y
- (sprite_1_Height / 2), 0),
                            
new Vector3(spritePosition_1.X + (sprite_1_Width / 2),
                             spritePosition_1.Y
+ (sprite_1_Height / 2), 0));

    BoundingBox bb2
= new BoundingBox(new Vector3(spritePosition_2.X - (sprite_2_Width / 2),
                             spritePosition_2.Y
- (sprite_2_Height / 2), 0),
                            
new Vector3(spritePosition_2.X + (sprite_2_Width / 2),
                             spritePosition_2.Y
+ (sprite_2_Height / 2), 0));

    
if (bb1.Intersects(bb2))
    {
        soundEffect.Play();
    }

}

  生成和调试游戏程序

  至此,创建的Windows Game XNA项目已经完成,接下来看下运行的效果。

  1)首先选择部署目标设备,在这里选择的是模拟器,如图4-4所示。

生成和调试游戏程序

  ▲图4-4 选择目标设备

  2)然后执行部署命令,可以右击解决方案窗口的工程,选择Deploy Solution,如图4-5所示。

生成和调试游戏程序
▲图4-5 部署工程到目标设备

  3)执行Debug菜单的Start Debugging命令。或者单击工具栏上的绿色运行按钮,如图4-6所示。最终效果如图4-7所示。

生成和调试游戏程序
▲图4-6 执行调试

生成和调试游戏程序
▲图4-7 最终效果图

  Windows Phone 7 XNA游戏结构分析

  通过上面的例子,可以创建一个在Windows Phone 7平台下运行的比较简单的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两个方法组成。XNA的生命周期如图4-8所示。

Windows Phone 7 XNA游戏结构分析
▲图4-8 XNA的生命周期

  从图4-8中可知,当游戏程序执行完Initialize、LoadContent方法后,即初始化图像、声音和输入控制器,载入游戏资源(图片、声音等)后开始进入游戏循环,Update方法有两个出口,如果游戏继续运行,则执行Draw方法;如果游戏结束,则执行UploadContent方法。

0
相关文章