Silverlight 2.5D RPG游戲技巧與特效處理:(六)流光追影
依稀記得《奇跡》里為了讓裝備炫酷“流光”而砸鍋賣鐵;仍舊迷戀每次的跳躍、沖刺、特寫所帶來的動態“追影”。歲月流淌,讓無數玩家無論花費多少時間與金錢都無怨無悔,依舊那天地合一之特性裝備;手握幻象殘光之溢彩神器,踏著御風而行的隨影擦肩而過,陶醉的不僅僅是自己,亦絕非寂寞...
“流光追影” 效果不僅提升了玩家對于裝備品質的不懈追求,同時在趣味性及耐玩性方面都是優秀網游所必備的要素之一;事實也證明了擁有華麗的“流光追影”裝備效果的游戲業績往往都很不錯,比如基于逐幀手繪的《地下城與勇士》及名作續集《萬王之王3》
當然,“流光追影”特效在游戲中的應用非常廣泛,除了武器和身體等部位會用到外,其他還有很多場合比如描述物體的運動軌跡以及特寫的慢動作回放等均可用之來修飾以達到提升視覺體驗的目的:
“流光追影”的實現方式根據需求的不同而顯得多種多樣。本節中,我同樣還是以軟實現的方式為本系列游戲Demo中的主角添置了漂亮而動感的追影與流光效果。首先以追影為例,實現方式與真實影子類似,通過實時復制一個角色當前的實體鏡象并進行透明度逐減動畫而實現;其中我們可以插入一個控制動畫速率的參數以起到調節追影數量的作用,同時也可以增加動態顏色調節,這樣根據角色裝備的顏色以及場景環境的不同,我們可以實時的調整追影顏色使之于游戲整體密切交融:
/// 顯示追影
///</summary>
///<param name="role">所修飾角色</param>
///<param name="equipType">所參照的裝備</param>
///<param name="color">顏色</param>
///<param name="coefficient">系數</param>
publicvoid 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加速的Rectangle、WriteableBitmap、以及Opacity等對象及屬性,均乃性能消耗之物。可想而知,編寫它們的目的暫時僅以向大家展示Silverlight在特效制作方面所能達到的高度而目前還無法用性能來衡量;但這并非就意味著這些都將成為華而不實之物;就好比在少量應用(比如只針對主角)的場合中,使用它同樣可以起到視覺沖擊與性能一并兼顧的效果;同時,本節也是為了Silverlight 5 及更多優秀的后續版本埋下伏筆,從Silverilght 5目前已知的新特性中我們不難看出Silverlight正朝著更偉大的目標前行著,究其一天我們的游戲理想必將實現!
本節源碼下載地址:Demo5.rar
在線演示地址:http://silverfuture.cn