很棒吧?嘿嘿。在角色屬性面板裡除了顯示角色的屬性值等個人資料外,還有裝備管理及屬性加點器兩個重要部分。關於裝備,後面的章節再細說。下面我向大家講講如何制作這個屬性加點器。
如果不論樣式,我們直接可以使用官方提供的NumericUpDown控件即可,該控件非常強大,看了它的源碼,其本身為一個組合控件,由4大部分組成:文本(TextBlock)、文本容器(ContentPresenter)、加按鈕(RepeatButton)及減按鈕(RepeatButton),且模式很多,你能想到的基本都有。當然同樣的,要重寫它的樣式實在是麻煩之事,其實該控件的重點就就在RepeatButton上,如何實現這個Repeat動作又是關鍵中的關鍵。我們不妨從它的原理出發,當鼠標在此按鈕上按下時開始計時,如果鼠標一直未放開,則當到達預先設定的Delay時間間隔後即觸發後面的連續重復動作,且這些動作以Interval為間隔不斷重復下去直到鼠標左鍵被放開或鼠標離開該控件。此時,我又想到了美麗的QXIcon,再次為它添加一種新模式:IconTypes.RepeatButton:
case IconTypes.RepeatButton:
DispatcherTimer timer = new DispatcherTimer();
timer.Tick += (s, e) => { timer.Interval = TimeSpan.FromMilliseconds(Interval); RepeatClick(this, e); };
this.MouseEnter += (s, e) => { Container.Background = NewSource; };
this.MouseLeave += (s, e) => { Container.Background = _BodySource; timer.Stop(); };
this.MouseLeftButtonDown += (s, e) => { timer.Interval = TimeSpan.FromMilliseconds(Delay); timer.Start(); };
this.MouseLeftButtonUp += (s, e) => { timer.Stop(); e.Handled = true; };
break;
根據前面對RepeatButton工作原理的描述,在這種模式下,我通過創建一個DispatcherTimer,當它Tick時觸發public event EventHandler RepeatClick;事件。其中配合控件自身的 MouseLeftButtonDown、MouseLeftButtonUp及MouseLeave來開停Timer及設置它的間隔。
接著,我們就可以將此控件應用到主角屬性面板中制作屬性加點器了。配合上相應邏輯,當屬性點數加完並提交後,主角的新屬性值會立即更新反映到界面中。按照第二十八節的屬性設置,主角擁有5大基本屬性,當修改這些屬性時會分別影響相關的值數據。例如,默認情況下主角的智慧為30,魔法攻擊基本傷害范圍為460-615(不包括魔法自身的攻擊力),此時用激光魔法攻擊敵人可造成約600左右傷血:
而當我將智慧加到200並點擊確定後,魔法攻擊到了3010-4015,此時攻擊敵人可以造成3500左右的傷害,很酷吧。嘿嘿:
本教程示例游戲中,我為主角賦予了1000點的潛能點,大家可以自由分配到不同的屬性上,例如增加力量屬性可以增加物理攻擊力,增加體格可以提升血上限及防御等,增加敏捷可以加快移動及施法速度等,增加幸運可以提高暴擊率等等,測試起來還是相當有趣的呢~
不過目前的屬性加點器還不能通用,畢竟不同的游戲中加點器的實現都有差異。例如有些只有加沒有減,每次點擊都會直接提交,這種處理最簡單;而有的每次加點都會直接反應到界面上,且中途如果不滿意取消後又會恢復原樣,這種模式做起來相對復雜些,需要一些臨時字段來存儲數據,只有提交後才更新到服務器。本節功能上我選擇了折中的處理方式。
游戲中的面板基本上大同小異,前面章節中的對象監視面板、雷達地圖面板、尋路地圖面板、主角屬性面板的制作基本上含蓋了大多數情況,後面的章節我將不再圍繞面板這個羅嗦的話題了,打算將重心放到裝備、物品、技能存放與拖動的實現方面,敬請關注。