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

Silverlight 2.5D RPG游戏技巧与特效处理:(二十一)自定义路径动画

 
阅读更多

一直在想应该用什么作为《Silverlight 2.5D RPG游戏技巧与特效处理系列教程》的终结,既要实用而不拖泥带水;又要通用而不哗众取宠。于是一不小心便成就了我一个未了心愿:一切基于动态绘制路径而生成的万象动画作为这又一部作品的谢幕,足矣。

还记得我们小时候玩的《坦克大战》、《雷电》吗?在那狭小的弹粒缝隙间躲闪追逐成为了每每课后最快乐的回忆:

还记得高三那年的春天吗?每次丢下书包第一时间总会跑进网吧与同学们联网《星级争霸》、《帝国时代》;4V4、罗马战车VS投石车,炮火与弓箭的洗礼下,我们幸福的青春就这样被无限的释放:

大学里,《博德之门》、《奇迹》、《半条命》、《破碎银河系》等N多顶级游戏/网游让我短暂的忘却了时代赋予大学生的苦闷,人生除了现实,其实成为一名虚拟的王者未必不是今生一件幸事。“魔法飞弹”横空掠过、“蓝翎弩”三重穿梭、“”华丽的抛物线、“跟踪弹”锲而不舍的精神如同网吧中弥漫着无上团结的凝聚力,走过了4年,也走过了最让我留念和感动的“兄弟年代”:

直至今日,当我们坐在凳子上开始编写属于自己的游戏时,当年战斗的画面早已模糊不清,残留的仅剩无数的弹粒在天空中你来我往,毫无眷恋。一直在想是否能够通过一块画板外加几个选项来完成所有一切的自定义路径动画,从而让游戏设计中那些如此神秘而又变幻莫测的“弹道轨迹”变得简单而轻松?

之前便有很多人公开了他们的相关成果,关于Silverlight中的路径动画(Path Animation)实现,比如下面两个链接:

http://www.codeproject.com/KB/silverlight/PathAnimation.aspx

http://geekswithblogs.net/cskardon/archive/2010/09/21/path-animation-in-silverlight.aspx

很可惜它们均为外国人所作,第一篇重新封装了一个名为PathAnimation的类,基于Blend绘制Path坐标数据实现路径动画;而后者则完全是通过Blend绘制的路径动画。虽然均能达到效果,但易用性及拓展性显然不够强。想想,怎样的自定义路径动画才能最大化适应当下绝大多数(各类型)游戏的需要?尤其在RPG游戏中,能为之增添无限乐趣和优秀的玩家视觉体验。

思路再一次回到那块画板上,通过鼠标在画板上移动,然后将鼠标所经过的轨迹以一定的密度绘制在其上并按顺序保存到List<Point>中,最后通过Storyboard的关键帧动画将所有的Point连成一个完整的路径动画。其中通过简单的顺时针/逆时针判断公式及匀加/减速度计算公式(任何公式都可以随意拓展)来分别实现动画延路径移动时的动态朝向及变速运动效果;当然,再配合上坐标缩放系数,从而最终整个自定义路径动画所实现的效果可完美无缝的移植到任何有相关需求的Silverlight游戏中:

弹粒的关键帧动画
Bulletbullet=newBullet(newBulletDatas(){Code=pathAnimationPainter[n].AnimationCode,Loop=true,Type=BulletTypes.Animation}){Z=100};
bullet.Center
=bullet.Offset;
tabCanvas2.Children.Add(bullet);
Storyboardstoryboard
=newStoryboard();
PointAnimationUsingKeyFramespointAnimationUsingKeyFrames
=newPointAnimationUsingKeyFrames();
Storyboard.SetTarget(pointAnimationUsingKeyFrames,bullet);
Storyboard.SetTargetProperty(pointAnimationUsingKeyFrames,
newPropertyPath("Position"));
DoubleAnimationUsingKeyFramesdoubleAnimationUsingKeyFrames
=newDoubleAnimationUsingKeyFrames();
Storyboard.SetTarget(doubleAnimationUsingKeyFrames,bullet);
Storyboard.SetTargetProperty(doubleAnimationUsingKeyFrames,
newPropertyPath("Angle"));
doublespeed=pathAnimationPainter[n].Rate;
doublea=0.002;//加速系数
doubletimeSpanTemp=0;
doubledurationTemp=0;
doubleangleTemp=0;
intcircle=0;
if(pathAnimationPainter[n].Easing==2){//加速逆行即减速
for(inti=0;i<pathAnimationPainter[n].Path.Count;i++)
{speed
+=a*i;}
}
for(inti=0;i<pathAnimationPainter[n].Path.Count;i++){
TimeSpantimeSpan
=newTimeSpan();
PointlastPath
=(i==0?pathAnimationPainter[n].Path[0]:pathAnimationPainter[n].Path[i-1]);
PointnowPath
=pathAnimationPainter[n].Path[i];
PointnextPath
=(i==pathAnimationPainter[n].Path.Count-1?pathAnimationPainter[n].Path[pathAnimationPainter[n].Path.Count-1]:pathAnimationPainter[n].Path[i+1]);
switch(pathAnimationPainter[n].Easing){
case0:
timeSpanTemp
=GlobalMethod.GetDistance(lastPath,nowPath)/speed;
durationTemp
+=timeSpanTemp;
timeSpan
=TimeSpan.FromMilliseconds(durationTemp);
break;
case1:
speed
+=a*i;
timeSpanTemp
=GlobalMethod.GetDistance(lastPath,nowPath)/speed;
durationTemp
+=timeSpanTemp;
timeSpan
=TimeSpan.FromMilliseconds(durationTemp);
break;
case2:
speed
-=a*(pathAnimationPainter[n].Path.Count-1-i);
timeSpanTemp
=GlobalMethod.GetDistance(lastPath,nowPath)/speed;
durationTemp
+=timeSpanTemp;
timeSpan
=TimeSpan.FromMilliseconds(durationTemp);
break;
}
pointAnimationUsingKeyFrames.KeyFrames.Add(
newLinearPointKeyFrame(){
KeyTime
=KeyTime.FromTimeSpan(timeSpan),
Value
=newPoint(){X=nowPath.X*pathAnimationPainter[n].Proportion,Y=nowPath.Y*pathAnimationPainter[n].Proportion}
}
);
doubleangle=GlobalMethod.GetAngle(nowPath.Y-lastPath.Y,nowPath.X-lastPath.X)+360*circle;
//check大于0为顺时针个方向
doublecheck=(nowPath.X-lastPath.X)*(nextPath.Y-nowPath.Y)-(nowPath.Y-lastPath.Y)*(nextPath.X-nowPath.X);
if(check>0){
if(angleTemp>360*circle&&angle<360*circle){angle+=360;}elseif(angleTemp>360*circle+180&&angle<angleTemp){angle+=360;circle++;}
}
else{
if(angleTemp<360*circle&&angle>360*circle){angle-=360;}elseif(angleTemp<360*circle-180&&angle>angleTemp){angle-=360;circle--;}
}
angleTemp
=angle;//用于旋转时的角度衔接
doubleAnimationUsingKeyFrames.KeyFrames.Add(
newLinearDoubleKeyFrame(){
KeyTime
=KeyTime.FromTimeSpan(timeSpan),
Value
=angle
}
);
}
pointAnimationUsingKeyFrames.Duration
=newDuration(TimeSpan.FromMilliseconds(durationTemp));
storyboard.Children.Add(pointAnimationUsingKeyFrames);
if(pathAnimationPainter[n].Direction==0){storyboard.Children.Add(doubleAnimationUsingKeyFrames);}
EventHandlerhandler
=null;
storyboard.Completed
+=handler=delegate{
storyboard.Completed
-=handler;
tabCanvas2.Children.Remove(bullet);
bullet.Move_Completed(bullet,
null);
};
storyboard.Begin();

还在羡慕《倩女幽魂Online》交织穿梭的吸血法术吗?

还在嫉妒《星辰变》中的移动粒子施法吗?还在恨2D/2.5D无法实现类似3D游戏中那些高随意性的路径动画吗?

有了本节的自定义路径动画攻略,大家只需一个描述路径的List<Point>,配合上几个参数而已,一切效果随手创造:

看到这你是否开始心动了?没错,尤其是在角色位置相对固定的回合制、SLG等类型游戏中,在发动者与它的目标之间创造出你认为最华丽的路径,无论魔法的走位还是角色的各类移动等效果都将变得轻而易举,这就是Silverlight给我们游戏开发者所带来的奇迹~

Silverlight 时代即将来临,您准备好了吗?

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

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

分享到:
评论

相关推荐

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

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

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

    C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(三十六) 地图自定义切片与导出 C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(三十七) 地图自适应区域加载 C#开发WPF/Silverlight动画...

    简单的Silverlight 自定义控件源码

    在本文中,我们将深入探讨如何创建一个简单的...总的来说,通过对"MediaButton_src"源码的学习,我们可以掌握Silverlight自定义控件的开发技巧,提升我们的Silverlight编程能力,从而在构建富媒体应用时更加得心应手。

    silverlight自定义窗体样式

    在Silverlight应用开发中,创建和自定义窗体样式是提升用户体验的重要手段。"silverlight自定义窗体样式"这个主题主要涵盖了如何在Silverlight环境中为Window对象设计独特的外观和行为。下面,我们将深入探讨这一...

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

    【Silverlight项目获取天气、PM2.5信息】 在信息技术领域,Silverlight是一种由微软开发的富互联网应用程序(RIA)平台,它允许开发者创建交互性强、具有多媒体元素的Web应用程序。本项目专注于利用Silverlight技术...

    silverlight自定义日历插件

    本文将详细介绍如何开发一个自定义的日历插件,以Silverlight为技术基础,允许用户根据需求自由调整其样式。 一、Silverlight基础 首先,我们需要对Silverlight有一定的了解。它支持XAML(Extensible Application ...

    为Silverlight创建自定义控件

    在本文中,我们将深入探讨如何在Silverlight 2中创建自定义控件,这是一个关键的开发技能,可以让你根据特定需求扩展和定制UI组件。Silverlight的控件模型提供了丰富的可扩展性,允许开发者构建高度专业化和交互性的...

    在Silverlight自定义验证效果(带动画)

    本文将深入探讨如何在Silverlight中实现自定义验证效果,同时加入动画元素,提升用户体验。 首先,了解Silverlight中的验证机制。Silverlight使用ValidationRules类来定义验证规则,这些规则可以应用于UI元素的数据...

    silverlight 显示gif动画控件,附例子

    在本文中,我们将深入探讨如何在Silverlight中显示GIF动画,这是一项在Web应用程序中实现动态内容的关键技术。Silverlight是一种由微软开发的富互联网应用程序(RIA)平台,它允许开发者创建交互式、多媒体丰富的...

    Silverlight编程基本知识及技巧

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

    silverlight写的一个图片特效

    总的来说,通过Silverlight编写图片特效需要掌握XAML布局、XML数据绑定、自定义控件开发、动画设计以及事件处理等多个技能。虽然现在Silverlight已逐渐被HTML5和WebAssembly等技术取代,但了解其工作原理和应用方法...

    Silverlight MMORPG网页游戏源码

    为了轻松的处理多对象间的Z轴层次顺序,可借助切分/分离某些图片/动画部件以达到更加逼真的2.5D游戏场景 碧月斩,直线穿梭类型技能,伤害范围为一个多边形,游戏中的激光等魔法同样可以类似处理,另外与圆月斩类似...

    WPF/Silverlight动画及游戏系列教程(WPF21-26

    可能还会涉及如何整合WPF或Silverlight的动画功能来创建游戏特效。 6. **资源和样式**:掌握如何使用资源字典来重用动画和视觉元素,以及如何通过样式来统一应用程序的外观和感觉。 7. **媒体集成**:学习如何在...

    C#开发WPF+Silverlight动画及游戏系列教程

    在本系列教程中,我们将深入探讨使用C#语言开发Windows Presentation Foundation (WPF)和Silverlight应用程序中的动画和游戏技术。这两个平台都是微软为构建富客户端应用提供的框架,尤其是对于桌面和网页应用的设计...

    Silverlight简单动画.

    **Silverlight简单动画** Silverlight是微软开发的一个强大的RIA(Rich Internet Application)平台,它用于创建和展示在Web上运行的交互式用户界面。在Silverlight中,动画是吸引用户注意力、提供动态用户体验的...

    使用Silverlight实现特效

    总的来说,实现Silverlight的翻书特效需要对Silverlight的UI设计、动画、3D支持和事件处理有深入的理解。通过结合C#编程技巧和ASP.NET的集成,你可以创建出一个生动、真实的在线阅读体验。不断学习和实践这些技术,...

    SilverLight 自定义右键菜单 ContextMenu

    在本文中,我们将深入探讨如何在Silverlight应用中自定义右键菜单,即ContextMenu。Silverlight是一种由微软开发的富互联网应用程序(RIA)框架,它提供了丰富的用户界面和交互功能。在默认情况下,Silverlight ...

    silverlight书页翻动特效

    1. **UI元素动画**:Silverlight提供了强大的动画系统,可以对UI元素的各个属性如位置、大小、透明度等进行平滑的动画处理。书页翻动特效通常会用到旋转、缩放和透明度变化等动画来模拟纸张的翻转动作。 2. **3D...

    #开发WPF-Silverlight动画及游戏

    在开发WPF(Windows Presentation Foundation)和Silverlight应用程序时,动画和游戏的创建是一个关键的领域,这使得用户界面更具吸引力和交互性。WPF和Silverlight都是Microsoft .NET Framework的一部分,提供了...

Global site tag (gtag.js) - Google Analytics