依稀记得《奇迹》里为了让装备炫酷“流光”而砸锅卖铁;仍旧迷恋每次的跳跃、冲刺、特写所带来的动态“追影”。岁月流淌,让无数玩家无论花费多少时间与金钱都无怨无悔,依旧那天地合一之特性装备;手握幻象残光之溢彩神器,踏着御风而行的随影擦肩而过,陶醉的不仅仅是自己,亦绝非寂寞...

“流光追影” 效果不仅提升了玩家对于装备品质的不懈追求,同时在趣味性及耐玩性方面都是优秀网游所必备的要素之一;事实也证明了拥有华丽的“流光追影”装备效果的游戏业绩往往都很不错,比如基于逐帧手绘的《地下城与勇士》及名作续集《万王之王3

当然,“流光追影”特效在游戏中的应用非常广泛,除了武器和身体等部位会用到外,其他还有很多场合比如描述物体的运动轨迹以及特写的慢动作回放等均可用之来修饰以达到提升视觉体验的目的:

“流光追影”的实现方式根据需求的不同而显得多种多样。本节中,我同样还是以软实现的方式为本系列游戏Demo中的主角添置了漂亮而动感的追影与流光效果。首先以追影为例,实现方式与真实影子类似,角色每次切帧时通过实时复制一个角色当前的实体镜象并进行透明度逐减动画而实现;其中我们可以插入一个控制动画速率的参数以起到调节追影数量的作用,同时也可以增加动态颜色调节,这样根据角色装备的颜色以及场景环境的不同,我们可以实时的调整追影颜色使之于游戏整体密切交融:

        /// <summary>
        
/// 显示追影
        
/// </summary>
        
/// <param name="role">所修饰角色</param>
        
/// <param name="equipType">所参照的装备</param>
        
/// <param name="color">颜色</param>
        
/// <param name="coefficient">系数</param>
        public void ShowChasingShadow(Hero role, EquipTypes equipType, Color color, double coefficient) {
            WriteableBitmap writeableBitmap 
= new WriteableBitmap((int)role.OverallSize.X, (int)role.OverallSize.Y);
            writeableBitmap.Render(role.EquipEntity(equipType), 
null);
            writeableBitmap.Invalidate();
            Rectangle rectangle 
= new Rectangle() { Width = role.OverallSize.X, Height = role.OverallSize.Y, Fill = new SolidColorBrush(color) };
            rectangle.OpacityMask 
= new ImageBrush() { ImageSource = writeableBitmap };
            writeableBitmap 
= new WriteableBitmap((int)role.OverallSize.X, (int)role.OverallSize.Y);
            writeableBitmap.Render(rectangle, 
null);
            writeableBitmap.Invalidate();
            EntityObject blurShadow 
= new EntityObject() { 
                ImageSource 
= writeableBitmap,
                Center 
= role.Center,
                Position 
= role.Position,
                Z 
= role.Z - 20
            };
            space.Children.Add(blurShadow);
            Storyboard storyboard 
= new Storyboard();
            DoubleAnimation doubleAnimation 
= new DoubleAnimation() {
                From 
= 0.7,
                To 
= 0,
                Duration 
= TimeSpan.FromMilliseconds(role.HeartInterval * coefficient),
            };
            Storyboard.SetTarget(doubleAnimation, blurShadow);
            Storyboard.SetTargetProperty(doubleAnimation, 
new PropertyPath("Opacity"));
            storyboard.Children.Add(doubleAnimation);
            EventHandler handler 
= null;
            storyboard.Completed 
+= handler = delegate {
                storyboard.Completed 
-= handler;
                storyboard.Stop();
                space.Children.Remove(blurShadow);
            };
            storyboard.Begin();
        }

接下来是制作流光。它3D游戏中更为多见,通常用粒子渲染实现。当然了,2.5D游戏毕竟还是以逐帧为基础的平面游戏,在连贯性及层次感方面我们无法做到最真实。不过一样可以借鉴追影的方案,以拷贝一个角色实体对其进行微错时闪烁处理还是能达到不错效果的,代码与追影的相类似,这里就不罗列了。

实际游戏设计中,英雄角色的实体通常会划分为多个层次:铠甲、武器、头饰、坐骑等等,不同装备根据状态进行流光呈现以展示装备的稀有或突出地位。于是之前的纸娃娃系统为其实现奠定了充分的基础,我们完全可以做到基于任何角色部位的装备进行分层的流光处理,就整体效果而言更接近客户端网游:

其实,在我的脑海中还有非常多相当有趣的各式“流光追影”呈现方式,苦于无相关素材而无法一一列举给大家。仅仅10来行的代码,描绘的流光溢彩于形于色,或许这就是Silverlight所给我们创造的高效率游戏开发工程模式。

最后还需说明一下,当前Demo所实现的光影效果中的真实阴影、追影、流光等用到的都是暂时无法利用GPU加速的RectangleWriteableBitmap、以及Opacity等对象及属性,均乃性能消耗之物。可想而知,编写它们的目的暂时仅以向大家展示Silverlight在特效制作方面所能达到的高度而目前还无法用性能来衡量;但这并非就意味着这些都将成为华而不实之物;就好比在少量应用(比如只针对主角)的场合中,使用它同样可以起到视觉冲击与性能一并兼顾的效果;同时,本节也是为了Silverlight 5 及更多优秀的后续版本埋下伏笔,从Silverilght 5目前已知的新特性中我们不难看出Silverlight正朝着更伟大的目标前行着,究其一天我们的游戏理想必将实现!

本节源码请到目录中下载

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

posted on 2011-03-17 15:53  深蓝色右手  阅读(6300)  评论(27编辑  收藏  举报