WPF特效-拼图游戏
此文主要描述我實(shí)現(xiàn)碎片化的便捷過程。
步驟1:
? ?選取參考圖如下(百度圖庫搜的):
步驟2:
? ?根據(jù)效果圖或者模型構(gòu)建貝塞爾曲線,為了方便查看效果,可以設(shè)置控制點(diǎn),Console.WriteLine或直接UI上顯示的方式記錄最終坐標(biāo),效果圖如:
?
?上圖中的紅線,為兩條貝塞爾曲線,左側(cè)的位置我已經(jīng)通過控制點(diǎn)的方式調(diào)好。 上圖Gif為我調(diào)整上方第二條貝塞爾的示意。
步驟3:
?當(dāng)上方右側(cè)的第二條貝塞爾曲線也調(diào)整好后,就已經(jīng)相當(dāng)于調(diào)整好了所有的四條邊。
? 具體原理為:最上方的一條線繞著最右邊的頂點(diǎn)逆時(shí)針旋轉(zhuǎn)90度即可得到右側(cè)的線。右側(cè)的線以最下方的點(diǎn)逆時(shí)針旋轉(zhuǎn)90度就是下方的線。左側(cè)的線也通過旋轉(zhuǎn)下方的線得到。唯一需要做的就是抽一個(gè)某個(gè)點(diǎn)圍繞中心點(diǎn)逆時(shí)針旋轉(zhuǎn)90度后得到新點(diǎn)的函數(shù)。
<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中。(注:我提前根據(jù)步驟一的示例圖,給出了每條Bezier的終點(diǎn),即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"/>
旋轉(zhuǎn)設(shè)置右側(cè)線操作:
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; }// 繞頂點(diǎn)旋轉(zhuǎn)得到新點(diǎn)坐標(biāo) 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); }下方和左方以此類推。 這樣通過后臺(tái)點(diǎn)旋轉(zhuǎn)的旋轉(zhuǎn)計(jì)算處理就可得到所有的Bezier。實(shí)現(xiàn)效果如下圖。步驟4:
通過步驟3得到的Path與RectangleGeometry進(jìn)行組合,設(shè)置成不同碎片的Clip屬性即可得到所有用到的碎片,效果圖如下:
組合過程中,部分碎片的Clip可通過其他碎片的Clip直接翻轉(zhuǎn)或者順時(shí)針、逆時(shí)針旋轉(zhuǎn)直接得到。如:
?<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:
可以通過提前設(shè)定矩陣碎片樣式的固定模式得到所有切圖,也可以隨機(jī)生成每個(gè)碎片,每個(gè)片的形狀通過檢索左側(cè)右邊是否凹凸和上側(cè)碎片下邊是否凹凸獲得。我的碎片化效果如下圖。
轉(zhuǎn)載于:https://www.cnblogs.com/lonelyxmas/p/9472693.html
總結(jié)
以上是生活随笔為你收集整理的WPF特效-拼图游戏的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python操作redis(普通操作,连
- 下一篇: 在.NET Core中三种实现“可插拔”