silverlight 动画自管理

本文介绍了一种在Silverlight中封装动画自管理的方法,通过创建AttackInfo类来实现在特定位置展示并自动移除攻击信息动画的过程。此方法解决了多个动画实例并发运行时的资源管理和回调问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在GDE-X开发过程中需要对有的动画片段进行集中管理——可以归类到任务池结构。

一些动画需要启动后,按照一定的帧顺序展现,在展现完毕之后从画布中清除并释放所占用资源。

silverlight中对于storyboard等提供completed事件,在动画结束的时候回调。

若这种动画会同时出现很多个,则回调的时候需要拿到具体其对应的那个释放函数。这样若单独维护其成员变量就行不通了。

如何让每个动画都在完成时找到自己对应的那个completed回调呢?用一个类封装一下就行了。 请看我封装的一个 AttackInfo 类,其功能为在某点出现一个攻击信息的动画,慢慢上浮并且消失。用于角色在受到攻击的时候头顶浮现数字或者其他信息。

效果如下图所示(Damage 1)

/// <summary> /// 攻击信息类 /// </summary> class AttackInfo { /// <summary> /// 构造函数,将自动启动动画 /// </summary> /// <param name="rootCanvas">根画布</param> /// <param name="x">逻辑x</param> /// <param name="y">逻辑y</param> /// <param name="ID">角色ID</param> /// <param name="Info">内容</param> public AttackInfo(Canvas rootCanvas, int x, int y, int ID, string Info) { this.Info = Info; X = x; Y = y; RootCanvas = rootCanvas; this.ID = ID; this.Start(); } private void Start() { int FromX = Battle.Transfer_X(X) + 6; int FromY = Battle.Transfer_Y(Y) - 40; int TargetY = FromY - 30; AttackInfoText = new TextBlock(); AttackInfoText.Text = Info.ToString(); AttackInfoText.FontSize = 20; AttackInfoText.Foreground = new SolidColorBrush(Colors.Red); RootCanvas.Children.Add(AttackInfoText); Canvas.SetLeft(AttackInfoText, FromX); Canvas.SetTop(AttackInfoText, FromY); Canvas.SetZIndex(AttackInfoText, Battle.AttackInfoTextOffsetBase); //创建动画 DoubleAnimation MoveAnimY = new DoubleAnimation(); MoveAnimY.From = FromY; MoveAnimY.To = TargetY; MoveAnimY.Duration = new Duration(new TimeSpan(0, 0, 0, 1, 0)); DoubleAnimation AnimOpc = new DoubleAnimation(); AnimOpc.From = 1; AnimOpc.To = 0; AnimOpc.Duration = new Duration(new TimeSpan(0, 0, 0, 1, 0)); Storyboard Sb = new Storyboard(); Sb.Duration = new Duration(new TimeSpan(0, 0, 0, 1, 0)); Sb.AutoReverse = false; Sb.Children.Add(MoveAnimY); Sb.Children.Add(AnimOpc); Storyboard.SetTarget(MoveAnimY, AttackInfoText); Storyboard.SetTarget(AnimOpc, AttackInfoText); Storyboard.SetTargetProperty(MoveAnimY, new PropertyPath("(Canvas.Top)")); Storyboard.SetTargetProperty(AnimOpc, new PropertyPath("Opacity")); RootCanvas.Resources.Add("AttackInfoAnimation" + ID, Sb); Sb.Completed += new EventHandler(this.AttackInfoAnimationFinish); Sb.Begin(); } /// <summary> /// 显示攻击信息动画结束 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void AttackInfoAnimationFinish(object sender, EventArgs e) { RootCanvas.Children.Remove(AttackInfoText); RootCanvas.Resources.Remove("AttackInfoAnimation" + ID); } private string Info; private int X { get; set; } private int Y { get; set; } private TextBlock AttackInfoText; private int ID;//角色ID private Canvas RootCanvas { get; set; } }

调用的时候传入其绘图根信息及其他具体的一些参数,就能实现这个动画的自管理了:

AttackInfo InfoAnimation = new AttackInfo(BattleInstance.Carrier, X, Y, ID, Info);

同理,比如DispatcherTimer等也可以这么用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值