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葵花宝典

posted @ 2013-01-06 20:39  五加乘  阅读(1005)  评论(1编辑  收藏  举报