设为首页 收藏本站
查看: 914|回复: 0

利用 XNA 实现 Windows Phone 7 上的电流效果

[复制链接]

尚未签到

发表于 2015-5-8 14:53:18 | 显示全部楼层 |阅读模式
注:本人在博客园编写博文的同时,也挑选一些译为英文发表于英文网站上,常用网名elecpiano或本人英文名Jason Lee。以下网址所发表的文章,均由本人自行撰写并发布,欢迎请各位朋友阅读。
http://xnaelectriceffect.codeplex.com/
http://www.windowsphonegeek.com/articles/Electric-Effect-on-Windows-Phone-7-using-XNA
http://www.symbio.com/techblog/?p=461

  
  最近在做一款消除类游戏,需要实现强电流横穿屏幕的效果。首先我想到了用粒子系统(Particle System)来实现,但尝试过无数次的参数调整之后,发现粒子系统并不适合做电流、闪电等效果。
  
  剖析原因:
无论是复杂还是简单的粒子系统,核心思路都是通过不断地释放(Emit)离散的、辐射状蔓延的小亮点,来营造诸如火焰、烟雾、爆炸等效果。电流和闪电效果与前者最大的区别在于:前者的粒子移动轨迹是辐射状的,而后者的分布和移动却是线性的(所谓线性,后文具体阐述)。
如果要直观地感受一下电流的运动轨迹,可以在网上搜一搜“等离子求”或“Plasma Ball”等关键字,甚至可以下载相关的手机应用来体验一下。
  下图是本人在Windows Phone 7上利用XNA实现的电流效果:
DSC0000.jpg
  欢迎下载示例代码
  
  设计思路:
我认为电流的运动模型可以抽象为:
每一股电流,都是由一系列小亮点组成。而在任意时刻,这些小亮点都沿着某一特定曲线分布。在该曲线中选择若干个特征点,然后通过不断移动这些特征点的位置,就能模拟一股电流的蠕动效果。
  请看下面的图示:
DSC0001.jpg
  上图中,蓝色直线连接着一股电流的起点和终点。5个红色小点,就是我们选取的特征点。
  试着想象一下,在某一时刻,这5个点分别位于各自活动范围内的任意位置。那么,其效果就会是如下图所示:
DSC0002.jpg
  上图中,红色的连线代表着实际的小亮点分布曲线。当然,利用直线来连接两个特征点是最简单的做法,却显得有些不够逼真。我们可以采用不同的曲线计算方法来对此进行改善。下图就是利用Catmull Rom算法来改善后的效果:
DSC0003.jpg
  注:Catmull Rom方法是XNA的Vector2 类中自带的方法。有关Catmull Rom算法的详细介绍,请参考网上的相关文章。
  
  进一步改善:
  实际上,上述这些特征点并漫无边际地运动,而是应该在某一特定范围内移动。请看下图:
DSC0004.jpg
  蓝色半透明圆形区域,是每个特征点所对应的移动范围。每个小亮点都从原点出发,沿着某一随机的方向,按照某一随机速度,努力向外游动,当达到半径所示范围边界时,就会回到原点,再次沿着另一个方向移动。这样一来就能够营造出更加逼真的电流效果(请参考网上的一些Plasma Ball的动画,电流在弯曲到一定程度后,就会重新开始蠕动)。
  
  闪烁效果:
电流的蠕动已经实现了,但还不够。再次仔细观察Plasma Ball的效果,你会发现电流在蠕动过程中,还有闪烁的效果。闪烁的效果可以不断修改每个小亮点的透明度来实现。
但是!人类的眼睛实在是太过尖锐了,任何机械的变化都会令我们感到很做作。因此,还需要不断随机变更小亮点本身的材质。材质的变更要遵循“大同小异”的原则,在颜色和尺寸上稍作修改即可,否则就会产生“乱七八糟”的感觉,过犹不及嘛。
  
  意外收获:
由于每个特征点都是各自独立地移动,因此必然会在某一时刻,一部分特征点彼此靠近一些,而另一部分特征点则相互远离一些。这种不均匀的分布,使得电流上的明暗分布产生了变化:小亮点愈集中的地方,视觉效果就越明亮。更有趣的是,在电流不断蠕动过程中,这些明暗的变化也在“肆意”移动,进一步满足了喜欢追求新鲜感的眼球。
  
  代码结构简介:
示例代码中,JasonElectricEffect项目是一个可重用的Windows Phone 7 Library。其中:
1. ElectricEffect是代表一个电流效果的类,它可以包含若多个ElectricFlow对象(顾名思义,代表一股电流)。
2. 每一个ElectricFlow对象,都包含若干个ElectricNode对象(即上文中所提及的特征点)。
3. 通过ElectricEffectType枚举变量来指定特征点之间曲线的计算方法,包括:Line(直线)、Bezier(贝塞尔曲线)、CatmullRom(翻译成啥才好?)。不同的曲线可营造出不同的感觉,或铿锵尖锐,或婉转流畅。
4. ElectricEffect类的Density属性定义了特征点与特征点之间,小亮点分布的密度。
5. ElectricFlow的LifeSpan属性用来定义每隔多久要变更一次小亮点的材质。
  关于如何快速生成一个电流效果,请参考JasonElectricEffectDemo项目中GamePage.xaml.cs文件里的InitElectricEffect()方法。
  
  这篇文章代码较少,分析的文字多了些,感谢读到最后的每一位朋友。
  欢迎下载示例代码,并分享改善和扩展的想法。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-65057-1-1.html 上篇帖子: Windows Phone 7 TextBox全选扩展行为 下篇帖子: Windows Phone 7 自动完成输入框控件AutoCompleteBox
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表