WPF特效-拼图游戏
原文:WPF特效-拼图游戏

此文主要描述我实现碎片化的便捷过程。

步骤1:

选取参考图如下(百度图库搜的):

步骤2

根据效果图或者模型构建贝塞尔曲线,为了方便查看效果,可以设置控制点,Console.WriteLine或直接UI上显示的方式记录最终坐标,效果图如:

上图中的红线,为两条贝塞尔曲线,左侧的位置我已经通过控制点的方式调好。 上图Gif为我调整上方第二条贝塞尔的示意。

步骤3:

当上方右侧的第二条贝塞尔曲线也调整好后,就已经相当于调整好了所有的四条边。

具体原理为:最上方的一条线绕着最右边的顶点逆时针旋转90度即可得到右侧的线。右侧的线以最下方的点逆时针旋转90度就是下方的线。左侧的线也通过旋转下方的线得到。唯一需要做的就是抽一个某个点围绕中心点逆时针旋转90度后得到新点的函数。

 <Canvas Width="448" Height="448" HorizontalAlignment="Left" VerticalAlignment="Top"Margin="160" x:Name="CvMainZm" Background="Transparent"><Path Stroke="Red" StrokeThickness="1" Fill="Blue" x:Name="Path1Zm"><Path.Data><PathGeometry><PathGeometry.Figures><PathFigureCollection><PathFigure StartPoint="96, 96"><PathFigure.Segments><PathSegmentCollection><BezierSegment x:Name="Bezier1Zm" Point1="286 62" Point2="96 176" Point3="224 192"/><BezierSegment x:Name="Bezier2Zm" Point1="352 176" Point2="162 62" Point3="352 96"/><BezierSegment x:Name="Bezier3Zm" Point3="448 224"/><BezierSegment x:Name="Bezier4Zm" Point3="352 352"/><BezierSegment x:Name="Bezier5Zm" Point3="224 266"/><BezierSegment x:Name="Bezier6Zm" Point3="96 352"/><BezierSegment x:Name="Bezier7Zm" Point3="0 224"/><BezierSegment x:Name="Bezier8Zm" Point3="96 96"/></PathSegmentCollection></PathFigure.Segments></PathFigure></PathFigureCollection></PathGeometry.Figures></PathGeometry></Path.Data></Path></Canvas>

如我的示例代码,我通过步骤1得到了 上方线的两条Bezier线的值,直接写入xaml中。(注:我提前根据步骤一的示例图,给出了每条Bezier的终点,即Point3)

   <BezierSegment x:Name="Bezier1Zm" Point1="286 62" Point2="96 176" Point3="224 192"/><BezierSegment x:Name="Bezier2Zm" Point1="352 176" Point2="162 62" Point3="352 96"/>

旋转设置右侧线操作:

   private void SetRightFirstBezier(){Point oPoint1 = this.Bezier2Zm.Point1;Point oPoint2 = this.Bezier2Zm.Point2;Point oOrigin = this.Bezier2Zm.Point3;Point oNew = this.CarouselPointAnticlockwise(oPoint1, oOrigin);Point oNew2 = this.CarouselPointAnticlockwise(oPoint2, oOrigin);this.Bezier3Zm.Point1 = oNew2;this.Bezier3Zm.Point2 = oNew;}private void SetRightSecondBezier(){Point oPoint1 = this.Bezier1Zm.Point1;Point oPoint2 = this.Bezier1Zm.Point2;Point oOrigin = this.Bezier2Zm.Point3;Point oNew = this.CarouselPointAnticlockwise(oPoint1, oOrigin);Point oNew2 = this.CarouselPointAnticlockwise(oPoint2, oOrigin);this.Bezier4Zm.Point1 = oNew2;this.Bezier4Zm.Point2 = oNew;
}
// 绕顶点旋转得到新点坐标
private Point CarouselPointAnticlockwise(Point oPoint, Point oOrigin)
{double dY = oOrigin.Y - oPoint.Y;double dX = oOrigin.X - oPoint.X;double dXAdd = dX - dY;double dYAdd = dX + dY;double dNewX = oPoint.X + dXAdd;double dNewY = oPoint.Y + dYAdd;return new Point(dNewX, dNewY);
}

下方和左方以此类推。 这样通过后台点旋转的旋转计算处理就可得到所有的Bezier。实现效果如下图。

步骤4:

通过步骤3得到的Path与RectangleGeometry进行组合,设置成不同碎片的Clip属性即可得到所有用到的碎片,效果图如下:

组合过程中,部分碎片的Clip可通过其他碎片的Clip直接翻转或者顺时针、逆时针旋转直接得到。如:

<CombinedGeometry x:Key="KeyPieceType4" 
                          Geometry1="{StaticResource KeyPieceType1}">
            <CombinedGeometry.Transform>
                <TransformGroup>
                    <ScaleTransform ScaleX="-1" CenterX="224" ScaleY="-1" CenterY="224" />
                    <RotateTransform Angle="-90" CenterX="224" CenterY="224"/>
                </TransformGroup>
            </CombinedGeometry.Transform>

</CombinedGeometry>

步骤5:

可以通过提前设定矩阵碎片样式的固定模式得到所有切图,也可以随机生成每个碎片,每个片的形状通过检索左侧右边是否凹凸和上侧碎片下边是否凹凸获得。我的碎片化效果如下图。

posted on 2018-08-14 09:38 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/9472693.html

WPF特效-拼图游戏相关推荐

  1. 【web前端特效源码】使用HTML5+CSS3+JavaScript制作一个可拖动的拼图游戏动画效果~适合初学者~超简单~ |it前端开发

    b站视频演示效果: [web前端特效源码]使用HTML5+CSS3+JavaScript制作一个可拖动的拼图游戏动画效果~适合初学者~超简单~ |前端开发|IT软件 效果图: 完整代码: <!D ...

  2. WPF特效-粒子动画

    原文:WPF特效-粒子动画 WPF实现泡泡龙小游戏效果. /// -Ball to Ball Collision - Detection and Handling     /// http://sta ...

  3. html5制作拼图游戏教程,用HTML5制作视频拼图的教程

    几天前同事给我看了一个特效,是一个拼图游戏,不同的是,拼图里的是动画.他让我看下做个DEMO,于是就自己整了一会,也确实不难.用canvas很容易做.所以这篇博文不适合高手看....就是随便写来玩玩的 ...

  4. html5拼图游戏开题报告,拼图游戏开题报告-20210406005939.doc-原创力文档

    拼图游戏开题报告 拼图游戏不仅可以帮助 ___打发时间,还可以用于锻炼儿童脑力,帮助少儿 ___大脑思维是Android平台游戏的一个特点. 智能 ___作为一种兼具通讯.办公.娱乐为一体的便携式工具 ...

  5. 拼图游戏 复制粘贴一个叫lemene的人的,这个人是c++博客的用户,我不是,怕以后找不到这篇文章,所以复制粘贴了。文中最后给出了原文链接连接...

    本文讨论如何判断拼图游戏中图形是否可以还原. 例1:下图是一个3X3的数字拼图. 1 3 2 6 5 4 7 8 图1 它要还原成图2 1 2 3 4 5 6 7 8 图2 将问题一般化,在M*N的方 ...

  6. 拼图游戏_我最喜欢的Java拼图2 + 1 = 4

    拼图游戏 这是我当前最喜欢的Java难题. 您如何获取代码来执行此操作? Integer b = 2; Integer c = 1;System.out.println("b+c : &qu ...

  7. 实验楼项目课学习笔记-jQuery翻转拼图游戏

    2019独角兽企业重金招聘Python工程师标准>>> 项目效果图如下: game/index.html <!DOCTYPE html><html><h ...

  8. python拼图_Python实现, 命令行下的拼图游戏

    需求: 现在要做这样一个拼图游戏, 有一个九宫格, 其中有8个方块, 还有一个空位, 点击其中一个方块, 它会往空位移动... 顺序排列8个方块则游戏通关 结构规划:游戏数据结构 玩家操作 逻辑部分 ...

  9. 新个人项目-- 拼图游戏

    正式开博记录,想和很久但一直没有执行的新个人项目-- 拼图游戏. 完全由前端技术完成.从简单粗糙到复杂精细. 为了督促自己持续推进该项目,立博为证. 之后会陆续将文档.计划补充上来.都是非官方非正式的 ...

最新文章

  1. 【转】Oracle SPARC SuperCluster全能王:不改大道至简本色
  2. idea添加maven libraries_使用IntelliJ IDEA创建一个Maven的Spring Boot项目
  3. c++ opencv 通道转换
  4. CVPR 2019 | 小样本域适应的目标检测
  5. mysql run sql files_如何在Eclipse DTP中運行多個.sql文件
  6. 计算机二级python选择题题库_2018年计算机二级python题库精编(1)
  7. RSA的加解密过程--(转自CSDN,学习用)
  8. VB LISTBOX
  9. html div findchild,javascript – JQuery查找父div子标签
  10. 二、JAVA基础、语法
  11. B2B2C商城系统源码 多商户商城源码 Wap+App+小程序源码
  12. ubuntu dock栏添加应用启动图标
  13. 计算机英语词汇的特点,计算机专业英语词汇特点.ppt
  14. svn图标不显示的解决方案
  15. 动手深度学习v2 汇聚层pooling 课后习题
  16. php输出甲子年,甲子年是哪一年?甲子年生人今年多大?
  17. ROS中usb摄像头的使用_(usb_cam)
  18. 给到工作的你诗和远方~
  19. python安装扩展库常用的工具是什么和conda_python习题01——董付国学习系列
  20. 自有App小程序第三方微信授权登录的实现

热门文章

  1. Unity3D 入门 游戏开发 Unity3D portal game development
  2. Linux下统计局域网流量
  3. Modbus网口设备接入多比物联网云平台教程
  4. ionic开发ios app
  5. 新浪微博Python客户端接口OAuth2
  6. jQuery小测试系列之jQuery基础知识
  7. formal timetable for cambridge
  8. 剑桥大学Raven系统
  9. Python字符串常用操作
  10. mongodb之 复制集维护小结