您的位置:首页 > 运维架构 > 网站架构

Silverlight.XNA(C#)跨平台3D游戏研发手记:(六)向Windows Phone移植之框架构建

2012-03-29 16:00 483 查看
海量的美术、庞大而繁杂的人员与资源配备使得网游和端游开发难度系数高居不下;移动开发时代的来临为游戏设计师们提供了第三条绿色通道,这是一次愈加趋近梦想的迅捷契机。

作为一个专情的人,深爱着C#,毋庸置疑的原因;于是,我也爱上了Windows Phone,爱上了C#在Silverlight.XNA中放荡的游走;因为它的存,使得代码移植在页游、端游与手游之间显得格外畅快淋漓。

今天,打开的不仅是一扇门,更是通往美丽新世界的崭新道路;握紧了,战士,你手中无比锋利的C#,鞭笞吧!XAML,神秘的游戏世界正等待您来探索。

轻轻的,我步入了这个陌生而又激动的新圣域,困惑悄然而生:该如何开启Windows Phone游戏开发这个潘多拉之盒?

Sprite,精灵,永恒不变的游戏灵魂铸就者,生命万象之密匙;从精灵的起源去探究创世之初尤能缅怀我的虔诚。

翻开上帝之书MSDN,古老的文字向人类印示着Windows Phone游戏精灵的两种主要创生方式:Silverlight的UElement(所有UI控件的基类)和XNA中的Texture2D(2D纹理)。性能方面,后者绝对专业;不过相对于效率而言,前者则更为出色。彷徨中的我恍然大悟,其实一切真想早已被远古神器Visual Studio 2010暴露得一览无余,抹去岁月的尘土,赫然印着:基于Silverlight与XNA的无缝集成打造最完美之解决方案:

音乐播放

SoundEffect sound;
Song song;

// 构造函数
public MainPage() {
InitializeComponent();
this.Loaded += new RoutedEventHandler(MainPage_Loaded);
}

void MainPage_Loaded(object sender, EventArgs e) {
content = (Application.Current as App).Content;
song = content.Load<Song>("Media/MySong");
MediaPlayer.Play(song);
}

// 简单的按钮单击事件处理程序可使我们转至第二页
private void Button_Click(object sender, RoutedEventArgs e) {
sound = content.Load<SoundEffect>("Audio/MyAudio");
sound.Play();
NavigationService.Navigate(new Uri("/GamePage.xaml", UriKind.Relative));
}



到此有朋友要问了:仅仅是调用了XNA中的字体和音乐,与纯XNA又有何区别?Silverlight控件呈现问题甚至还不需要字体呢,干嘛非得多次一举给XNA加个Silverlight壳?

别急,接下来便是Silverlight与XNA交互实现的关键:UIElementRenderer

就像本文开头所述那样,完美的交互必须是Silverlight的UElement和XNA的Texture2D之间的非跨线程交互操作,大家不妨先看看最终的实现代码:

UIElementRenderer elementRenderer;
public GamePage() {
InitializeComponent();
this.SupportedOrientations = SupportedPageOrientation.Landscape;
this.LayoutUpdated += GamePage_LayoutUpdated;
....
}

/// <summary>
/// 允许页面绘制自身。
/// </summary>
private void Draw(object sender, GameTimerEventArgs e) {
graphicsDevice.Clear(Color.CornflowerBlue);
elementRenderer.Render(); //通过elementRenderer呈现Silverlight中的UElement
spriteBatch.Begin();
spriteBatch.Draw(elementRenderer.Texture, Vector2.Zero, Color.White); //通过XNA的形式将elementRenderer整体绘制出来
spriteBatch.End();
}

/// <summary>
/// 创建一个可以被XNA绘制的Silverlight-UI展示器UIElementRenderer
/// </summary>
void GamePage_LayoutUpdated(object sender, EventArgs e) {
if (ActualWidth > 0 && ActualHeight > 0 && elementRenderer == null) {
elementRenderer = new UIElementRenderer(this, (int)ActualWidth, (int)ActualHeight);
}
}
其实,UIElementRenderer的原理便是将Silverlight中的UElement对象以XNA的绘制形式在Draw()方法中画出来,真想大白:不论是Silverlight的东西还是XNA的东西,所有能看得到的对象最终都将以XNA的形式绘制出来,这也是成就SL.XNA模式得以完美兼具“效率”与“性能”的根本原因。

接下来我们也来俗一把,分别用Silverlight的TextBlock和XNA的Font编写Hello Game:

protected override void OnNavigatedTo(NavigationEventArgs e) {
// 设置图形设备的共享模式以启用 XNA 呈现
graphicsDevice.SetSharingMode(true);
// 创建可以用来绘制纹理的新 SpriteBatch。
spriteBatch = new SpriteBatch(graphicsDevice);
// TODO: 使用 this.content 在此处加载游戏内容
textBlock = new TextBlock() { Text = "Hello Game, I,m Silverlight TextBlock" };
LayoutRoot.Children.Add(textBlock); //将textBlock添加进Canvas画布中
Canvas.SetLeft(textBlock, 10); Canvas.SetTop(textBlock, 20); //设置textBlock在画布中的绝对位置
font = content.Load<SpriteFont>("Font/MyFont");

timer.Start();
base.OnNavigatedTo(e);
}

/// <summary>
/// 允许页面绘制自身。
/// </summary>
private void Draw(object sender, GameTimerEventArgs e) {
graphicsDevice.Clear(Color.CornflowerBlue);
elementRenderer.Render(); //通过elementRenderer呈现Silverlight中的UElement
spriteBatch.Begin();
spriteBatch.Draw(elementRenderer.Texture, Vector2.Zero, Color.White); //通过XNA的形式将elementRenderer整体绘制出来
spriteBatch.DrawString(font, "Hello Game, I,m XNA Font", new Vector2(20, 55), Color.Yellow); //第三个参数代表绘制的绝对位置
spriteBatch.End();
}





默认情况下,后Draw的对象显示在最顶层;当然,如果你想动态更改他们之间的层级深度关系,可以使用Draw方法的其他形态,比如:





值得一提的是,如上面代码所示UIElementRenderer对象创建于GamePage_LayoutUpdated事件中,它的第一个UIElement类型参数为this,即指整个GamePage页面(UserControl):



试想一下,如果换成是一个Image或者ListBox等控件呢?高度自由的UIElementRenderer给了我们SL.XNA游戏开发无限遐想空间,不是吗?

至此,资源布局及代码结构这些毛坯级也是最核心的框架构建完毕,无论您是单纯的Silverlight开发者,或者XNA游戏开发者,亦或者两者通杀型,这个框架都能为你提供可无限拓展的高性能空间。下一节,我将继续为大家深入讲解SL.XNA中的控件交互,关注哦,^ ^。

本节源码下载地址:SLXnaGame1.zip

手记小结:本节非常详细的为大家讲解了如何从0开始一步步搭建基于Silverlight.XNA游戏框架;新手、老手,又或者你擅长的是Silverlight、WPF或XNA;对于初出茅庐的Windows Phone开发者来说这都是一篇开卷有益的启蒙之章,包括后续的更多章节,旨在通过自身的开发经历让朋友们高效率的掌握Windows Phone开发中关于C#、xaml、Silverlight、XNA等多方面知识。毕竟,一个人的能力与时间极其有限,卓越而经典的游戏需要更多的开发者参与进来,相信我们的共同努力可以铸成属于中国人辉煌的游戏江山!

推荐参考:NowpaperWilliams关于Windows Phone的游戏开发博客。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐