Silverlight游戏开发系列:Silverlight实现"宝石迷阵"游戏(2)
下面贴出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并以动画显示出来。