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

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

时间:2009-12-21 11:47来源:未知 作者:admin 点击:
分享到:
下面贴出Up方法的代码: Up /// summary /// 将指定的宝石向上移动一格 /// /summary /// param name="bijou"要移动的宝石/param public void Up(bijou bijou, bool isRollBack) { var

下面贴出Up方法的代码:

Up
        /// <summary>
        /// 将指定的宝石向上移动一格
        /// </summary>
        /// <param name="bijou">要移动的宝石</param>
        public void Up(bijou bijou, bool isRollBack)
        {
            var near = GetbijouByDirection(bijou, Direction.Up);
            if (near != null)
            {
                this.ExchangeLocation(bijou, near); //调换两个宝石的位置
                AddingZindexBybijou(bijou, near); //让bijou的Zindex比near大
                bijou.RenderTransform = new TranslateTransform();
                bijou.RenderTransform.SetValue(TranslateTransform.YProperty, 64.0); //实际位置已经往上移了一位,所以往下平移64
                near.RenderTransform = new TranslateTransform();
                near.RenderTransform.SetValue(TranslateTransform.YProperty, -64.0); //实际位置已经往下移了一位,所以网上平移64

                EventHandler neareh = new EventHandler((object sender1, EventArgs ea1) =>
                {
                    var da = sender1 as DoubleAnimation;
                    sbAll.Children.Remove(da);
                    bijou.RenderTransform.SetValue(TranslateTransform.YProperty, 0.0); //播放完后还原平移变换
                    near.RenderTransform.SetValue(TranslateTransform.YProperty, 0.0);
                });

                EventHandler bijoueh = new EventHandler((object sender1, EventArgs ea1) =>
                {
                    var da = sender1 as DoubleAnimation;
                    sbAll.Children.Remove(da);
                    bijou.RenderTransform.SetValue(TranslateTransform.YProperty, 0.0); //播放完后还原平移变换
                    near.RenderTransform.SetValue(TranslateTransform.YProperty, 0.0);
                    var erasableBjous = GetErasablebijou();
                    if (erasableBjous == null)
                    {
                        Up(near,false);
                    }
                    else
                    {
                        RemoveListBijou(erasableBjous);
                    }
                });
                this.AddAnimationToStoryboard(near.RenderTransform, "Y", 0.0, TimeSpan.FromMilliseconds(300), neareh); //添加动画
                if (isRollBack)
                    this.AddAnimationToStoryboard(bijou.RenderTransform, "Y", 0.0, TimeSpan.FromMilliseconds(300), bijoueh); //添加动画
                else
                    this.AddAnimationToStoryboard(bijou.RenderTransform, "Y", 0.0, TimeSpan.FromMilliseconds(300), neareh); //添加动画
                this.BeginAnimation();
            }
        }


 

检测是否可消除,我用了一个全局检测的办法,当一个宝石执行换位操作时,执行检测是否可消除的方法,如果有可消除的宝石,返回宝石的List列表,如果没有,返回null。


 

GetErasablebijou
        public List<bijou> GetErasablebijou()
        {
            List<bijou> columnSameBijou = new List<bijou>();
            List<bijou> rowSameBijou = new List<bijou>();
            #region 检测横着排列的是否可消除并保存可消除的宝石到columnSameBijou
            for (int row = 0; row < MaxRow; row++)
            {
                int sameNum = 0;
                bool find = false;
                for (int column = 0; column < MaxColumn; column++)
                {
                    while (true)
                    {
                        if (column < MaxColumn - 1 && this[column, row].Type == this[column + 1, row].Type)
                        {
                            sameNum++;
                            column++;
                        }
                        else
                        {
                            if (sameNum >= 2)
                            {
                                for (; sameNum >= 0; sameNum--)
                                {
                                    columnSameBijou.Add(this[column - sameNum, row]);
                                }
                                find = true;
                                break;
                            }
                            else
                            {
                                sameNum = 0;
                            }
                            break;
                        }
                    }
                    if (find)
                        break;
                }
                if (find)
                    break;
            }
            #endregion

            #region 检测竖着排列的是否可消除并保存可消除的宝石到rowSameBijou
            for (int column = 0; column < MaxColumn; column++)
            {
                int sameNum = 0;
                bool find = false;
                for (int row = 0; row < MaxRow; row++)
                {
                    while (true)
                    {
                        if (row < MaxRow - 1 && this[column, row].Type == this[column, row + 1].Type)
                        {
                            sameNum++;
                            row++;
                        }
                        else
                        {
                            if (sameNum >= 2)
                            {
                                for (; sameNum >= 0; sameNum--)
                                {
                                    rowSameBijou.Add(this[column, row - sameNum]);
                                }
                                find = true;
                                break;
                            }
                            else
                            {
                                sameNum = 0;
                            }
                            break;
                        }
                    }
                    if (find)
                        break;
                }
                if (find)
                    break;
            }


            #endregion
            if (rowSameBijou.Count >= 3)
            {
                foreach (var tempBijou in columnSameBijou)
                {
                    if (tempBijou.Column == rowSameBijou[0].Column)
                    {
                        columnSameBijou.Clear();
                        break;
                    }
                }
            }
            #region 合并两个集合并返回
            if (columnSameBijou.Count >= 3 || rowSameBijou.Count >= 3)
            {
                List<bijou> returnBijous = new List<bijou>();
                foreach (var tempBijou in columnSameBijou)
                {
                    returnBijous.Add(tempBijou);
                }
                foreach (var tempBijou in rowSameBijou)
                {
                    if (!columnSameBijou.Contains(tempBijou)) //不允许重复添加
                    {
                        returnBijous.Add(tempBijou);
                    }
                }
                return returnBijous;
            }
            else
            {
                return null;
            }
            #endregion
        }

接下来,就是消除宝石的方法,它接受一个List<bijou>参数,删除里面所有的bijou并以动画显示出来。


精彩图集

赞助商链接