SkiaSharp 之 WPF 自繪 粒子花園(案例版)

此案例包含了簡單的碰撞檢測,圓形碰撞檢測方法,也可以說是五環彈球的升級版,具體可以根據例子參考。

粒子花園

這名字是案例的名字,效果更加具有科技感,很是不錯,搞搞做成背景特效也是不錯的選擇。

Wpf 和 SkiaSharp

新建一個 WPF 項目,然后,Nuget 包即可 要添加 Nuget 包

Install-Package?SkiaSharp.Views.WPF?-Version?2.88.0

其中核心邏輯是這部分,會以我設置的 60FPS 來刷新當前的畫板。

skContainer.PaintSurface?+=?SkContainer_PaintSurface;
_?=?Task.Run(()?=>
{while?(true){try{Dispatcher.Invoke(()?=>{skContainer.InvalidateVisual();});_?=?SpinWait.SpinUntil(()?=>?false,?1000?/?60);//每秒60幀}catch{break;}}
});

彈球實體代碼 (Ball.cs)

public?class?Ball
{public?double?X?{?get;?set;?}public?double?Y?{?get;?set;?}public?double?VX?{?get;?set;?}public?double?VY?{?get;?set;?}public?int?Radius?{?get;?set;?}public?int?Move?{?get;?set;?}public?SKColor?sKColor?{?get;?set;?}?=?SKColors.Blue;///?<summary>///?檢查球的碰撞///?</summary>public?static?void?CheckBallHit(Ball?b1,?Ball?b2){var?dx?=?b2.X?-?b1.X;var?dy?=?b2.Y?-?b1.Y;var?dist?=?Math.Sqrt(Math.Pow(dx,2)?+?Math.Pow(dy,?2));if?(dist?<?b1.Radius?+?b2.Radius){var?angle?=?Math.Atan2(dy,?dx);var?sin?=?Math.Sin(angle);var?cos?=?Math.Cos(angle);//?以b1為參照物,設定b1的中心點為旋轉基點double?x1?=?0;double?y1?=?0;var?x2?=?dx?*?cos?+?dy?*?sin;var?y2?=?dy?*?cos?-?dx?*?sin;//?旋轉b1和b2的速度var?vx1?=?b1.VX?*?cos?+?b1.VY?*?sin;var?vy1?=?b1.VY?*?cos?-?b1.VX?*?sin;var?vx2?=?b2.VX?*?cos?+?b2.VY?*?sin;var?vy2?=?b2.VY?*?cos?-?b2.VX?*?sin;//?求出b1和b2碰撞之后的速度var?vx1Final?=?((b1.Move?-?b2.Move)?*?vx1?+?2?*?b2.Move?*?vx2)?/?(b1.Move?+?b2.Move);var?vx2Final?=?((b2.Move?-?b1.Move)?*?vx2?+?2?*?b1.Move?*?vx1)?/?(b1.Move?+?b2.Move);//?處理兩個小球碰撞之后,將它們進行歸位var?lep?=?(b1.Radius?+?b2.Radius)?-?Math.Abs(x2?-?x1);x1?=?x1?+?(vx1Final?<?0???-lep?/?2?:?lep?/?2);x2?=?x2?+?(vx2Final?<?0???-lep?/?2?:?lep?/?2);b2.X?=?b1.X?+?(x2?*?cos?-?y2?*?sin);b2.Y?=?b1.Y?+?(y2?*?cos?+?x2?*?sin);b1.X?=?b1.X?+?(x1?*?cos?-?y1?*?sin);b1.Y?=?b1.Y?+?(y1?*?cos?+?x1?*?sin);b1.VX?=?vx1Final?*?cos?-?vy1?*?sin;b1.VY?=?vy1?*?cos?+?vx1Final?*?sin;b2.VX?=?vx2Final?*?cos?-?vy2?*?sin;b2.VY?=?vy2?*?cos?+?vx2Final?*?sin;}}
}

##粒子花園核心類 (ParticleGarden.cs)

///?<summary>
///?粒子花園
///?</summary>
public?class?ParticleGarden
{public?SKPoint?centerPoint;public?double?Spring?=?0.0001;public?int?ParticelCount?=?100;public?List<Ball>?Particles?=?new?List<Ball>();public?SKCanvas?canvas;///?<summary>///?渲染///?</summary>public?void?Render(SKCanvas?canvas,?SKTypeface?Font,?int?Width,?int?Height){this.canvas?=?canvas;canvas.Clear(SKColors.Black);centerPoint?=?new?SKPoint(Width?/?2,?Height?/?2);if?(Particles.Any()?==?false){for?(int?i?=?0;?i?<?ParticelCount;?i++){Random?random?=?new?Random((int)DateTime.Now.Ticks);var?Length?=?random.Next(3,?10);Particles.Add(new?Ball(){X?=?random.Next(0,?Width),Y?=?random.Next(0,?Height),sKColor?=?SKColors.White,VX?=?random.NextInt64(-2,?2),VY?=?random.NextInt64(-2,?2),Radius?=?Length,Move?=?Length});}}//畫線for?(int?i?=?0;?i?<?Particles.Count;?i++){Move(Particles[i],?i,?Width,?Height);}//畫球foreach?(var?item?in?Particles){DrawCircle(canvas,?item);}using?var?paint?=?new?SKPaint{Color?=?SKColors.Blue,IsAntialias?=?true,Typeface?=?Font,TextSize?=?24};string?by?=?$"by?藍創精英團隊";canvas.DrawText(by,?600,?400,?paint);}public?void?Move(Ball?p,?int?i,?int?width,?int?height){p.X?+=?p.VX;p.Y?+=?p.VY;for?(var?j?=?i?+?1;?j?<?Particles.Count;?j++){var?target?=?Particles[j];CheckSpring(p,?target,?width,?height);Ball.CheckBallHit(p,?target);}if?(p.X?-?p.Radius?>?width){p.X?=?-p.Radius;}else?if?(p.X?+?p.Radius?<?0){p.X?=?width?+?p.Radius;}if?(p.Y?-?p.Radius?>?height){p.Y?=?-p.Radius;}else?if?(p.Y?+?p.Radius?<?0){p.Y?=?height?+?p.Radius;}}public?void?CheckSpring(Ball?current,?Ball?target,?int?width,?int?height){var?dx?=?target.X?-?current.X;var?dy?=?target.Y?-?current.Y;var?dist?=?Math.Sqrt(Math.Pow(dx,?2)?+?Math.Pow(dy,?2));var?minDist?=?width?>?height???width?/?10?:?height?/?5;if?(dist?<?minDist){DrawLine(current,?target,?dist,?minDist);var?ax?=?dx?*?Spring;var?ay?=?dy?*?Spring;current.VX?+=?ax?/?current.Move;current.VY?+=?ay?/?current.Move;target.VX?-=?ax?/?target.Move;target.VY?-=?ay?/?target.Move;}}public?void?DrawLine(Ball?current,?Ball?target,?double?dist,?int?minDist){var?StrokeWidth?=?(float)(2?*?Math.Max(0,?(1?-?dist?/?minDist)));var?Alpha?=?Math.Max(0,?(1?-?dist?/?minDist))?*?byte.MaxValue;var?Color?=?current.sKColor.WithAlpha((byte)Alpha);//劃線using?var?LinePaint?=?new?SKPaint{Color?=?Color,Style?=?SKPaintStyle.Fill,StrokeWidth?=?StrokeWidth,IsStroke?=?true,StrokeCap?=?SKStrokeCap.Round,IsAntialias?=?true};var?path?=?new?SKPath();path.MoveTo((float)current.X,?(float)current.Y);path.LineTo((float)target.X,?(float)target.Y);path.Close();canvas.DrawPath(path,?LinePaint);}///?<summary>///?畫一個圓///?</summary>public?void?DrawCircle(SKCanvas?canvas,?Ball?ball){using?var?paint?=?new?SKPaint{Color?=?ball.sKColor,Style?=?SKPaintStyle.Fill,IsAntialias?=?true,StrokeWidth?=?2};canvas.DrawCircle((float)ball.X,?(float)ball.Y,?ball.Radius,?paint);}
}

效果如下:

03504ab41b7626adf1d25ae519a83e20.gif

效果放大看,還是很心曠神怡的。

總結

這個特效的案例重點是碰撞檢測,同時又產生了奇妙的特效效果,很是不錯。

代碼地址

https://github.com/kesshei/WPFSkiaParticleGardenDemo.git

https://gitee.com/kesshei/WPFSkiaParticleGardenDemo.git

一鍵三連呦!,感謝大佬的支持,您的支持就是我的動力!

版權

藍創精英團隊(公眾號同名,CSDN 同名,CNBlogs 同名)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/284026.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284026.shtml
英文地址,請注明出處:http://en.pswp.cn/news/284026.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

xshell連接ubuntu

1.更新資料列表 sudo apt-get update2.安裝openssh-server sudo apt-get install openssh-server3.查看ssh服務是否啟動 sudo ps -e | grep ssh4.如果沒有啟動&#xff0c;啟動ssh服務 sudo service ssh start5.查看IP地址 sudo ifconfig如果出現xshell無法輸入密碼的情況…

教你從零開始搭建一款前端腳手架工具

本文系原創&#xff0c;轉載請附帶作者信息&#xff1a;Jrain Lau項目地址&#xff1a;https://github.com/jrainlau/s...前言 在實際的開發過程中&#xff0c;從零開始建立項目的結構是一件讓人頭疼的事情&#xff0c;所以各種各樣的腳手架工具應運而生。筆者使用較多的yoeman…

微信小程序 --- 頁面跳轉

第一種&#xff1a;wx.navigateTo({}); 跳轉&#xff1a; 注意&#xff1a;這種跳轉回觸發當前頁面的 onHide 方法&#xff0c;將當前頁面隱藏&#xff0c;然后顯示跳轉頁面。所以可以返回&#xff0c;返回的時候觸發 onShow方法進行顯示&#xff1a; &#xff08;項目的底部導…

Java基礎 深拷貝淺拷貝

Java基礎 深拷貝淺拷貝 非基本數據類型 需要new新空間class Student implements Cloneable{private int id;private String name;private Vector course;public Student(){try{Thread.sleep(1000);System.out.println("Student Constructor called.");}catch (Interr…

不安裝運行時運行 .NET 程序

好久沒寫文章了&#xff0c;有些同學問我公眾號是不是廢了&#xff1f;其實并沒有。其實想寫的東西很多很多&#xff0c;主要是最近公司比較忙&#xff0c;以及一些其他個人原因沒有時間來更新文章。這幾天抽空寫了一點點東西&#xff0c;證明公眾號還活著。長久以來的認知&…

一文弄懂分布式和微服務

簡單的說&#xff0c;微服務是架構設計方式&#xff0c;分布式是系統部署方式&#xff0c;兩者概念不同。 微服務 簡單來說微服務就是很小的服務&#xff0c;小到一個服務只對應一個單一的功能&#xff0c;只做一件事。這個服務可以單獨部署運行&#xff0c;服務之間可以通過R…

常見的js算法面試題收集,es6實現

1、js 統計一個字符串出現頻率最高的字母/數字 let str asdfghjklaqwertyuiopiaia; const strChar str > {let string [...str],maxValue ,obj {},max 0;string.forEach(value > {obj[value] obj[value] undefined ? 1 : obj[value] 1if (obj[value] > max)…

PHP面向對象(OOP)----分頁類

PHP面向對象(OOP)----分頁類 同驗證碼類&#xff0c;分頁也是在個人博客&#xff0c;論壇等網站中不可缺少的方式&#xff0c;通過分頁可以在一個界面展示固定條數的數據&#xff0c;而不至于將所有數據全部羅列到一起&#xff0c;實現分頁的原理其實就是對數據庫查詢輸出加了一…

JS 事件練習

QQ拖拽及狀態欄選擇 HTML 1 <!DOCTYPE html>2 <html xmlns"http://www.w3.org/1999/xhtml">3 <head>4 <title>QQ練習</title>5 <link href"css/main.css" rel"stylesheet" />6 <script src&…

Dubbo和Spring Cloud微服務架構對比

微服務架構是互聯網很熱門的話題&#xff0c;是互聯網技術發展的必然結果。它提倡將單一應用程序劃分成一組小的服務&#xff0c;服務之間互相協調、互相配合&#xff0c;為用戶提供最終價值。目錄 微服務主要的優勢 降低復雜度 可獨立部署 容錯 擴展 核心部件 總體架構 Dubbo …

《ABP Framework 極速開發》 - 教程首發

?寫在發布之前強烈建議每一位小伙伴都應該好好看看 ABP Framework 官方文檔&#xff0c;可能有很多的小伙伴跟我剛開始的感覺一樣“一看文檔深似海”&#xff0c;看完文檔之后&#xff0c;想要上手卻找不著頭緒。本套教程寫作的目的之一是為初學者提供一條相對簡潔的快速上手路…

智能家居系統結構標準化

版權申明&#xff1a;本文為博主窗戶(Colin Cai)原創&#xff0c;歡迎轉帖。如要轉貼&#xff0c;必須注明原文網址http://www.cnblogs.com/Colin-Cai/p/8490423.html作者&#xff1a;窗戶QQ&#xff1a;6679072E-mail&#xff1a;6679072qq.com0 引 言 智能家居是指利用先進的…

洛谷 P3391 文藝平衡樹

題目描述 您需要寫一種數據結構&#xff08;可參考題目標題&#xff09;&#xff0c;來維護一個有序數列&#xff0c;其中需要提供以下操作&#xff1a;翻轉一個區間&#xff0c;例如原有序序列是5 4 3 2 1&#xff0c;翻轉區間是[2,4]的話&#xff0c;結果是5 2 3 4 1 --by洛谷…

JSONObject中optString和getString等的區別

2019獨角獸企業重金招聘Python工程師標準>>> 同事在看到我寫的解析數據代碼后&#xff0c;告訴我optString比getString好用&#xff0c;optString不會拋異常&#xff0c;而getString會拋異常&#xff0c;自己是將信將疑&#xff0c;就說&#xff0c;回去后我查查資料…

Lombok插件安裝(IDEA)、配置jar包、使用

點擊進入Lombok官網下載Lombok jar包 使用Lombok可能需要注意的地方 &#xff08;1&#xff09;當你的IDE是Idea時&#xff0c;要注意你的Idea是支持Lombok的&#xff0c;如果不支持請更換高版本嘗試&#xff08;這里采用2018 3.3&#xff09;。 &#xff08;2&#xff09;在使…

Blazor University (40)JavaScript 互操作 —— 傳遞 HTML 元素引用

原文鏈接&#xff1a;https://blazor-university.com/javascript-interop/calling-javascript-from-dotnet/passing-html-element-references/傳遞 HTML 元素引用源代碼[1]在編寫 Blazor 應用程序時&#xff0c;不鼓勵對文檔對象模型 (DOM) 進行操作&#xff0c;因為它可能會干…

RabbitMQ+PHP 教程六(RPC)

(using php-amqplib) 前提必讀 本教程假設RabbitMQ是安裝在標準端口上運行&#xff08;5672&#xff09;。如果您使用不同的主機、端口或憑據&#xff0c;則連接設置需要調整。 如果您在本教程中遇到困難&#xff0c;可以通過郵件列表與我們聯系。 開始 在第二個教程中&#xf…

TKMybatis 介紹和使用

目錄 一、什么是 TKMybatis 二、TKMybatis 使用 2.1 Springboot 項目中加入依賴 2.2 使用講解 2.2.1 實體類中使用 2.2.2 dao中使用 2.2.3 Service 層中使用 2.3 實際案例 2.3.1 dao 層使用 2.3.2 service 層使用 一、什么是 TKMybatis TKMybatis 是基于 Mybatis 框…

angularjs的ng-repeat回調

首先html代碼是這樣的&#xff1a; <label>Name des Leiters:</label><select name"leaderID" id"selectLeaderID"><option ng-repeat"manager in managers" value"leader_id{{manager.id}}&leader_name{{manager…

sed和vim練習

1、刪除/etc/grub2.conf文件中所有以空白開頭的行行首的空白字符sed s^[[:space:]]\ /etc/grub2.conf2、刪除/etc/fstab文件中所有以#開頭&#xff0c;后面至少跟一個空白字符的行的行首的#和空白字符sed -n s^#[[:space:]]\p /etc/fstab3、在/root/install.log每一行行首增加#…