上接游戏人生Silverlight(2) - 趣味钢琴[Silverlight 2.0(c#)]

3、乐谱提示动画
AnimationMusicBook.xaml.cs
InBlock.gif using System; 
InBlock.gif using System.Collections.Generic; 
InBlock.gif using System.Linq; 
InBlock.gif using System.Net; 
InBlock.gif using System.Windows; 
InBlock.gif using System.Windows.Controls; 
InBlock.gif using System.Windows.Documents; 
InBlock.gif using System.Windows.Input; 
InBlock.gif using System.Windows.Media; 
InBlock.gif using System.Windows.Media.Animation; 
InBlock.gif using System.Windows.Shapes; 
InBlock.gif 
InBlock.gif using YYPiano.Controls.Parts; 
InBlock.gif using System.Threading; 
InBlock.gif 
InBlock.gif namespace YYPiano.Controls 
InBlock.gif
InBlock.gif         /// <summary> 
InBlock.gif         /// 乐谱动画 
InBlock.gif         /// </summary> 
InBlock.gif         public partial  class AnimationMusicBook : UserControl 
InBlock.gif        { 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 当前进入到目标区域的按键集合(先进先出) 
InBlock.gif                 /// </summary> 
InBlock.gif                 private List<KeyHitModel> _currentKeys =  new List<KeyHitModel>(); 
InBlock.gif 
InBlock.gif                 public AnimationMusicBook() 
InBlock.gif                { 
InBlock.gif                        InitializeComponent(); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 启动乐谱动画 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <param name="code">乐谱编码</param> 
InBlock.gif                 /// <returns>是否成功地启动了乐谱动画</returns> 
InBlock.gif                 public  bool Start( string code) 
InBlock.gif                { 
InBlock.gif                        code = code.ToUpper().Trim(); 
InBlock.gif 
InBlock.gif                         // 清除已有的 AnimationKey 控件 
InBlock.gif                         foreach (var c  in root.Children) 
InBlock.gif                        { 
InBlock.gif                                var ak = c  as AnimationKey; 
InBlock.gif                                ak.Stop(); 
InBlock.gif                        } 
InBlock.gif                        root.Children.Clear(); 
InBlock.gif                        _currentKeys.Clear(); 
InBlock.gif 
InBlock.gif                         // 把乐谱编码解析为乐谱实体类(用于描述乐谱的每一音阶)集合 
InBlock.gif                        var musicBook =  new List<MusicBookModel>(); 
InBlock.gif                        var countDelay = 0; 
InBlock.gif                         try 
InBlock.gif                        { 
InBlock.gif                                 foreach (var s  in code.Split(',')) 
InBlock.gif                                { 
InBlock.gif                                        var delay =  int.Parse(s.Trim().Substring(1)); 
InBlock.gif                                        var key = Convert.ToChar(s.Trim().Substring(0, 1)).ToKey(); 
InBlock.gif 
InBlock.gif                                        musicBook.Add( new MusicBookModel() { Length = countDelay, Key = key }); 
InBlock.gif 
InBlock.gif                                        countDelay += delay; 
InBlock.gif                                } 
InBlock.gif                        } 
InBlock.gif                         catch (Exception) 
InBlock.gif                        { 
InBlock.gif                                 return  false
InBlock.gif                        } 
InBlock.gif 
InBlock.gif                         // 在容器内放置相应的 AnimationKey 控件 
InBlock.gif                         for ( int i = 0; i < musicBook.Count; i++) 
InBlock.gif                        { 
InBlock.gif                                AnimationKey key =  new AnimationKey(); 
InBlock.gif                                key.TargetIndex = i % 3; 
InBlock.gif                                key.Key = musicBook[i].Key; 
InBlock.gif                                key.BeginTime = TimeSpan.FromMilliseconds(musicBook[i].Length); 
InBlock.gif                                key.Inside +=  new EventHandler<PianoKeyEventArgs>(key_Inside); 
InBlock.gif                                key.Outside +=  new EventHandler<PianoKeyEventArgs>(key_Outside); 
InBlock.gif                                key.Start(); 
InBlock.gif 
InBlock.gif                                root.Children.Add(key); 
InBlock.gif                        } 
InBlock.gif 
InBlock.gif                         return  true
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 按键进入目标区 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <param name="sender"></param> 
InBlock.gif                 /// <param name="e"></param> 
InBlock.gif                 void key_Inside( object sender, PianoKeyEventArgs e) 
InBlock.gif                { 
InBlock.gif                        _currentKeys.Add( new KeyHitModel { Key = e.Key, Hit =  false }); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 按键离开目标区 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <param name="sender"></param> 
InBlock.gif                 /// <param name="e"></param> 
InBlock.gif                 void key_Outside( object sender, PianoKeyEventArgs e) 
InBlock.gif                { 
InBlock.gif                         // 获取此次离开目标区的按键(进入到目标区域的按键集合的第一个成员) 
InBlock.gif                        var key = _currentKeys.First(); 
InBlock.gif 
InBlock.gif                         if (!key.Hit) 
InBlock.gif                                OnLost(); 
InBlock.gif 
InBlock.gif                        _currentKeys.RemoveAt(0); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 指定的键值被敲击后所执行的方法 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <param name="key">键值</param> 
InBlock.gif                 public  void Play(Key key) 
InBlock.gif                { 
InBlock.gif                         if (key >= Key.A && key <= Key.Z && _currentKeys.Where(p => !p.Hit).Count() > 0) 
InBlock.gif                        { 
InBlock.gif                                var validKey = _currentKeys.Where(p => !p.Hit && p.Key == key).FirstOrDefault(); 
InBlock.gif                                 if (validKey !=  null
InBlock.gif                                { 
InBlock.gif                                        OnScore(); 
InBlock.gif                                        validKey.Hit =  true
InBlock.gif                                } 
InBlock.gif                                 else 
InBlock.gif                                { 
InBlock.gif                                        OnLost(); 
InBlock.gif                                } 
InBlock.gif                        } 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 按键敲击正确的事件 
InBlock.gif                 /// </summary> 
InBlock.gif                 public  event EventHandler<EventArgs> Score; 
InBlock.gif                 public  void OnScore() 
InBlock.gif                { 
InBlock.gif                         if (Score !=  null
InBlock.gif                        { 
InBlock.gif                                Score( thisnew EventArgs()); 
InBlock.gif                        } 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 按键敲击错误或未及时敲击的事件 
InBlock.gif                 /// </summary> 
InBlock.gif                 public  event EventHandler<EventArgs> Lost; 
InBlock.gif                 public  void OnLost() 
InBlock.gif                { 
InBlock.gif                         if (Lost !=  null
InBlock.gif                        { 
InBlock.gif                                Lost( thisnew EventArgs()); 
InBlock.gif                        } 
InBlock.gif                } 
InBlock.gif        } 
InBlock.gif}
 




     本文转自webabcd 51CTO博客,原文链接: http://blog.51cto.com/webabcd/345629 ,如需转载请自行联系原作者
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值