快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

澳门银河官网注册平台首页:Silverlight 2.5D RPG游戏技巧与特效处理:(十六)动态资源



即开即玩是网页游戏比拟传统客户端游戏的最大年夜上风。假如说在每台电脑安装上G的客户端是一种资本挥霍及光阴污染;那么Silverlight作为RIA界的新宠儿,在承袭祖辈优秀血统的条件下拥有加倍卓越的机能及更为曼妙的动态体现,势将引领收集将下天下进入那令人神往的低碳空间。

笔者进修Silverlight开拓近2年,在写第一部Silverlight游戏系列教程时为了尽快的实现目标而将所有素材资本打包进XAP中。与其他Silverlight初学者一样,这或许是我们所必须会经历的一个历程。QXGameEngine终极完成时,它的体积已经达到了18M有余,功能需求满意了预期,可是却让大年夜量还未打仗过Silverlight的同伙孕育发生伟大年夜利诱:难道Silverlight仅仅是镶嵌于网页中的游戏客户端?

QXGameEngine作为教程示例再贴切不过;但假如说要将之商业化,首先就违抗了RIA的初衷:即开即用。漫恒久待是对用户体验的无情扼杀,不仅随时可能造成用户流掉,绝不虚心的尊称其为掉败品亦不为过。

针对Silverlight资本设置设置设备摆设摆设问题,国外很多同伙首先想到且用得最多的莫过于自力存储(Isolated Storage)。比如Dark Ieign -- 近来在网站上看到的Silverlight2D即时计谋大年夜作。虽然其等待资本下载历程中我们可以经由过程欣赏游戏鼓吹动画短片叮咛光阴,但本色却与QXGameEngine千篇一律,将所有的资本必须性的一次性下载完,不管会不会用到,这样的形式仍然十分糟糕。是的,Silverlight才刚起步,终究Dark Ieign让我们看到的是一款大年夜气势派头仪。历史中新闹事物的起源都一定会经历一个适应期,不久的将来一旦Silverlight完美动态技巧遍及开后,堪比星际争霸2之类大年夜作终有一天会呈现在Silverlight平台上,拭目以待!

8个多月以前,第一部游戏教程整个完成了。其后QXSceneEditor在笔者思虑若何实现Silverlight游戏快速开拓的同时孕育而生。其搭建于一个兼具静态资本及动态资本混杂应用的游戏框架下,XAP包寄放的不再是统统资本,而仅仅是一些常用的小图片、图标及场景、精灵等设置设置设备摆设摆设文件;相对付前作,该场景编辑器动态参数及动态设置设置设备摆设摆设的机动布局可以轻松拓展出随意率性类型的各式游戏,而不仅仅再局限于RPG。

又是3个月,第二部教程伴跟着3个全新Demo的完成落下帷幕。此时再次重温QXSce澳门银河官网注册平台首页neEditor,仔细琢磨又一次认为其布局仍不完美:一开始就加载所有场景及所有精灵的xml设置设置设备摆设摆设信息,假想一下假如有100个场景,而玩家或许从注册到对游戏掉去兴趣也走不到10个场景,那剩下的90个场景的设置设置设备摆设摆设文件容量不是白下载了?林林各种……。随后的第三部课程虽然有了布局性的进步,然后更多的与第一部类似,着重在于根基进修。而后,在中游在线的《WOWO天下》的感悟下触使我抉择再次去寻找Silverlight-WebGame的极至框架,抱负中它应该贯穿戴“统统动态&rdq澳门银河官网注册平台首页uo;,“按需加载”的搭建理念,秉持“体验至上”,“优良机能”的整体特点,于是出生了想要从头来过的全新思路。

这是一次真正的从零开始,技巧的改革让我决心从游戏的开始制作到游戏的终局,不在乎这个终局是喜是悲;于是有了这个全新的第四部作品,它们将倾注更多关于自己融会的Silverlight-Web游戏设计思惟。同以往一样,假犹如伙们感觉有纰谬之处,恳请善意斧正。这三个系列的出生与成长否则则我一小我的努力,没有大年夜家的支持、建讲和品评,也不会坚持到本日。

以上抒怀。

接下来将进入本节的主要内容:Silverlight WebGame中的动态资本设置设置设备摆设摆设。

从Javascript的var到F#的lambda,C#在取之英华,去其糟粕的同时让自身成长得更为完美,趋势中漫溢着“动态”给我们编程带来的无限芳喷鼻。“动态”,不论在任何场合都是一种优秀体现;与“动态”相呼应的是“自适应”,从结构的“自适应宽高”到游戏资本的“自适应按需下载”,这些均可以从当下诸多优秀的软件架构中获得充分表现。

在Silverlight进修之初大年夜家已意识到动态下载的紧张性,从最初的探究dll动态下载、xaml动态加载、xap动态获取到数据传输的序列化与反序列化以及资本的压缩与解压。直到本日,笔者在反复考试测验下终于完成了小我感到今朝效果还算较好的资本布局结构模式:自力于工具的设置设置设备摆设摆设结构体系。

何谓自力于工具的设置设置设备摆设摆设结构体系?我们不妨先看张图:

以游戏中的动画为例,素材结构以数字代号顺次标识,与传统不合的关键在于我为每个动画资本都配备了一个描述该动画信息的Info.xml设置设置设备摆设摆设文澳门银河官网注册平台首页件,以上图0号动画为例,该动画的Info.xml信息如下:

xml version="1.0" encoding="utf-8" ?>

Animation Width="400" Height="400" FrameNum="7" Interval="140" Format="1" Images="Animation/0,0-6,png"/>

当游戏中某个场合必要演示该动画时,我们会首先下载该动画对应的Info.xml并进行解析,再将所有参数付与自定义的如AnimationButton控件,从而实现动态出现。

接下去的问题是我们若何下载该Info.xml设置设置设备摆设摆设文件,以及解析完成后若何实现行列步队下载所需的N张图片?别的,对付已经下载好的图象文件及xml设置设置设备摆设摆设文件我们该若何差别对待?

大年夜家是否还记得在Silverlight游戏设计(Game Design)这部教程中,我为每个Demo都附加有一个后缀为. Tools的项目,该项目中除了A*寻路的措施类库外还包孕一个资本下载用类Downloader。然而此下载器仅仅实现的是单个图象文件下载,为了满意随意率性文件下载需求,且与接下来的行列步队下载类所兼容,我这里的将之进行了如下改动:

public sealed class DownloaderEventArgs : EventArgs {

public string uri { get; set; }

public Stream stream { get; set; }

}

public delegate void DownLoaderEventHandler(object sender, DownloaderEventArgs e);

public sealed class Downloader {

///

/// 已下载的文件路径字典

///

static Dictionarystring, bool> files = new Dictionarystring, bool>();

///

/// 资本正在读取中

///

public event DownLoaderEventHandler Loading;

///

/// 资本下载完成时触发

///

public event DownLoaderEventHandler Completed;

DispatcherTimer timer;

///

/// 经由过程WebClient下载资本

///

public void GetResource(string uri) {

//要是该路径图片还未下载过

if (!files.ContainsKey(uri)) {

WebClient webClient = new WebClient();

webClient.OpenReadCompleted += (s, e) => {

//该路径图片已下载完成

files[uri] = true;

if (Completed != null) { Completed(this, new DownloaderEventArgs() { uri = uri, stream = e.Result }); }

};

webClient.OpenReadAsync(new Uri(uri, UriKind.Relative), uri);

files.Add(uri, false);

if (Loading != null) { Loading(this, new DownloaderEventArgs() { uri = uri, stream = null }); }

} else {

//要是该路径图片已下载完成

if (files[uri]) {

if (Completed != null) { Completed(this, new DownloaderEventArgs() { uri = uri, stream = null }); }

} else {

if (timer == null) {

//要是该路径图片正鄙人载,则必要等待,每隔1秒检测一次是否已下载完成

timer = new DispatcherTimer() { Interval = TimeSpan.FromSeconds(1) };

timer.Tick += (s, e) => {

if (files[uri]) {

if (Completed != null) { Completed(this, new DownloaderEventArgs() { uri = uri, stream = null }); }

DispatcherTimer t = s as DispatcherTimer;

t.Stop();

t = null;

}

};

timer.Start();

}

if (Loading != null) { Loading(this, new DownloaderEventArgs() { uri = uri, stream = null }); }

}

}

}

}

此时该类不仅能下载图象文件,同时还能将数澳门银河官网注册平台首页据流中的Stream作为参数附给Completed事故;后面的工作就简单多了,在Completed事故中可以直接经由过程XElement xelement = XElement.Load(e.stream)对该xml文件进行加载,后续的步骤就不用再多说了吧。

剩下的便是解析完xml设置设置设备摆设摆设后该若何行列步队下载所需的统统图象资本。很多同伙一听到行列步队、按需就发窘,着实我们只要对上面从新编写的Downloader再进一步逻辑封装就OK澳门银河官网注册平台首页了,这个神奇的DownloadManager类着实也不过如斯嘛:

public sealed class DownloadManager {

public event EventHandler Completed;

int uriNum, count;

Liststring> uris;

///

/// 根据资本表下载资本

///

///

资本地址表

public void GetResource(Liststring> uris) {

if (uris.Count == 0) {

if (Completed != null) { Completed(this, new EventArgs()); }

} else {

this.uris = uris;

uriNum = uris.Count;

DownloadResource(0);

}

}

private void DownloadResource(int index) {

Downloader downloader = new Downloader();

downloader.Completed += new DownLoaderEventHandler(downloader_Completed);

downloader.GetResource(uris[index]);

}

private void downloader_Completed(object s, DownloaderEventArgs e) {

count++;

if (count

DownloadResource(count);

} else {

if (Completed != null) { Completed(this, new EventArgs()); }

}

}

}

再回到开首,以自定义出现动画控件AnimationButton为例,在控件初始化后我们首先下载对应代号的动画xml设置设置设备摆设摆设文件:

Downloader downloader = new Downloader();

downloader.GetResource(Global.WebPath(string.Format("Animation/{0}/Info.xml", code)));

然后注册Completed事故,一旦完成后对设置设置设备摆设摆设文件进行解析并取值,比如:

downloader.Completed += (s1, e1) => {

string key = string.Format("Animation{0}", code);

if (e1.stream != null) {

Global.PackInfo.Add(key, XElement.Load(e1.stream));

}

XElement config = Global.PackInfo[key].DescendantsAndSelf("Animation").Single();

this.format = Global.FileFormat((Format)((int)config.Attribute("Format")));

this.frameNum = (int)config.Attribute("FrameNum");

this.Width = (double)config.Attribute("Width");

this.Height = (double)config.Attribute("Height");

……

Waiting waiting = new Waiting(this.Width, this.Height) { Z = 999999 };

//下载动画资本

DownloadManager downloadManager = new DownloadManager();

downloadManager.Completed += (s2, e2) => { Heart.Start(); this.Children.Remove(waiting); };

downloadManager.GetResource(Global.GetImageList(config.Attribute("Images").Value));

};

该事故中着末3行即实现了经由过程DownloadManager来获取设置设置设备摆设摆设文件中”Images”节点的属性值(Attribute("Images").Value)后解析并行列步队下载所需图片,此历程中我们可以先展示一个Waiting动画作为代替,当行列步队下载完成后(downloadManager.Completed)我们再对实际动画进行播放出现:

Heart.Tick += (s, e) => {

if (currentFrame == frameNum) {

switch (kind) {

case AnimationKinds.Once:

currentFrame = 0;

Heart.Stop();

break;

case AnimationKinds.OnceToDispose:

Heart.Stop();

(this.Parent as Canvas).Children.Remove(this);

break;

case AnimationKinds.Loop:

currentFrame = 0;

break;

}

}

this.Background = new ImageBrush() { ImageSource = Global.GetWebImage(string.Format(@"Animation/{0}/{1}{2}", code, currentFrame, format)) };

currentFrame++;

};

着末一个问题是我们应该若何处置惩罚下载获得的资本才最合理呢?一方面只管即便少的占用额外的内存资本;另一方面鄙人次再哀求获取时不用重复履行下载而挥霍带宽流量。

针对此问题我的办理思路是:经由过程静态字典(Dictionarystring, XElement>)缓存xml设置设置设备摆设摆设文件,经由过程延迟加载(BitmapCreateOptions.DelayCreation)与浏览器共用图象缓存,音乐文件则经由过程MediaElement直接加载,此历程会对加载的视频或音频流进行不时播放,用户体验很好而无须我们任何代码滋扰。

到此,从资本设置设置设备摆设摆设结构到所有资本按需行列步队下载并实现缓存,自力于工具的设置设置设备摆设摆设结构体系就构建完成了。本文仅以实现自定义动画为例,实际游戏开拓中无论精灵、邪术照样场景等均完全可以照般此结构体系。我们的终纵目标是让Silverlight的XAP包中不寄放除代码外任何的额外资本,而将所有必要的部件结构于Web中,真正实现对统统工具的动态按需下载:

看过本文后,是否还会有同伙再扣问若何对xap进行分包?若何对xap进行压缩?若何动态下载xaml?没有需要了吧。本文构建的游戏架构体系实现了代码与素材的完全分离,它将使得就算是一款Silverlight网游巨作其XAP也难超500K,客户端更新后用户就算从新下载也仅仅是数秒内的事,这才是Silverlight开拓Web网游的强势所在 – “动态资本”。

在未来商家必争的手机游戏(手机网游)开拓领域,动态资本设置设置设备摆设摆设或许将成为刻不容缓必要面对的技巧问题,根据场景按需加载资本不仅节约带宽流量且能更快速的进入游戏表现着优越的用户体验。盼望本文的办理规划能为大年夜家指引一个精确的偏向,识时务者为俊杰,让我们联袂努力吧,Silverlight网游的蓝天在等待着您去创始!

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: