导出 (0) 打印
全部展开

如何创建 XNA Framework 应用程序

2012/2/9

本主题说明如何创建整个系列中使用的 XNA Framework 应用程序的基本功能。该应用程序是一个简单游戏。完成本主题之后,将生成一个可在屏幕上移动一个方块图形对象的应用程序。本系列的后续主题将对此基本基础结构进行扩展,添加冲突检测,将级别添加到游戏,同时添加记分板来显示当前分数和当前级别。完整游戏就绪后,将添加试用体验。

注意注意:

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

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

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

创建新项目的步骤

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

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

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

  4. 选择“Windows Phone Game (4.0)”模板。按需要填写项目“名称”。您还可以指定“位置”“解决方案名称”或保留默认值。

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

    GetStartedSelectPlatformXNA
  6. 单击“确定”。将创建一个新的项目,并将在 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

在此步骤中,您将添加会环绕屏幕移动图形对象的代码。以下代码负责:

  • 添加一些变量。

  • LoadContent 方法中加载您的图形对象。

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

  • Update 循环中更新您的图形对象位置。

添加基本游戏逻辑

  1. 使用以下代码替换“Game1.cs”Game1 类的代码。这是环绕屏幕移动子画面对象的基本游戏逻辑。

    
        public class Game1 : Microsoft.Xna.Framework.Game
        {
            GraphicsDeviceManager graphics;
            SpriteBatch spriteBatch;
    
            Texture2D texture;
            Vector2 spritePosition;
            Vector2 spriteSpeed;
            int sprite1Height;
            int sprite1Width;
    
            public Game1()
            {
                graphics = new GraphicsDeviceManager(this);
                graphics.PreferredBackBufferWidth = 800;
                graphics.PreferredBackBufferHeight = 480;
                graphics.IsFullScreen = true;
                graphics.SupportedOrientations = DisplayOrientation.LandscapeLeft | DisplayOrientation.LandscapeRight;
    
                Content.RootDirectory = "Content";
    
                // Frame rate is 30 fps by default for Windows Phone.
                TargetElapsedTime = TimeSpan.FromMilliseconds(33.3333);
    
            }
    
            /// <summary>
            /// Allows the game to perform any initialization it needs to before starting to run.
            /// This is where it can query for any required services and load any non-graphic
            /// related content.  Calling base.Initialize will enumerate through any components
            /// and initialize them as well.
            /// </summary>
            protected override void Initialize()
            {
                spriteSpeed = new Vector2(50.0f, 50.0f);
                base.Initialize();
            }
    
            /// <summary>
            /// LoadContent will be called once per game and is the place to load
            /// all of your content.
            /// </summary>
            protected override void LoadContent()
            {
                // Create a new SpriteBatch, which can be used to draw textures.
                spriteBatch = new SpriteBatch(GraphicsDevice);
    
                texture = Content.Load<Texture2D>("PhoneGameThumb");
    
                spritePosition.X = 0;
                spritePosition.Y = 0;
    
                sprite1Height = texture.Bounds.Height;
                sprite1Width = texture.Bounds.Width;
    
            }
    
            /// <summary>
            /// UnloadContent will be called once per game and is the place to unload
            /// all content.
            /// </summary>
            protected override void UnloadContent()
            {
                // TODO: Unload any non ContentManager content here
            }
    
            /// <summary>
            /// Allows the game to run logic such as updating the world,
            /// checking for collisions, gathering input, and playing audio.
            /// </summary>
            /// <param name="gameTime">Provides a snapshot of timing values.</param>
            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 spritePosition, ref spriteSpeed);
                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 - texture.Width;
                int MinX = 0;
                int MaxY =
                    graphics.GraphicsDevice.Viewport.Height - texture.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;
                }
    
            }
    
            /// <summary>
            /// This is called when the game should draw itself.
            /// </summary>
            /// <param name="gameTime">Provides a snapshot of timing values.</param>
            protected override void Draw(GameTime gameTime)
            {
                graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
    
                // Draw the sprite.
                spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend);
                
                spriteBatch.Draw(texture, spritePosition, Color.White);
                spriteBatch.End();  
              
                // Call the Draw method on the scoreBoard object to update the scoreboard.
                base.Draw(gameTime);
    
            }
    
        }
    
    
  2. 通过选择“生成 | 生成解决方案”菜单命令生成解决方案。应准确无误地生成项目。您可以打开“错误列表”窗口,如果未打开该窗口,可以通过选择“视图 | 错误列表”菜单命令打开它。如果出现错误,检查以上步骤并改正错误,然后再次生成解决方案。

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

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

  4. 通过选择“调试 | 启动调试”菜单命令运行应用程序。这将打开模拟器窗口并启动该应用程序。您将看到一个围绕屏幕弹跳的图形。

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

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

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

现在已定义 XNA Framework 应用程序的基本功能。该游戏由一个环绕屏幕跳动的方块图形对象构成。本序列的后续主题中,将会增强游戏的功能。游戏规则为,用户试图点按屏幕上移动的方块,每次命中或冲突将记录为用户的得分。下一节将介绍用户点按屏幕图形的检测。除检测用户对对象的点按操作外,还将创建一个显示用户当前得分的记分板,和一种设置多个游戏级别的机制。具备此基础结构之后,将在试用模式下运行游戏,检测当前游戏的许可证;游戏在试用模式下时,玩家只能玩第一个级别。

本系列的下一个主题将演示如何将冲突检测添加到应用程序。这将形成此应用程序的游戏运行基础。每当用户点按环绕屏幕移动的对象时,命中或冲突的次数就会增加并作为游戏的得分记录。

如何将冲突检测添加到 XNA Framework 应用程序

显示:
© 2014 Microsoft