Silverlight游戏开发系列:Silverlight实现"宝石迷阵"游戏(3)
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