• silverlight 乐动魔方 实战十 .


    这次真的要··开始游戏了···

    回归上次Game.xaml

    <UserControl x:Class="SilverlightMusicHit.Game"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        d:DesignHeight="600" d:DesignWidth="800" KeyDown="UserControl_KeyDown">
        
        <Grid x:Name="LayoutRoot">
            <Grid.RowDefinitions>
                <RowDefinition Height="50"/>
                <RowDefinition Height="*"/>
                <RowDefinition Height="50"/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="435"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <TextBlock Name="txtTitle" Grid.Row="0" Grid.Column="0"  Text="歌曲" FontSize="16"></TextBlock>
            <Button Name="btnBack" Grid.Row="2" Grid.Column="1"  Content="返回列表" Opacity="0.5" Click="btnBack_Click" MouseLeave="btn_MouseLeave" MouseMove="btn_MouseMove"></Button>
            <Grid Name="gcMusicHit" Grid.Row="1" Grid.Column="1" Height="435" Width="435" Opacity="0.9">
                <Grid.RowDefinitions>
                    <RowDefinition/>
                    <RowDefinition Height="10"/>
                    <RowDefinition/>
                    <RowDefinition Height="10"/>
                    <RowDefinition/>
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition/>
                    <ColumnDefinition Width="10"/>
                    <ColumnDefinition/>
                    <ColumnDefinition Width="10"/>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>
                <Canvas Background="White" Grid.Row="0" Grid.Column="1"/>
                <Canvas Background="White" Grid.Row="0" Grid.Column="3"/>
                <Canvas Background="White" Grid.Row="1" Grid.Column="0"/>
                <Canvas Background="White" Grid.Row="1" Grid.Column="1"/>
                <Canvas Background="White" Grid.Row="1" Grid.Column="2"/>
                <Canvas Background="White" Grid.Row="1" Grid.Column="3"/>
                <Canvas Background="White" Grid.Row="1" Grid.Column="4"/>
                <Canvas Background="White" Grid.Row="2" Grid.Column="1"/>
                <Canvas Background="White" Grid.Row="2" Grid.Column="3"/>
                <Canvas Background="White" Grid.Row="3" Grid.Column="0"/>
                <Canvas Background="White" Grid.Row="3" Grid.Column="1"/>
                <Canvas Background="White" Grid.Row="3" Grid.Column="2"/>
                <Canvas Background="White" Grid.Row="3" Grid.Column="3"/>
                <Canvas Background="White" Grid.Row="3" Grid.Column="4"/>
                <Canvas Background="White" Grid.Row="4" Grid.Column="1"/>
                <Canvas Background="White" Grid.Row="4" Grid.Column="3"/>
                <Canvas Background="Black" Name="imgMusic7" Grid.Row="0" Grid.Column="0"/>
                <Canvas Background="Black" Name="imgMusic8" Grid.Row="0" Grid.Column="2"/>
                <Canvas Background="Black" Name="imgMusic9" Grid.Row="0" Grid.Column="4"/>
                <Canvas Background="Black" Name="imgMusic4" Grid.Row="2" Grid.Column="0"/>
                <Canvas Background="Black" Name="imgMusic5" Grid.Row="2" Grid.Column="2"/>
                <Canvas Background="Black" Name="imgMusic6" Grid.Row="2" Grid.Column="4"/>
                <Canvas Background="Black" Name="imgMusic1" Grid.Row="4" Grid.Column="0"/>
                <Canvas Background="Black" Name="imgMusic2" Grid.Row="4" Grid.Column="2"/>
                <Canvas Background="Black" Name="imgMusic3" Grid.Row="4" Grid.Column="4"/>
            </Grid>
            <TextBox Grid.Column="1" Name="txtScore" Text="0" FontSize="40" Opacity="0.5" Foreground="#FF97AFC4" FontFamily="Comic Sans MS" Margin="0,0,0,0" />
            <TextBox Grid.Column="2" Grid.Row="1" HorizontalAlignment="Left" Text="Hit" Width="182" Name="txtHit" FontFamily="Comic Sans MS" FontSize="32" FontWeight="Bold" Foreground="#FF2626B7" BorderBrush="#FF1747DE" Margin="0,200,0,200" Visibility="Collapsed" />
        </Grid>
    </UserControl>
    

      

    再进入Game.cs

            #region 变量
            /// <summary>
            /// 背景显示速度 /ms
            /// </summary>
            private int speed = 80;
    
            /// <summary>
            /// 背景显示图片数量
            /// </summary>
            private int imgMax = 30;
    
            /// <summary>
            /// 背景图片索引
            /// </summary>
            private int Index = 0;
    
            /// <summary>
            /// 定时器
            /// </summary>
            private Storyboard _timer;
    
            /// <summary>
            /// 背景画刷
            /// </summary>
            private ImageBrush _imgBrush;
    
            /// <summary>
            /// 播放声音
            /// </summary>
            private MediaElement _mediaSound;
    
            /// <summary>
            /// 播放音乐
            /// </summary>
            private MediaElement _mediaMusic;
    
            /// <summary>
            /// Hit定时器
            /// </summary>
            private Storyboard _tmGame;
    
            /// <summary>
            /// 游戏时间进度 /ms
            /// </summary>
            private int gamestep = 100;
    
            /// <summary>
            /// 音乐对象索引
            /// </summary>
            private int musicIndex = 0;
    
            /// <summary>
            /// 节奏对象
            /// </summary>
            private XML.MusicHitValue _musicHitValue;
    
            /// <summary>
            /// MusichHit显示索引
            /// </summary>
            private int gmIndex = 0;
    
            /// <summary>
            /// MusicHit时间进度
            /// </summary>
            private int gmStep = 0;
    
            /// <summary>
            /// 连击数
            /// </summary>
            private int downHits = 0;
    
            /// <summary>
            /// 总分
            /// </summary>
            private int score = 0;
    
            /// <summary>
            /// 音乐键
            /// </summary>
            private static List<MusicHit> _musicHit;
    
            /// <summary>
            /// 音乐加载
            /// </summary>
            private static ChildMusicLoading _MusicLoading;
            #endregion
    

      

    2、好了··接着开始想怎样实现了······· 不过有之前的铺垫,应该也不难理解的

            public Game(int _musicIndex)
            {
                InitializeComponent();
    
                //读取音乐索引
                musicIndex = _musicIndex;
    
                //创建背景画刷
                _imgBrush = new ImageBrush();
    
                //创建定时器
                _timer = new Storyboard();
                _timer.Duration = new Duration(TimeSpan.FromMilliseconds(speed));
                _timer.Completed += new EventHandler(_timer_Completed);
                _timer.Begin();
    
                //添加播放器
                _mediaSound = new MediaElement();
                _mediaMusic = new MediaElement();
                this.LayoutRoot.Children.Add(_mediaSound);
                this.LayoutRoot.Children.Add(_mediaMusic);
    
                //创建9个音乐键
                _musicHit = new List<MusicHit>();
                _musicHit.Clear();
                for (int i = 0; i < 9; i++)
                    _musicHit.Add(new MusicHit());
    
                //加载音乐
                _MusicLoading = new ChildMusicLoading(musicIndex);
                _MusicLoading.Show();
    
                //新增音乐单击事件
                foreach (Canvas cvs in gcMusicHit.Children)
                    cvs.MouseLeftButtonDown += new MouseButtonEventHandler(cvs_MouseLeftButtonDown);
            }
    

      

    以下是背景效果

            void _timer_Completed(object sender, EventArgs e)
            {
                if (_MusicLoading.DialogResult == true)
                {
                    GameStart();
                    _MusicLoading.DialogResult = false;
                }
    
                bool isHit = false;
                string url = string.Format("{0}{1}{2}", "Image/picBackGround/background", Index, ".jpg");
                _imgBrush.ImageSource = Common.GetGif(ref Index, ref imgMax, ref isHit, url, 1);
                this.LayoutRoot.Background = _imgBrush;
                _timer.Begin();
            }
    

      

    _MusicLoading.DialogResult 这个是不是很面熟?  没错,这个是加载歌曲进度窗体的返回值,终于发现为啥··要无端端返回个True给他吧····呵呵

    接着进入GameStrat()了

    /// <summary>
            /// 游戏开始
            /// </summary>
            private void GameStart()
            {
                //音乐名
                txtTitle.Text = Common._MusicValue[musicIndex].MusicName;
    
                //播放声音
                Common.SoundUrl(ref _mediaSound, "Music/Btn/readyGo.mp3");
                _mediaSound.Play();
                Common.SoundUrl(ref _mediaMusic, Common._MusicValue[musicIndex].MusicPath);
                _mediaMusic.Play();
    
                //获取音乐节奏
                XML.Reader _reader = new XML.Reader();
                _musicHitValue = _reader.GetHisValue(Common._MusicValue[musicIndex].MusicHit);
    
                //创建定时器
                _tmGame = new Storyboard();
                _tmGame.Duration = new Duration(TimeSpan.FromMilliseconds(gamestep));
                _tmGame.Completed += new EventHandler(_tmGame_Completed);
                _tmGame.Begin();
            }
    

      

    以下是节奏图效果

            void _tmGame_Completed(object sender, EventArgs e)
            {
                try
                {
                    if (gmStep.Equals(_musicHitValue.MusicTimer[gmIndex]))
                    {
                        MusicHit musicHit = new MusicHit();
                        int Index = _musicHitValue.MusicHits[gmIndex];
                        Canvas cvs = (Canvas)this.gcMusicHit.Children.First<UIElement>(x => (x as FrameworkElement).Name.StartsWith("imgMusic" + Index.ToString()));
                        cvs.Children.Add(musicHit);
                        _musicHit[Index - 1] = musicHit;
    
                        gmIndex++;
                    }
                }
                catch { }
                gmStep++;
                _tmGame.Begin();
            }
    

      

    应该是这句比较麻烦了····

    Canvas cvs = (Canvas)this.gcMusicHit.Children.First<UIElement>(x => (x as FrameworkElement).Name.StartsWith("imgMusic" + Index.ToString()));

    额··这个如果之前有听我意见,看一下LINQ··,就会知道大概了··· 找出满足条件的头元素(里面就是条件了)额。···查MSDN····去

    按钮

            /// <summary>
            /// 鼠标移过按钮高亮
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void btn_MouseMove(object sender, MouseEventArgs e)
            {
                ((Button)sender).Opacity = 1;
            }
    
            /// <summary>
            /// 鼠标离开按钮恢复
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void btn_MouseLeave(object sender, MouseEventArgs e)
            {
                ((Button)sender).Opacity = 0.5;
            }
    

      

            private void btnBack_Click(object sender, RoutedEventArgs e)
            {
                ((App)(Application.Current)).RedirectTo(new Music());
            }
    

      

    以下判断点击位置

    /// <summary>
            /// 判断点击位置
            /// </summary>
            /// <param name="num"></param>
            private void selectMusicHitPos(int num)
            {
                Hit hit = new Hit();
                hit.HitStyle = 0;
                try
                {
                    if (_musicHit[num - 1].isMusicHit)
                    {
                        hit.hitDisIndex = 1;
                        downHits++;
                        txtHit.Visibility = System.Windows.Visibility.Visible;
                    }
                    else
                    {
                        hit.hitDisIndex = 0;
                        downHits = 0;
                        txtHit.Visibility = System.Windows.Visibility.Collapsed;
                    }
                    Canvas cvs = (Canvas)this.gcMusicHit.Children.First<UIElement>(x => (x as FrameworkElement).Name.StartsWith("imgMusic" + num.ToString()));
                    cvs.Children.Add(hit);
    
                    score += downHits * 10;
                    txtHit.Text = "Hit:" + downHits.ToString();
                    txtScore.Text = score.ToString();
                }
                catch { }
            }
    

      

    键盘来玩  

    private void UserControl_KeyDown(object sender, KeyEventArgs e)
            {
                string stringKey = e.Key.ToString();
                if (stringKey.Contains("NumPad"))
                {
                    selectMusicHitPos(int.Parse(stringKey.Replace("NumPad", "")));
                }
            }
    

      

    鼠标来玩   

     void cvs_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
            {
                try
                {
                    int number = int.Parse(((Canvas)sender).Name.Replace("imgMusic", ""));
                    selectMusicHitPos(number);
                }
                catch { }
            }
    

      

    差不多了····现在试试吧,哈。

    估计silverlight乐动魔方 就在这里结束了

    ····

    下章?

    还有下章, 哈·····演唱会也有加场,。···何况 教程···嘻嘻!

    下章将会附加 乐动魔方 编曲器~~

    silverlight 乐动魔方 .实战系列

     name:5+x

    参与文章与书籍:

    WPF葵花宝典

  • 相关阅读:
    读取XML并绑定至RadioButtonList
    获取客户端IP地址
    Repeater控件数据导出Excel
    验证用户必选CheckBox控件
    限制CheckBoxList控件只能单选
    获取客户端电脑名称
    获取Repeter的Item和ItemIndex
    获取DataList控件的主键和索引
    InsusExportToExcel Library
    ASP.NET网页打印
  • 原文地址:https://www.cnblogs.com/cheng5x/p/2848268.html
Copyright © 2020-2023  润新知