在 Sliverlight 中使用 XNA,WPXNA(一)
平方已经开发了一些 Windows Phone 上的一些游戏,算不上什么技术大牛。在这里分享一下经验,仅为了和各位朋友交流经验。平方会逐步将自己编写的类上传到托管项目中,没有什么好名字,就叫 WPXNA 吧,最后请高手绕道而行吧,以免浪费时间。(为了突出重点和减少篇幅,有些示例代码可能不够严谨。)
XNA
好吧,现在 WP8 的游戏开发已经开始使用 DirectX/C++,如果你正在寻找新的编程方式,请关闭这个页面。
为什么使用 Sliverlight+XNA?因为有些朋友希望使用 Windows Phone 的控件,比如按钮,或者因为广告的插件不支持 XNA。
当然,在 WP7SDK 中,可以新建一个 Sliverlight+XNA 的项目,这里平方建立了一个 World 类(有些代码在默认的模板中也包含),以包含常用的代码,如下图所示:
在说明这个类之前,我们来看其他一些需要注意的问题。
修改 WMAppManifest.xml
在本示例中,WMAppManifest.xml 文件中的 NavigationPage 属性被修改为 World.xaml,这样游戏将把页面 World.xaml 作为启动页面。
修改命名空间
将 World.xaml 的命名空间修改为 zoyobar.game。这样,World.xaml 页面也就是我们的 World 类。
World 类
这个类将管理所有屏幕,比如:主菜单的屏幕,排名的屏幕等。当然,还包含其他一些全局性的功能。对于,今天这篇文章只包含了部分的代码,以后会不断添加。
循环
每一个游戏都需要一个循环,用来更新游戏相关的数据和绘制图形,所以这里我们使用 GameTimer 类。
1 private readonly GameTimer timer = new GameTimer ( ); 2 3 public World ( Color backgroundColor ) 4 : base ( ) 5 { 6 // ... 7 8 this.timer.UpdateInterval = TimeSpan.FromSeconds ( 1.0 / 30 ); 9 timer.Update += OnUpdate; 10 timer.Draw += OnDraw; 11 12 // ... 13 } 14 15 protected override void OnNavigatedTo ( NavigationEventArgs e ) 16 { 17 // ... 18 19 this.timer.Start ( ); 20 21 base.OnNavigatedTo ( e ); 22 }GameTimer 的 UpdateInterval 属性表示更新时间间隔,这里设置为 1 秒钟更新 30 次。而在 OnUpdate 和 OnDraw 方法中,我们可以编写用于更新和绘制的代码。方法 OnNavigatedTo 表示页面 World.xaml 已经载入,我们在这个方法中调用 GameTimer 的 Start 方法。
绘制
我们需要获取 GraphicsDevice,通过 GraphicsDevice 我们可以创建 SpriteBatch,使用 SpriteBatch 就可以绘制文字和图形了。
1 private SpriteBatch spiritBatch; 2 internal readonly Color BackgroundColor; 3 internal readonly ServiceProvider Services = new ServiceProvider ( Application.Current ); 4 internal readonly GraphicsDevice GraphicsDevice; 5 6 public World ( Color backgroundColor ) 7 : base ( ) 8 { 9 // ... 10 11 SharedGraphicsDeviceManager graph = SharedGraphicsDeviceManager.Current; 12 this.GraphicsDevice = graph.GraphicsDevice; 13 14 this.BackgroundColor = backgroundColor; 15 // ... 16 } 17 18 protected override void OnNavigatedTo ( NavigationEventArgs e ) 19 { 20 SharedGraphicsDeviceManager.Current.GraphicsDevice.SetSharingMode ( true ); 21 this.spiritBatch = new SpriteBatch ( this.GraphicsDevice ); 22 this.Services.AddService ( typeof ( SpriteBatch ), this.spiritBatch ); 23 24 // ... 25 26 base.OnNavigatedTo ( e ); 27 }在构造函数中,我们获取了当前的 GraphicsDevice,并保存在字段 GraphicsDevice 中。当页面载入后,我们使用 GraphicsDevice 创建了 SpriteBatch,并将 SpriteBatch 保存到服务中,这是为了让其他类方便使用(但本示例中并没有用的)。
SetSharingMode 方法是比如调用的,将设备设置为共享,否则使用 SpriteBatch 绘制图像将没有效果。
Hello
最后,我们就来绘制一个字符串。首先我们需要获取字体,关于如何获取资源,以后会提到。之后,我们使用 SpriteBatch 的 DrawString 方法来绘制字符串。
1 private SpriteFont myfont; 2 3 protected override void OnNavigatedTo ( NavigationEventArgs e ) 4 { 5 // ... 6 7 ContentManager content = new ContentManager ( this.Services, "Content" ); 8 this.myfont = content.Load<SpriteFont> ( @"font\myfont" ); 9 10 base.OnNavigatedTo ( e ); 11 } 12 13 private void OnDraw ( object sender, GameTimerEventArgs e ) 14 { 15 this.GraphicsDevice.Clear ( this.BackgroundColor ); 16 17 this.spiritBatch.Begin ( ); 18 this.spiritBatch.DrawString ( this.myfont, "Hello!", new Vector2 ( 10, 10 ), Color.White ); 19 this.spiritBatch.End ( ); 20 }在上面的代码中,ContentManager 是需要调用 Unload 方法来释放资源的。示例中还需要一个 ServiceProvider 类,这里没有展示。
本期视频 http://v.youku.com/v_show/id_XNTYwNTE3NjE2.html
项目地址 http://wp-xna.googlecode.com/
更多内容 WPXNA
平方开发的游戏 http://zoyobar.lofter.com/
QQ 群 213685539
欢迎访问我在其他出发布的同一文章:http://www.wpgame.info/post/decc4_629f28