经过一段时间的努力,完成了一个Silverlight拼图小游戏,代码主要实现过程如下:
1、在Blend绘制拼图源图形(目前实现了3种类型*3个级别=9种样式);
2、初始化加载视频及相关背景音乐,并用视频刷填充源图形:
/// <summary>
/// 获取视频刷
/// </summary>
/// <param name="mediaElement">要填充的视频块</param>
/// <param name="offsetX">填充X轴坐标信息</param>
/// <param name="offsetY">填充Y轴坐标信息</param>
/// <returns>Fill VideoBrush</returns>
public VideoBrush GetVideoBrush(MediaElement mediaElement, int offsetX, int offsetY)
{
VideoBrush vb = new VideoBrush();
TranslateTransform videoTransform = new TranslateTransform();
videoTransform.X = -1 * offsetX;
videoTransform.Y = -1 * offsetY;
vb.SetSource(mediaElement);
vb.Transform = videoTransform;
vb.Stretch = Stretch.None;
vb.AlignmentX = AlignmentX.Left;
vb.AlignmentY = AlignmentY.Top;
vb.Opacity = 1.0;
return vb;
}
3、混淆视频块坐标进入游戏,记时跑马表开始记时;
4、视频移动及联动控制(这里涉及到动态创建和播放动画控制):
/// <summary>
/// 动态创建和播放 移动、吸咐动画
/// </summary>
/// <param name="control">要移动的元件块</param>
/// <param name="toPoint">移动至坐标</param>
/// <param name="duration">移动持续时长(秒)</param>
public void VidepPartMove(FrameworkElement control,Point toPoint,Duration duration)
{
if (!control.Resources.Contains(control.Name + "StoryBoard")) //不存在为元件创建动画
{
DoubleAnimation xa = new DoubleAnimation();
xa.Duration = duration;
xa.To = toPoint.X;
DoubleAnimation ya = new DoubleAnimation();
ya.Duration = duration;
ya.To = toPoint.Y;
Storyboard sb = new Storyboard();
sb.Duration = duration;
sb.Children.Add(xa);
sb.Children.Add(ya);
Storyboard.SetTarget(xa, control);
Storyboard.SetTargetProperty(xa, new PropertyPath("(Canvas.Left)"));
Storyboard.SetTarget(ya, control);
Storyboard.SetTargetProperty(ya, new PropertyPath("(Canvas.Top)"));
control.Resources.Add(control.Name + "StoryBoard", sb);
sb.Completed += new EventHandler(sb_Completed);
sb.Begin();
}
else //存在时更改动画属性播放动画
{
Storyboard sb = (Storyboard)control.Resources[control.Name + "StoryBoard"];
//sb.Stop();
for (int i = 0; i < sb.Children.Count; i++)
{
if (sb.Children[i].GetType() == typeof(DoubleAnimation))
{
DoubleAnimation da = (DoubleAnimation)sb.Children[i];
if (Storyboard.GetTargetProperty(da).Path == "(Canvas.Left)")
{
da.To = toPoint.X;
}
else if (Storyboard.GetTargetProperty(da).Path == "(Canvas.Top)")
{
da.To = toPoint.Y;
}
}
}
sb.Begin();
}
}
5、拼图成功,得分记录,最高分记录。
实际设计开发过程中,会有很多细节问题如:对已拼接视频组合、级联判断比较繁琐,同时需完成高分
记分牌,记时跑马表等小功能组件。
有兴趣的朋友可试玩一下地址(视频初次时加载可能会花较多时间,需要你耐心等待一小会^_^):
http://silverlight.services.live.com/invoke/103743/VideoPuzzle/iframe.html