龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > asp.net编程 >

Silverlight游戏开发系列:Silverlight实现"宝石迷阵"游戏(3)

时间:2009-12-21 11:47来源:未知 作者:admin 点击:
分享到:
RemoveListBijou /// summary /// 从LayoutRoot.Children中移除bijou列表 /// /summary /// param name="bijous"要移除的bijou列表/param public void RemoveListBijou(Listbijou removebijous) { Story
 

RemoveListBijou
        /// <summary>
        /// 从LayoutRoot.Children中移除bijou列表
        /// </summary>
        /// <param name="bijous">要移除的bijou列表</param>
        public void RemoveListBijou(List<bijou> removebijous)
        {
            Storyboard sb = new Storyboard();
            sb.Completed += (object sender1, EventArgs ea1) =>
            {
                var sb2 = sender1 as Storyboard;
                sb.Stop();
                AnimationIsPlaying = false;
                foreach (var tempBijou2 in removebijous)
                {
                    tempBijou2.Opacity = 0.0;
                    this.LayoutRoot.Children.Remove(tempBijou2);
                    this[tempBijou2.Column, tempBijou2.Row] = null;
                }
                Resources.Remove("RemoveBijou");
                FillNull();
                UpdateScoure(45 + (removebijous.Count - 3) * 45);
            };
            Resources.Add("RemoveBijou", sb);
            foreach (var tempBijou in removebijous)
            {
                AddAnimationToStoryboard(sb, tempBijou, "Opacity", 0.0, TimeSpan.FromMilliseconds(200));
            }
            BeginAnimation(sb);
        }

 

消除该消除的宝石后,并不能直接在原位上填充新的宝石,这里需要一个动画效果,简单的模拟真实物理环境:上方的宝石会因为下面的宝石的消失而下落,新填充的宝石会在被消除宝石的那一列的0行出现,为此,要实现一个方法“FillNull”

 

FillNull
        /// <summary>
        /// 创建并播放填充动画
        /// </summary>
        private void FillNull()
        {
            List<bijou> changedBijou = new List<bijou>();
            Storyboard sb = new Storyboard();
            sb.Completed += (object sender1, EventArgs ea1) =>
            {
                var sb2 = sender1 as Storyboard;
                sb2.Stop();
                AnimationIsPlaying = false;
                foreach (var tempBijou in changedBijou)
                {
                    tempBijou.RenderTransform.SetValue(TranslateTransform.YProperty, 0.0);
                }
                Resources.Remove("sbFill");
                var erasableBijous = GetErasablebijou();
                if (erasableBijous != null)
                {
                    RemoveListBijou(erasableBijous);
                }
            };
            Resources.Add("sbFill", sb);
            for (int i = 0; i < MaxColumn; i++)
            {
                int nullNum = 0;
                int row = 0;
                for (int j = 0; j < MaxRow; j++)
                {
                    if (this[i, j] == null)
                    {
                        if (j > row) row = j;
                        nullNum++;
                    }
                }
                for (int k = row - nullNum; k >= 0 && nullNum != 0; k--) //添加被删除Bijou上面的Bijou下落动画
                {
                    DoubleAnimation da = new DoubleAnimation();
                    bijou tempBijou = this[i, k];
                    tempBijou.RenderTransform = new TranslateTransform();
                    tempBijou.RenderTransform.SetValue(TranslateTransform.YProperty, (double)-64 * nullNum);
                    AddAnimationToStoryboard(sb, tempBijou.RenderTransform, "Y", 0.0, TimeSpan.FromMilliseconds(300 * nullNum));
                    this[tempBijou.Column, tempBijou.Row + nullNum] = tempBijou;
                    changedBijou.Add(tempBijou);
                }
                for (int l = nullNum - 1; l >= 0 && nullNum != 0; l--)  //创建新的Bijou填充已消除的
                {
                    int randomNum = GetRandomNum();
                    bijou tempBijou = new bijou(randomNum, i, l);
                    tempBijou.RenderTransform = new TranslateTransform();
                    tempBijou.RenderTransform.SetValue(TranslateTransform.YProperty, (double)-64 * nullNum);
                    AddAnimationToStoryboard(sb, tempBijou.RenderTransform, "Y", 0.0, TimeSpan.FromMilliseconds(300 * nullNum));
                    this[tempBijou.Column, tempBijou.Row] = tempBijou;
                    changedBijou.Add(tempBijou);
                }
            }
            BeginAnimation(sb);
        }

整个游戏的流程大概就是这样了。下面放出源代码。
http://files.cnblogs.com/zhubenwuzui/BejeweledRelease.rar

由于本人是学生+新手,写出的代码肯定有很多缺陷,还请大家多多指教!
QQ:234446552(加我时请注明来自博客园)
本文地址:http://www.cnblogs.com/zhubenwuzui/archive/2009/09/13/BejeweledbySilverlight.html


精彩图集

赞助商链接