WP7 入门:创建你的第一个 XNA 框架应用

红薯 发布于 2012/02/21 20:20
阅读 746
收藏 1

本文向你介绍为 Windows Phone 创建一个基本的 XNA 框架应用,完整的代码可从 Code Samples for Windows Phone 这里下载.

注意:下面的过程以 Visual Studio 2010 Express for Windows Phone 开发工具为准。

下面我们开始整个开发过程:

一. 创建新项目

请使用以下步骤创建新项目:

  1. 首先确认你已经下载并安装 Windows Phone SDK。详情请看 Installing the Windows Phone SDK.
  2. 从开始菜单中启动 Visual Studio 2010 Express for Windows Phone ,如果出现了注册窗口,你可以注册或者以后再说。
  3. 从菜单 File 中选择 New Project 来创建一个新项目
  4. 如下图所示的新建项目窗口中,展开左边的 Visual C# 模板,然后选择 XNA Game Studio 4.0 templates.

  5. 选择 Windows Phone Game (4.0) 模板,填写项目名称(随便你填什么)你也可以在这里指定项目存放的路径

    GetStartedNewProjectXNA
  6. 点击确定按钮,将会提示选择 Windows Phone 平台,在这里我们选择 Windows Phone 7.1

    GetStartedSelectPlatformXNA
  7. 点击确定后将创建一个新的项目,并在 Visual Studio 中打开 Game1.cs 文件的源码

二. 添加内容

在这部分中,我们将添加一些图片和声音文件到项目中。

  1. 首先确认 Visual Studio 中的解决方案浏览器可见,如果你找不到可以从菜单中 View | Other Windows | Solution Explorer 中打开

  2. 我们先添加图形文件,在这里我们使用的是 PhoneGameThumb.png 文件,该文件默认存放在 WindowsPhoneGame1\WindowsPhoneGame1\WindowsPhoneGame1 目录下。你也可以使用自己的图片文件,但这个图片的像素必须是 64 * 64。

    右击内容节点,在这里我们是 WindowsPhoneGame1Content (Content), 然后选择 Add | Existing Item. 找到并打开你的图形文件 WindowsPhoneGame1\WindowsPhoneGame1\WindowsPhoneGame1\PhoneGameThumb.png 然后点击添加,这样图形文件就添加到项目中。

    在解决方案浏览器中选择图形名称并在属性窗口中查看文件的信息。注意图形对象的 Asset Name 属性,在这里是 PhoneGameThumb.

    GetStartedPropertiesXNA
  3. 接下来添加声音文件,我们将使用 Windows Ding.wav 文件,你可以使用 Windows 7 系统中的搜索来找到这个文件,然后拷贝到 WindowsPhoneGame1\WindowsPhoneGame1\WindowsPhoneGame1 目录,当然你可以添加自己的其他声音文件,但不能太长时间的声音,一秒钟足够了。

    右击内容节点 WindowsPhoneGame1Content (Content), 选择 Add | Existing Item. 找到刚才的声音文件并点击添加,这样就将声音文件添加到项目中。

    在解决方案浏览器中选择声音文件并在属性窗口中查看对应的 Asset Name 值为 Windows Ding.

三. 编写代码

接下来我们要开始编写代码来在屏幕中移动两个图像,并检测图像是否有碰撞,并在碰撞的时候播放声音,我们需要做的是:

  • 添加一些变量

  • 利用 LoadContent 来加载图像和声音资源

  • 在屏幕中绘制图像

  • 更新图像的位置并检查是否碰撞

要添加到代码如下:

复制并粘贴下面的变量到 Game1 类中,将这些变量放在已有的 SpriteBatch spriteBatch 变量后面,这里是一些用来控制图像位置、速度、宽度和高度的变量,还有一个是存放声效的:

Texture2D texture1;
Texture2D texture2;
Vector2 spritePosition1;
Vector2 spritePosition2;
Vector2 spriteSpeed1 = new Vector2(50.0f, 50.0f);
Vector2 spriteSpeed2 = new Vector2(100.0f, 100.0f);
int sprite1Height;
int sprite1Width;
int sprite2Height;
int sprite2Width;

SoundEffect soundEffect;

然后使用下面的代码替换已有的 LoadContent 方法,该方法加载两次图像:

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

    texture1 = Content.Load<Texture2D>("PhoneGameThumb");
    texture2 = Content.Load<Texture2D>("PhoneGameThumb");
  
    soundEffect = Content.Load<SoundEffect>("Windows Ding");

    spritePosition1.X = 0;
    spritePosition1.Y = 0;

    spritePosition2.X = graphics.GraphicsDevice.Viewport.Width - texture1.Width;
    spritePosition2.Y = graphics.GraphicsDevice.Viewport.Height - texture1.Height;

    sprite1Height = texture1.Bounds.Height;
    sprite1Width = texture1.Bounds.Width;

    sprite2Height = texture2.Bounds.Height;
    sprite2Width = texture2.Bounds.Width;
}

使用以下代码替换现有的 Draw 方法,该方法用于在屏幕上根据变量中定义的位置来绘制图像:

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

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

    spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.Opaque);
    spriteBatch.Draw(texture2, spritePosition2, Color.Gray);
    spriteBatch.End();

    base.Draw(gameTime);

}

使用如下代码替换已有的 Update 方法,同时添加了 UpdateSpriteCheckForCollision 这两个方法,新的 Update 方法将在 UpdateSprite 方法中更新图像的位置,并调用 CheckForCollision 方法来检查两个图像是否碰撞,如果碰撞则会播放声音:

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

    // Move the sprite around.
    UpdateSprite(gameTime, ref spritePosition1, ref spriteSpeed1);
    UpdateSprite(gameTime, ref spritePosition2, ref spriteSpeed2);
    CheckForCollision();

    base.Update(gameTime);
}

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 - texture1.Width;
    int MinX = 0;
    int MaxY =
        graphics.GraphicsDevice.Viewport.Height - texture1.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(spritePosition1.X - (sprite1Width / 2), spritePosition1.Y - (sprite1Height / 2), 0), new Vector3(spritePosition1.X + (sprite1Width / 2), spritePosition1.Y + (sprite1Height / 2), 0));

    BoundingBox bb2 = new BoundingBox(new Vector3(spritePosition2.X - (sprite2Width / 2), spritePosition2.Y - (sprite2Height / 2), 0), new Vector3(spritePosition2.X + (sprite2Width / 2), spritePosition2.Y + (sprite2Height / 2), 0));

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

}

四. 构建并运行应用

到目前为止代码都已编写完毕,我们可以开始运行并调试该程序了。

  1. 在菜单中选择 Debug | Build Solution ,将对该项目进行构建,并且错误列表窗口中没有任何错误信息,你可以通过 View | Other Windows | Error List 来打开错误列表窗口,如果出错的话请检查前面几个步骤是否正确,然后重新构建。

  2. 在标准工具条中,设置发布平台为 Windows Phone Emulator 模拟器.

    Target on Standard Toolbar selecting emulator

  3. 选择菜单 Debug | Start Debugging 来启动应用,这将会打开模拟器并运行这个程序,你将看到两个图形在屏幕上动,一旦碰到一起就会播放声音。

    GetStartedFirstAppRunningXNA
  4. 如果模拟器进入锁屏状态,点击底部的按钮来解锁
  5. 你也可以设置调试断点,只需要在断点处点击出现光标,然后选择菜单 Debug | Toggle Breakpoint
  6. 想要终止调试,选择菜单 Debug | Stop Debugging 即可

到这里为止你已经创建了一个最基本的 XNA 应用,你也可以从 XNA Game Studio 4.0 阅读更多关于 XNA Game Studio 开发的资料。

加载中
返回顶部
顶部