第一帖—拼图小游戏

来源:互联网 发布:sharp m2658n 网络扫描 编辑:程序博客网 时间:2024/05/21 06:48

     经过一段时间的努力,完成了一个Silverlight拼图小游戏,代码主要实现过程如下:

Part


     1、在Blend绘制拼图源图形(目前实现了3种类型*3个级别=9种样式);

Puzzle
     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

原创粉丝点击