相對於上一節,氣勢增加了不少呢,對嗎?
額外的,通常的網絡游戲中,我們都可以通過角色頭像面板中的小圖標來查看當前監視的精靈對象被附加的Buff以及相關信息如持續時間、效果等等,而這個功能在我們的示例游戲中該如何實現呢?
這裡我們同樣的先添加一個名為QXIcon的圖標控件,該控件的界面xaml定義如下:
……
<Canvas x:Name="Icon">
<Image x:Name="Body">
<Image.ToolTip>
<TextBlock x:Name="Details"/>
</Image.ToolTip>
</Image>
< /Canvas>
……
該控件的主體是一張圖片,我為之增加了一個ToolTip用於鼠標懸停時顯示該圖片的描述。
接下來再為通用型角色頭像面板增加一個水平排列的StackPanel控件作為這些Buff圖標的容器:
<StackPanel x:Name="ExtraPanel" OrIEntation="Horizontal" />
為什麼選擇StackPanel而不是其他的布局控件呢?一方面為了與Silverlight更好的兼容,另一方面只要設置好它的寬度,動態的子控件添加或移除隊列起來均非常的完美,我們需要做的僅僅是Add和Remove操作罷了。
最後,在刷新監視對象角色頭像面板方法中添加如下邏輯進行Buff圖標的添加與移除判斷:
……
//更新Buff附加屬性圖標及描述
for (int i = 0; i < obj.ExtraTime.Count(); i++) {
QXIcon icon = ObjectRoleFace.ExtraPanel.FindName(string.Format("Extra{0}", i)) as QXIcon;
if (obj.ExtraTime[i] > 0) {
XElement ExtraItem = Super.GetTreeNode(Super.SystemXElement["ExtraItems"], "Item", "Value", i.ToString());
if (icon == null) {
icon = new QXIcon() {
Width = 16,
Height = 16,
BodySource = Super.getImage(ExtraItem.Attribute("Src").Value)
};
ObjectRoleFace.ExtraPanel.RegisterName(string.Format("Extra{0}", i), icon);
ObjectRoleFace.ExtraPanel.Children.Add(icon);
}
icon.Tip = string.Format("{0}持續:{1}秒", ExtraItem.Attribute("Name").Value, obj.ExtraTime[i]);
} else {
if (icon != null) {
ObjectRoleFace.ExtraPanel.UnregisterName(string.Format("Extra{0}", i));
ObjectRoleFace.ExtraPanel.Children.Remove(icon);
icon = null;
}
}
}
……