信息
您所需的主题如下所示。但此主题未包含在此库中。

如何为 Windows Phone 创建第一个 XNA Framework 应用程序

2012/2/9

本主题向您介绍为 Windows Phone 创建基本 XNA Framework 应用程序所需的步骤。您可以在 Windows Phone 的代码示例中找到这个完成的 Hello XNA Framework 示例。

注意注意:

以下过程中的步骤用于 Visual Studio 2010 Express for Windows Phone。 当您使用用于 Visual Studio 2010 Professional 或 Visual Studio 2010 Ultimate 的插件时,您可能会看到菜单命令或窗口布局中的一些微小改变。

为 Windows Phone 创建 XNA Framework 应用程序的第一步是创建新项目。

创建新项目的步骤

  1. 确保下载并安装了 Windows Phone SDK。有关更多信息,请参阅安装 Windows Phone SDK

  2. 从 Windows“开始”菜单启动 Visual Studio 2010 Express for Windows Phone。如果显示“注册”窗口,则可以进行注册或暂时关闭该窗口。

  3. 通过选择“文件 | 新建项目”菜单命令来创建一个新项目。

  4. 将显示“新建项目”窗口。展开 Visual C# 模板,然后选择 XNA Game Studio 4.0 模板。

  5. 选择“Windows Phone 游戏(4.0)”模板。填写所需的项目“名称”。还可以指定“位置”“解决方案名称”或保留默认值。

    GetStartedNewProjectXNA
  6. 单击“确定”。将显示 Windows Phone 平台选择窗口。为“目标 Windows Phone 版本”选择 Windows Phone 7.1

    GetStartedSelectPlatformXNA
  7. 单击“确定”。此时将创建一个新项目并在 Visual Studio 中打开 Game1.cs 源文件。

下一步是向您的项目中添加内容,在本例中是一个图形对象和一个声音文件。

将内容添加至项目

  1. 确保“解决方案资源管理器”在 Visual Studio 中可见。如果不可见,则选择“查看 | 其他窗口 | 解决方案资源管理器”来使其出现。

  2. 要添加的第一个项目是图形文件。本示例将使用默认情况下在该项目的 WindowsPhoneGame1\WindowsPhoneGame1\WindowsPhoneGame1 目录中创建的 PhoneGameThumb.png 文件。可以使用 PhoneGameThumb.png 或自己的图形文件,但是为了获得最佳效果,图形对象的大小应该大约为 64 x 64 像素。

    右键单击“内容”节点,在本例中名为 WindowsPhoneGame1Content (Content),然后选择“添加 | 现有项目”。浏览到您的图形文件 - 在本例中为 WindowsPhoneGame1\WindowsPhoneGame1\WindowsPhoneGame1\PhoneGameThumb.png,然后单击“添加”。该图形对象将添加到项目中。

    “解决方案资源管理器”中选择该图形名称,然后在“属性”窗口中查看此文件属性。记下该图形对象的“资产名称”(在本例中为 PhoneGameThumb)。

    GetStartedPropertiesXNA
  3. 下一步是添加声音文件。本示例将使用 Microsoft Windows 7 附带的 Windows Ding.wav 声音文件。在您的计算机上搜索 Windows Ding.wav 并将其复制到 WindowsPhoneGame1\WindowsPhoneGame1\WindowsPhoneGame1 目录。也可以使用自己的声音文件,但最好是非常短暂的声音,长度大约 1 秒。

    右键单击“内容”节点,在本例中名为 WindowsPhoneGame1Content (Content),然后选择“添加 | 现有项目”。浏览到您的声音文件 - 在本例中为 WindowsPhoneGame1\WindowsPhoneGame1\WindowsPhoneGame1\Windows Ding.wav,然后单击“添加”。该声音文件将添加到项目中。

    “解决方案资源管理器”中选择该声音文件,然后在“属性”窗口中查看该文件的属性。记下该声音的“资产名称”(在本例中为 Windows Ding)。

在此步骤中,您将添加执行以下操作的代码:围绕屏幕移动两个图形对象、检测图形对象何时冲突并在图形对象冲突时播放声音。在项目中查看默认情况下为您添加的代码。已提供游戏应用程序的框架。后续步骤将带您完成以下过程:

  • 添加一些变量。

  • 采用 LoadContent 方法加载您的图形对象和声音资产。

  • 采用 Draw 循环在屏幕上绘制您的图形对象。

  • 采用 Update 循环更新图形对象的位置并检测冲突。

添加代码的步骤

  1. 将以下变量复制并粘贴到 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;
    
    
  2. 用以下代码行替换 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;
    }
    
    
  3. 用以下代码行替换 Draw 方法。该代码将在屏幕上图形对象的当前位置绘制每个图形对象。为图形对象提供了不同的 BlendState 以便它们看起来稍有不同,因为本示例对每个 sprite 使用相同的图形文件。

    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);
    
    }
    
    
  4. 用以下代码行替换 Update 方法。该代码还添加 UpdateSpriteCheckForCollision 方法。Update 方法中的新代码将命令每个 sprite 采用 UpdateSprite 方法更新其位置。UpdateSprite 方法还检查对象是否撞到边线,如果撞到,则更改其方向。最后,Update 调用 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. 通过选择“调试 | 生成解决方案”菜单命令来生成解决方案。应该生成该项目并且“错误列表”窗口中没有任何错误。您可以通过选择“查看 | 其他窗口 | 错误列表”菜单命令来打开“错误列表”窗口(如果该窗口尚未打开)。如果存在错误,请查看上面的步骤,纠正任何错误,然后再次生成解决方案。

  2. 在标准工具栏上,将应用程序的部署目标设置为“Windows Phone 模拟器”

    选择模拟器的标准工具栏上的目标

  3. 通过选择“调试 | 开始调试”菜单命令运行该应用程序。这将打开模拟器窗口并启动该应用程序。您将看到两个图形在屏幕周围反弹并在交叉时播放声音。

    GetStartedFirstAppRunningXNA
  4. 如果模拟器超时进入锁定屏幕,您可以通过点按屏幕底部并向上滑动来解锁。

  5. 您可以通过将光标放在所需的代码行上并选择“调试 | 切换断点”菜单命令在代码中设置调试断点。

  6. 若要停止调试,请选择“调试 | 停止调试”菜单命令。

现在,您已为 Windows Phone 创建了一个基本的 XNA Framework 应用程序。有关 XNA Game Studio 开发的更多信息,请参阅 XNA Game Studio 4.0

显示:
© 2015 Microsoft