`
tansitongba
  • 浏览: 503760 次
文章分类
社区版块
存档分类
最新评论

Silverlight 2.5D RPG游戏技巧与特效处理:(十八)开场卷轴与动态窗口

 
阅读更多

第一眼往往能起到决定性作用,这不仅是对人来说。优秀的游戏同样需要一个华丽而盛大的开场,以中国式古风古韵之柔情传承,配以卷轴展开壮丽山河之气势磅礴,云中漫步于旅仙境渐入开场,相信如此美好的初体验定能捕获无数玩家的心:华美的开端能不让人雀跃祈盼后续之旷世奇章吗?

实现开场卷轴的方案大致三类:随机移动、往复移动及无线延展。其中随机移动即宽大的背景在游戏视窗中任意移动,碰撞到边缘时再向随机方向弹回;往复移动即背景画卷以横向或纵向来回移动;而本节我要给大家展示的是无限延展的开场画卷效果。

无限延展运动的画卷给人最大的震撼就是恢弘而无穷无尽,我们需要事先准备一副可左右对合拼接且尺寸大于游戏最大可能视口的图片。作为可全屏操作的Silverlight网游来说,图片的宽度至少得大于2000px以满足目前几乎所有客户端分辨率。至于原理很简单,两张一样的画卷图片紧挨着向同一方向连续移动,当第一张超出游戏屏幕时立刻再返回到第二张的末尾继续跟随移动,由此自然而然便形成了无限延展而连贯的动态画卷背景效果:

当然,仅仅是空灵的卷轴似乎还无法体现宏大的游戏开场气势,我们还可以赋予它灿烂的阳光、飘渺的浮石、成群的飞燕等额外动画,外加整体隐约镂空的云层,然后将单独的背景卷轴搭配上这些动画最终封装成LoginBackground控件,由此开场卷轴便大功告成:

LoginBackground
///<summary>
///背景的顺序
///</summary>
publicenumBackgourndIndex{
First
=0,
Second
=1,
}

///<summary>
///登陆部分的动画背景
///</summary>
publicsealedclassLoginBackground:EntityObject{

AnimationBasesunnyAnimation
=newAnimationBase(){Loop=true,Z=2,};
AnimationBasepumiceAnimation
=newAnimationBase(){Loop=true,Z=2,};
AnimationBaseflyBirds
=newAnimationBase(){Loop=true,Z=2,};
AnimationBaseflowLightAnimation
=newAnimationBase(){Loop=true,Z=2,};

publicLoginBackground(){
Source
=GlobalMethod.GetImage("UI/ScrollPicture.jpg",UriType.Project);
}

///<summary>
///播放完一副的时间(毫秒)
///</summary>
publicstaticintInterval=20000;

Storyboardstoryboard;
BackgourndIndexindex;
///<summary>
///开始卷轴运动
///</summary>
publicvoidRun(BackgourndIndexindex,doublestart,doubleend){
this.index=index;
storyboard
=newStoryboard();
storyboard.Children.Add(GlobalMethod.CreateDoubleAnimation(
this,"(Canvas.Left)",start,end,TimeSpan.FromMilliseconds(index==BackgourndIndex.First?Interval:Interval*2),null));
storyboard.Completed
+=newEventHandler(storyboard_Completed);
storyboard.Begin();
}

voidstoryboard_Completed(objectsender,EventArgse){
Storyboardstoryboard
=senderasStoryboard;
storyboard.Completed
-=storyboard_Completed;
storyboard
=newStoryboard();
storyboard.Children.Add(GlobalMethod.CreateDoubleAnimation(
this,"(Canvas.Left)",RealWidth-6,-RealWidth,TimeSpan.FromMilliseconds(Interval*2),null));
storyboard.Completed
+=storyboard_Completed;
storyboard.Begin();
}

///<summary>
///显示内部动画
///</summary>
publicvoidDisplayAnimation(){
CreateAnimation(sunnyAnimation,
14,newPoint(680,0));
CreateAnimation(pumiceAnimation,
67,newPoint(810,25));
CreateAnimation(flyBirds,
69,newPoint(570,410));
CreateAnimation(flowLightAnimation,
68,newPoint(1760,105));
}

voidCreateAnimation(AnimationBaseanimation,intcode,Pointposition){
animation.Code
=code;
animation.Position
=position;
EventHandlerhandler
=null;
animation.Disposed
+=handler=delegate{
animation.Disposed
-=handler;
this.Children.Remove(animation);
};
this.Children.Add(animation);
animation.HeartStart();
}

publicoverridevoidDispose(objectsender,EventArgse){
sunnyAnimation.Dispose(sunnyAnimation,
null);
pumiceAnimation.Dispose(pumiceAnimation,
null);
flyBirds.Dispose(flyBirds,
null);
flowLightAnimation.Dispose(flowLightAnimation,
null);
storyboard.Stop();
base.Dispose(sender,e);
}

}

画卷展开后,接下来便是进入游戏正题。为了提高用户体验,我将所有窗体都设计为继承自WindowsBase附带透明拖动、渐显切入模式的九宫格控件,每个窗体所需UI素材部分不同(记录在Login.xml配置文件中),因此按照动态加载原则,每此弹出新的窗口前都先分析并下载该窗口所需资源,完成后再以动画形式切入,其中配以伪模态Loading环,最终的效果连贯而不失精致(以语言选择窗体LanguageChoicer为例)

LanguageChoicer
///<summary>
///游戏语言选择
///</summary>
publicsealedclassLanguageChoicer:WindowBase{

///<summary>
///提交
///</summary>
publiceventMouseButtonEventHandlerSubmit;

publicLanguageChoicer(){
this.Loaded+=(s,e)=>{
QueueParallelDownloaderqueueDownloader
=newQueueParallelDownloader();
queueDownloader.DownloadCompleted
+=newOpenReadCompletedEventHandler(queueDownloader_OpenReadCompleted);
queueDownloader.OpenReadAsync(GetResourceList(
"LanguageChoicer"),null,false,300);
};
}

voidqueueDownloader_OpenReadCompleted(objectsender,OpenReadCompletedEventArgse){
QueueParallelDownloaderqueueDownloader
=senderasQueueParallelDownloader;
queueDownloader.DownloadCompleted
-=queueDownloader_OpenReadCompleted;
Canvasbody
=newCanvas(){
Width
=254,
Height
=200,
Background
=newImageBrush(){ImageSource=GlobalMethod.GetImage("UI/105.png",UriType.Web)}
};
RadioButton[]languages
=newRadioButton[5];
languages[
0]=newRadioButton(){
Tag
="zh-cn",
Content
=newTextBlock(){
Text
="简体中文",
Style
=Application.Current.Resources["TextStyle0"]asStyle,
TextWrapping
=TextWrapping.Wrap,
Foreground
=newSolidColorBrush(Color.FromArgb(255,239,255,208)),
},
FontSize
=14,
GroupName
="Language",
IsChecked
=true,
};
languages[
1]=newRadioButton(){
Tag
="zh-tw",
Content
=newTextBlock(){
Text
="繁體中文",
Style
=Application.Current.Resources["TextStyle0"]asStyle,
TextWrapping
=TextWrapping.Wrap,
Foreground
=newSolidColorBrush(Color.FromArgb(255,239,255,208)),
},
FontSize
=14,
GroupName
="Language",
};
languages[
2]=newRadioButton(){
Tag
="us",
Content
=newTextBlock(){
Text
="English",
Style
=Application.Current.Resources["TextStyle0"]asStyle,
TextWrapping
=TextWrapping.Wrap,
Foreground
=newSolidColorBrush(Color.FromArgb(255,239,255,208)),
},
FontSize
=14,
GroupName
="Language"
};
languages[
3]=newRadioButton(){
Tag
="jp",
Content
=newTextBlock(){
Text
="日本語",
Style
=Application.Current.Resources["TextStyle0"]asStyle,
TextWrapping
=TextWrapping.Wrap,
Foreground
=newSolidColorBrush(Color.FromArgb(255,239,255,208)),
},
FontSize
=14,
GroupName
="Language"
};
languages[
4]=newRadioButton(){
Tag
="kr",
Content
=newTextBlock(){
Text
="한국의",
Style
=Application.Current.Resources["TextStyle0"]asStyle,
TextWrapping
=TextWrapping.Wrap,
Foreground
=newSolidColorBrush(Color.FromArgb(255,239,255,208)),
},
FontSize
=14,
GroupName
="Language"
};
for(inti=0;i<=languages.GetUpperBound(0);i++){
body.Children.Add(languages[i]);
Canvas.SetLeft(languages[i],
86);Canvas.SetTop(languages[i],-5+i*35);
}
ImageButtoncloser
=newImageButton(){
TotalWidth
=93,
TotalHeight
=27,
Background
=newImageBrush(){ImageSource=GlobalMethod.GetImage("UI/106.png",UriType.Web),Stretch=Stretch.None},
Text
="提交(OK)",
TextStyle
=Application.Current.Resources["TextStyle1"]asStyle,
TextSize
=14,
TextHasEffect
=true,
TextEffectColor
=Colors.Black,
TextBrush
=newSolidColorBrush(Colors.LightGray),
TextHoverBrush
=newSolidColorBrush(Colors.White),
};
body.Children.Add(closer);Canvas.SetLeft(closer,
73);Canvas.SetTop(closer,167);
closer.Click
+=(s1,e1)=>{
//LoginManager.loading.Show();
for(inti=0;i<=languages.GetUpperBound(0);i++){
if(languages[i].IsChecked.Value){
ParallelDownloaderdownloader
=newParallelDownloader();
OpenReadCompletedEventHandlerhandler
=null;
downloader.OpenReadCompleted
+=handler=(s2,e2)=>{
Infos[
"Language"]=XElement.Load(e2.ResultasStream);
if(Submit!=null){Submit(this,e1);}
//LoginManager.loading.Hide();
};
downloader.OpenReadAsync(
string.Format(GlobalMethod.WebPath("Language/{0}.xml"),languages[i].Tag.ToString()),DownloadPriority.Highest,null,false,0);
break;
}
}
};
StyleBoxstyleBox
=newStyleBox(){
HeadHeight
=60,
BodyHeight
=200,
FootHeight
=15,
NorthCenterWidth
=74,
CenterWidth
=254,
CenterEdgeWidth
=30,
SouthCenterWidth
=228,
NorthEdgeImageSource
=GlobalMethod.GetImage("UI/100.png",UriType.Web),
NorthImageSource
=GlobalMethod.GetImage("UI/101.png",UriType.Web),
CenterEdgeImageSource
=GlobalMethod.GetImage("UI/102.png",UriType.Web),
SouthEdgeImageSource
=GlobalMethod.GetImage("UI/103.png",UriType.Web),
SouthImageSource
=GlobalMethod.GetImage("UI/104.png",UriType.Web),
CenterContent
=body,
};
styleBox.HeadText.Foreground
=newSolidColorBrush(Colors.White);
styleBox.HeadText.Text
="选择语言";
styleBox.HeadText.FontSize
=14;
styleBox.HeadText.Margin
=newThickness(0,-20,0,0);
Body
=styleBox;
base.OnResourceReady(this,e);
}
}

额外需要说明一下,作为Silverlight网页游戏来说,多国语言(本地化)实现起来相当简单。游戏开端当玩家选择一种语言后,按照第十七节的方式首先将该语言包下载到本地并缓存,游戏中一切需要显示文字的地方都将从这里获取并解析。当然,特别要注意一些细节问题比如同一单词不同语言下长度不同,可能导致界面变形或超出范围,配合上一些偏移和字体尺寸参数可轻松解决。

下一节我会为大家继续讲解游戏登陆部分,其中的WCF+数据库操作将是重头大戏。相信《梦隋唐Online》这部强势作品的发布势将掀起新一轮Silverlight网游革命让世界仰望中国页游技术质的飞跃!

本系列源码请到目录中下载

在线演示地址:http://silverfuture.cn

分享到:
评论

相关推荐

    Silverlight 2.5D RPG游戏技巧与特效处理源代码与说明

    《Silverlight 2.5D RPG游戏技巧与特效处理源代码详解》 在本文中,我们将深入探讨使用Microsoft Silverlight技术构建2.5D角色扮演游戏(RPG)时的关键技巧和特效处理。Silverlight,作为一款强大的RIA(Rich ...

    Silverlight项目获取天气、PM2.5信息

    通过与服务器端的数据交互,Silverlight可以实现动态内容的加载和更新。 2. **联网获取数据** 要获取天气和PM2.5信息,项目需使用HTTP请求与服务器进行通信。这通常通过WebClient或HttpWebRequest类来实现,发送...

    Silverlight MMORPG网页游戏源码

    其实更奇妙的风景还在下面,为了演绎这场华丽的结局,全新编写的4个魔法旨在换取您的惊叹,一切源于Silverlight,因此您无须复杂的代码照样可以实现绝非简单的游戏特效。 圆月斩,附带HLSL编写的空间扭曲动画效果,...

    C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial 前38节)

    C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(二十三)自适应性窗口化与全屏化 C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(二十四)Be careful!前方怪物出没 C#开发WPF/Silverlight...

    软件工程师-Silverlight游戏开发小技巧.docx

    Silverlight 游戏开发小技巧 本文主要介绍了 Silverlight 游戏开发中的小技巧,具体来说是血条和进度条的实现方法。Silverlight 是.NET 技术中游戏开发的重要组成部分,本文将详细讲解如何使用 Silverlight 实现...

    Silverlight RPG游戏开发课程(内容教案)

    在深入学习 Silverlight RPG 游戏开发之前,首先需要理解 Silverlight 的基本概念和技术优势。Silverlight 是微软推出的一种 Web 前端应用开发工具,它主要用于构建富互联网应用程序(RIA),并且以浏览器插件的形式...

    silverlight根据窗口大小缩放控件demo

    在本文中,我们将深入探讨Silverlight技术及其在创建动态用户界面方面的应用,特别是关于控件缩放、响应窗口大小变化以及实现全屏动画的实践。首先,Silverlight是一种由Microsoft开发的富互联网应用程序(RIA)框架...

    Silverlight编程基本知识及技巧

    【Silverlight编程基本知识及技巧】 Silverlight是微软推出的一种基于.NET Framework的浏览器插件,用于创建丰富的交互式Web应用程序。它提供了丰富的图形、动画、媒体播放和数据绑定功能,使得开发者可以构建出与...

    silverlight写的一个图片特效

    《使用Silverlight实现图片特效详解》 Silverlight,作为微软推出的一种富互联网应用程序技术,曾经在Web开发领域占据一席之地。它允许开发者创建具有丰富交互性和多媒体元素的Web应用,其中图片特效就是其一大亮点...

    一款Silverlight很酷的游戏

    标题中的“一款Silverlight很酷的游戏”表明我们讨论的主题是一款基于Silverlight技术开发的互动游戏。Silverlight是微软推出的一种富互联网应用程序(RIA)平台,主要用于构建和展示具有丰富媒体体验和交互性的Web...

    Silverlight富媒体特效地图实例

    2. **Silverlight动画和效果**:Silverlight支持创建复杂的动画和特效,例如平滑的地图缩放和滚动、动态标注的出现和消失等,这些都可以提升地图的视觉吸引力。 3. **数据绑定和MVVM模式**:为了实现地图与后端数据...

    Silverlight:ASP.NET与Ajax开发实战1

    【标题】"Silverlight:ASP.NET与Ajax开发实战1"是一个深入探讨Silverlight技术如何与ASP.NET和Ajax结合,以实现高效、交互丰富的Web应用程序的教程。本资源可能包括一系列的章节、示例代码和讲解,旨在帮助开发者...

    Silverlight网络游戏飞行岛2.0源码

    《Silverlight网络游戏飞行岛2.0源码》是一款基于Microsoft Silverlight技术开发的网络游戏,它展示了Silverlight在游戏开发中的应用。Silverlight是微软推出的一种RIA(Rich Internet Application)技术,用于创建...

    一步一步学Silverlight 2系列

    Silverlight 2系列(35):升级Silverlight 2 Beta 1应用程序到Beta 2 Silverlight 2系列(34):使用Silverlight Streaming托管Silverlight应用程序 Silverlight 2系列(33):Silverlight 2应用Web Service两例 ...

    silverlight图标 弹出窗口

    本主题聚焦于Silverlight中的图标、动画以及弹出窗口(子窗口)的应用。 首先,让我们深入了解Silverlight图标。在Web应用设计中,图标是用户界面的重要组成部分,它们提供了视觉上的识别和简洁的操作指示。...

    一步一步学Silverlight_2系列

    Silverlight 2系列(35):升级Silverlight 2 Beta 1应用程序到Beta 2 Silverlight 2系列(34):使用Silverlight Streaming托管Silverlight应用程序 Silverlight 2系列(33):Silverlight 2应用Web Service两例 ...

    Silverlight空中躲避游戏源码

    【Silverlight空中躲避游戏源码】是一款基于Silverlight技术开发的互动游戏,它展示了Silverlight在构建富互联网应用(RIA)方面的强大功能。Silverlight是微软推出的一种浏览器插件,用于创建和展示丰富的多媒体和...

    silverlight做的小游戏

    silverlight做的小游戏,提供源代码!

    Silverlight星际竞技场游戏.rar

    3. **动画和特效**:Silverlight提供了强大的动画支持,可以创建动态的UI元素和游戏效果,如角色移动、技能释放等。 4. **网络通信**:游戏中的多人在线功能需要实现客户端和服务器之间的实时通信。Silverlight支持...

Global site tag (gtag.js) - Google Analytics