您的位置:首页 > 其它

windows Phone开发(6)第一个 XNA Framework 应用程序

2012-06-25 19:31 465 查看
  Windows Phone开发现在有两个框架可供选择,一个是SilverLight,主要用于做应用开发,另一个是XNA Framework,主要用于游戏开发。在上一篇当文章中,我结合MSDN的教程简单总结了一下创建SilverLight应用程序的方法和基本步骤。本文将介绍和总结Windows Phone创建基本 XNA Framework 应用程序所需的步骤。

第一,View Code

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Input.Touch;
using Microsoft.Xna.Framework.Media;

namespace WindowsPhoneGame1
{
/// <summary>
/// 这是游戏的主类型
/// </summary>
public class Game1 : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
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;

/// <summary>
/// 构造方法
/// </summary>
public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";

// Windows Phone 的默认帧速率为 30 fps。
TargetElapsedTime = TimeSpan.FromTicks(333333);

// 延长锁定时的电池寿命。
InactiveSleepTime = TimeSpan.FromSeconds(1);
}

/// <summary>
/// 允许游戏在开始运行之前执行其所需的任何初始化。
/// 游戏能够在此时查询任何所需服务并加载任何非图形
/// 相关的内容。调用 base.Initialize 将枚举所有组件
/// 并对其进行初始化。
/// </summary>
protected override void Initialize()
{
// TODO: 在此处添加初始化逻辑

base.Initialize();
}

/// <summary>
/// 对于每个游戏会调用一次 LoadContent,
/// 用于加载所有内容。
/// </summary>
protected override void LoadContent()
{
// 创建新的 SpriteBatch,可将其用于绘制纹理。
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;

}

/// <summary>
/// 对于每个游戏会调用一次 UnloadContent,
/// 用于取消加载所有内容。
/// </summary>
protected override void UnloadContent()
{
// TODO: 在此处取消加载任何非 ContentManager 内容
}

/// <summary>
/// 允许游戏运行逻辑,例如更新全部内容、
/// 检查冲突、收集输入信息以及播放音频。
/// </summary>
/// <param name="gameTime">提供计时值的快照。</param>
protected override void Update(GameTime gameTime)
{
// 允许游戏退出
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);
}

/// <summary>
/// 当游戏该进行自我绘制时调用此项。
/// </summary>
/// <param name="gameTime">提供计时值的快照。</param>
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);

// 该代码将在屏幕上图形对象的当前位置绘制每个图形对象。
//为图形对象提供了不同的 BlendState 以便它们看起来稍有不同,因为本示例对每个 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);
}

/// <summary>
/// 检查对象是否撞到边线,如果撞到,则更改其方向
/// </summary>
/// <param name="gameTime"></param>
/// <param name="spritePosition"></param>
/// <param name="spriteSpeed"></param>
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;
}

}

/// <summary>
/// 检查每个图形对象的边界是否彼此交叉。如果彼此交叉,则播放声音。
/// </summary>
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();
}

}

}
}


[b]第四,生成和调试应用程序
  

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



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

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

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

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

  效果图如下:  





  

参考地址:http://msdn.microsoft.com/zh-cn/library/ff472340(VS.92).aspx

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: