此主题尚未评级 - 评价此主题

如何为 Windows Phone 创建第一个 XNA Game Studio 4.0 应用

2013/12/5

适用于:Windows Phone OS 7.1

本主题提供分步指导以帮助您为 Windows Phone 创建第一个 XNA Game Studio 4.0 应用。您也可以下载完整的 Hello XNA Framework 示例

仍完全支持面向 Windows Phone OS 7.1 的 XNA Game Studio 4.0 应用,并且它可以继续在 Windows Phone 8 设备上运行。然而,您不能编译或将 XNA Framework 应用升级到面向 Windows Phone OS 8.0。有关支持 Windows Phone 8 中的 XNA Framework 应用的更多信息,请参见 XNA Framework 和 Windows Phone 8 开发

说明注意:

以下过程中的步骤适用于 Visual Studio Express 2012 for Windows Phone。如果您已经在 Visual Studio 中自定义了布局或菜单,或者您正在使用 Visual Studio Professional 或更高版本,您可能会发现菜单命令或窗口布局稍有不同。

本主题包含以下各节。

为 Windows Phone 创建 XNA Game Studio 4.0 应用的第一步是创建一个新项目。

创建项目的步骤

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

  2. 从 Windows“开始”屏幕启动 Visual Studio。如果显示“注册”窗口,您可以注册产品或暂时关闭该提示。

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

  4. 在 Visual C# 模板的列表中,在 XNA Game Studio 4.0 组中,选择 Windows Phone Game (4.0) 模板。在“新建项目”窗口的底部,您可以保留 WindowsPhoneGame1 作为项目的“名称”

    GetStartedNewProjectXNA
  5. 单击“确定”。不显示 Windows Phone 平台选择对话框,因为您仅可以创建面向 Windows Phone OS 7.1 的 XNA Framework 应用。

  6. 已创建新项目,并在 Visual Studio 设计器中打开 Game1.cs

下一步是向解决方案添加图形对象和声音文件。

添加内容的步骤

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

  2. “解决方案资源管理器”中,请注意已创建的第二个项目以容纳应用的内容。如果您已保持默认项目名称,此内容项目将显示为 WindowsPhoneGame1Content (Content)。在此过程中向此项目添加内容文件。

  3. 要添加的第一个项目是图形文件。您可以使用默认情况下已添加至新项目的 PhoneGameThumb.png,或者使用自己的图形文件。要达到最佳效果,图形对象的大小应大约为 64 x 64 像素。

    “解决方案资源管理器”中,右键单击内容项目的项目节点,并选择“添加 | 现有项”。在“添加现有项”对话框中,选择文件类型列表中的“图像文件”。浏览至图形文件,选择该文件,然后单击“添加”。该图形对象已添加到项目中。

    “解决方案资源管理器”中选择图形文件。然后,在“属性”窗口中查看文件属性。请注意,该图形对象的“资产名称”PhoneGameThumb

  4. 要添加的下一个项目是声音文件。此示例使用 Windows 附带的 Windows Ding.wav 声音文件。您也可以使用自己的声音文件。最好是非常短暂的声音,长度大约为 1 秒。

    “解决方案资源管理器”中,右键单击内容项目的项目节点,并选择“添加 | 现有项”。在“添加现有项”对话框中,选择文件类型列表中的“音频文件”。浏览至 C:\Windows\Media,选择 Windows Ding.wav,然后单击“添加”。该声音文件已添加到项目中。

    “解决方案资源管理器”中选择声音文件。然后,在“属性”窗口中查看文件属性。请注意,该声音的“资产名称”Windows Ding

    下图显示使用图形文件和声音文件的内容项目。

    GetStartedPropertiesXNA

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

  • 添加一些变量。

  • 采用 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,以便它们以不同的方式显示。

    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 方法。“更新”方法中的新代码将更新 UpdateSprite 方法中的每个 sprite 的位置。UpdateSprite 方法还检查 sprite 是否命中屏幕的侧面。如果 sprite 命中了屏幕的侧面,代码将更改 sprite 移动的方向。最后,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 模拟器 的某个值,例如“模拟器 WVGA”

    Target on Standard Toolbar selecting emulator

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

    GetStartedFirstAppRunningXNA
  4. 如果启动锁定屏幕,您可以通过单击屏幕底部并使用鼠标向上滑动来解锁模拟器。

  5. 若要停止调试,您可以选择“调试 | 停止调试”菜单命令。

现在,您可以为 Windows Phone 创建基本的 XNA Game Studio 4.0 应用。有关 XNA Game Studio 开发的更多信息,请参见以下主题:

本文是否对您有所帮助?
(1500 个剩余字符)
感谢您的反馈
显示:
© 2014 Microsoft. 版权所有。