技术开发 频道

使用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();
    }

}

0
相关文章