Silverlight 2.5D RPG游戲技巧與特效處理:(七)動畫特寫
Silverlight中的HLSL不僅適用于場景與動畫渲染,對于游戲中的角色,我們同樣可以利用它制作動畫特寫。較常見的比如角色傳送時的淡入淡出、扭曲變形、幻化呈現等切換動畫,當然還有例如角色被DeBuff時所表現出來的放大縮小以及虛弱時的不規則體形等。適當的場合為角色增加動畫特寫使得游戲更顯精致而華麗,當玩家身心愉快的融入其中而流連忘返時,或許正是這些魔幻般的特效在背后默默的飄散著令人迷醉的芳香。
還記得Shazzam嗎?要制作特寫依舊離不開這款強大的工具,以角色的傳送特寫“幻降”為例,對應Shazzam中的現成特效名為:DirectionalBlur,我們不妨看看它的HLSL代碼:
float BlurAmount : register(C1);
sampler2D Texture1Sampler : register(S0);
float4 main(float2 uv : TEXCOORD) : COLOR
{
float4 c = 0;
float rad = Angle * 0.0174533f;
float xOffset = cos(rad);
float yOffset = sin(rad);
for(int i=0; i<16; i++)
{
uv.x = uv.x - BlurAmount * xOffset;
uv.y = uv.y - BlurAmount * yOffset;
c += tex2D(Texture1Sampler, uv);
}
c /= 16;
return c;
}
僅僅十來行不到1KB的代碼,將之按照第5節的方法配置進游戲項目后,在角色傳送結束時我們便通過Storyboard創建基于DirectionalBlur參數為BlurAmount的動畫實現360任意角度的幻影過度動畫特寫:
entity.Effect = directionalBlur;
Storyboard blurStoryboard = new Storyboard();
DoubleAnimation doubleAnimation = new DoubleAnimation() {
From = -0.25,
To = 0,
Duration = new Duration(TimeSpan.FromMilliseconds(600)),
};
Storyboard.SetTarget(doubleAnimation, directionalBlur);
Storyboard.SetTargetProperty(doubleAnimation, new PropertyPath("BlurAmount"));
blurStoryboard.Children.Add(doubleAnimation);
EventHandler handler = null;
blurStoryboard.Completed += handler = (s1, e1) => {
Storyboard sb = s1 as Storyboard;
sb.Stop();
sb.Completed -= handler;
entity.Effect = null;
};
blurStoryboard.Begin();
某些場合為了突出玩家隆重登場,我們通常還會使用到比如“影合”(GrowablePoissonDisk)的動畫特寫:無數個角色的重影由四面八方匯聚而來,如同靈魂與力量的回歸附體:
某些時候角色從一個空間向另外一個空間穿梭,虛幻的感受是身體被分解成粒子最終從下至上又被重新組合,此時常會用到“新生”(CircleReveal)動畫特寫來描述這樣一個穿越生死的經歷:
除此之外,類似百葉窗的切片特寫以及波動扭曲特寫在表述特定魔法效果時同樣可以起到錦上添花之功效:
到此為止,本系列Demo中已集成了10數款精煉而實用的HLSL渲染特效,單獨的存放于名為Effects的項目中,使用起來非常簡便。無論是企業應用亦或是游戲開發;無論是將之用于窗體的渲染,還是用于場景、動畫、角色的動畫特寫都顯得游刃有余:
當然,發自內心的希望更多的Silverlight開發者能融入到HLSL的編寫中,實現并分享更多更加炫酷的動畫特效為Silverlight將來一統三端打下基礎。不遠了,Silverlight 5 發布后游戲開發都會易如反掌,一切特效在Silverlight面前將一文不值。我始終堅信:追求極致的心必定銀光四射,長空千里!
本節源碼下載地址:Demo6.rar
在線演示地址:http://silverfuture.cn