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

简介:
3、乐谱提示动画
AnimationMusicBook.xaml.cs
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Animation; 
using System.Windows.Shapes; 
 
using YYPiano.Controls.Parts; 
using System.Threading; 
 
namespace YYPiano.Controls 

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




     本文转自webabcd 51CTO博客,原文链接: http://blog.51cto.com/webabcd/345629 ,如需转载请自行联系原作者
相关文章
|
C# 图形学
C#之四十九 游戏编程周每日总结
C#之四十九 游戏编程周每日总结
60 0
|
3月前
|
SQL API 定位技术
基于C#使用winform技术的游戏平台的实现【C#课程设计】
本文介绍了基于C#使用WinForms技术开发的游戏平台项目,包括项目结构、运行截图、实现功能、部分代码说明、数据库设计和完整代码资源。项目涵盖了登录注册、个人信息修改、游戏商城列表查看、游戏管理、用户信息管理、数据分析等功能。代码示例包括ListView和ImageList的使用、图片上传、图表插件使用和SQL工具类封装,以及高德地图天气API的调用。
基于C#使用winform技术的游戏平台的实现【C#课程设计】
|
5月前
|
存储 缓存 C#
C#语言编写的仅有8KB大小的简易贪吃蛇开源游戏
C#语言编写的仅有8KB大小的简易贪吃蛇开源游戏
C#语言编写的仅有8KB大小的简易贪吃蛇开源游戏
|
7月前
|
程序员 C# Python
100行python代码,轻松完成贪吃蛇小游戏_c#游戏100行代码(2)
100行python代码,轻松完成贪吃蛇小游戏_c#游戏100行代码(2)
|
7月前
|
存储 程序员 C#
100行python代码,轻松完成贪吃蛇小游戏_c#游戏100行代码
100行python代码,轻松完成贪吃蛇小游戏_c#游戏100行代码
|
7月前
|
存储 C# 开发工具
22.C# 中使用变量记录玩家创建的角色名:实现与游戏角色的互动
22.C# 中使用变量记录玩家创建的角色名:实现与游戏角色的互动
77 0
|
7月前
|
定位技术 C# 图形学
Unity和C#游戏编程入门:创建迷宫小球游戏示例
Unity和C#游戏编程入门:创建迷宫小球游戏示例
159 2
C#实现的打飞机游戏(课程设计)
C#实现的打飞机游戏(课程设计)
157 1
|
存储 C# UED
C# 拼图游戏(超详细)
C# 拼图游戏(超详细)
495 0
C# 拼图游戏(超详细)