Pixi.js的使用整理

来源:https://www.cnblogs.com/huangqian/archive/2023/08/13/17626223.html
-Advertisement-
Play Games

在現代的 Web 開發中,表單是不可或缺的組件之一。用戶可以通過表單輸入和提交數據,而開發者則需要對這些數據進行處理和存儲。然而,在某些情況下,我們可能需要重置表單並恢復到最初的狀態。 本文介紹瞭如何使用 form 表單處理庫來實現表單恢復初始數據的功能。通過 form 提供的靈活性和方便性,我們... ...


最近在做的一個前端項目中,有一些圖像的處理操作(3D圖,2D圖都有),其中3D圖也是通過獲取後端服務的圖像2D數據進行繪製展示,通過滑鼠各種操作調用後端服務來進行重新獲取新圖數據。這裡前端設計到圖像的操作使用了PIXIJS,這裡將使用的方式做一個說明,以作參考。
首先pixijs的官網:https://pixijs.com/ pixijs的中文網使用(只有一些最基本的):http://pixijs.huashengweilai.com/

理解pixijs的幾個對象: 最關鍵的三個就是: Application對象 ,sprites(精靈)與stage(舞臺)
Application:這個是用來創建Pixi應用的。PIXI.Application會自動選擇使用Canvas或者是WebGL來渲染圖形,這取決於您的瀏覽器支持情況。PIXI.Application有一個options對象,可以設置一些參數,比如顯示的區域的寬,高,,透明度,解析度等等等。具體官網有很詳細說明。
stage:來自PixiJS中文網的解釋,stage(舞臺)是Pixi的Container(容器)對象。你可以把一個Container(容器)想象成一種空盒子,它會把你放進去的東西組合在一起並儲存起來。stage(舞臺)對象是場景中所有可見事物的根容器。你在stage(舞臺)里放的任何東西都會在canvas畫面上渲染出來,。
sprite:sprite(精靈)是一種的特殊圖像對象。您可以控制它們的位置、大小和其他屬性,
總體的理解和使用步驟就是:首先用Application創建Pixi應用,當創建了Pixi應用後,舞臺容器也就自動創建了,可以理解為容器就是一個用來存放物體的東西,比如我們現實中的存錢罐,收納箱,衣櫃什麼的。可以通過應用對象訪問到舞臺。光有舞臺這個容器後,我們就是需要將物體放入進去,這裡的物體一般就是我們需要操作的圖像。我們通過sprite來加入進來。當然圖像渲染中自然少不了圖像紋理一說,可以使用YIPixi的loader載入圖像紋理並創建精靈,然後將其加入到Pixi的容器stage中,這樣就完成了Pixi的整個基本的過程。
我這裡是在vue3中使用的PixiJS,第一步創建Pixi應用,關鍵代碼如下:
import * as PIXI from 'pixi.js'; import '@pixi/unsafe-eval' let Pixi=new PIXI.Application({width:800,height:800});
第二步:將Pixi應用加入到頁面元素中展示。即在onMounted的勾子函數中調用如下代碼:document.getElementById("DivLeft3d").appendChild(Pixi.view); 將Pixi加入到頁面的的元素中,這裡“DivLeft3d”是我頁面中的一個div元素。
第三步:創建sprite並將其加入到Pixi的容器中進行展示:我這裡的示例代碼中是直接載入的圖像的二進位byte[]數據,註意Pixi的圖像數據格式是RGBA格式的。我之前這裡的數據格式BGRA的,導致顯示的圖像一直是一個顏色,搗鼓了一天才找到原因。針對Pixi的滑鼠事件,dataIndex是我的自定義參數,如果這裡不需要參數,可以直接用js箭頭函數。還有就是我這裡事件是卸載精靈上的,也可以寫在舞臺stage上來觸發,具體看各自使用。
`function pixiLoadImg(dataIndex,imagedata){
let pixelData=new Uint8Array(imagedata);
let sprite=PIXI.Sprite.from(PIXI.Texture.fromBuffer(pixelData, 800, 800, {resourceOptions: {width: 800, height: 800,format: 6408}}));

//對於有事件的精靈,通常需要設置sprite.interactive = true , 對於作按鈕用的精靈,需要設置sprite.buttonMode = true;
sprite.buttonMode = true;
 sprite.interactive = true;
//sprite.anchor.set(0.5) //設置錨點在中間

//這裡是針對精靈的一些滑鼠事件。
sprite.on('pointerdown',(event)=>{PIXImousedown(dataIndex,event)})
      .on('pointerup',(event)=>{PIXImouseup(dataIndex,event)})
      .on('pointermove',(event)=>{PIXImousemove(dataIndex,event)})
      .on('pointerover',(event)=>{PIXImouseover(dataIndex,event)})
      .on('pointerout',(event)=>{PIXImouseout(dataIndex,event)})

  console.log("添加Pixi數據")
  Pixi.stage.removeChildren();
  Pixi.stage.addChild(sprite);

}另外需要註意的是在Pixi上是沒有mousewheel事件的。這個我們可以在更外層的元素上觸發這個事件,或者在整個window上監聽這個事件,然後判斷是否是Pixi上的操作即可,我這裡是中鍵進行縮放操作。參考代碼類似:window.addEventListener("mousewheel", (event) => {
console.log("mousewheel");
const step = event.wheelDelta > 0 ? 0.1 : -0.1
//event.preventDefault(); //阻止事件冒泡
if(selectDataIndex>0)
{
proxy.$axios.post(proxy.GLOBAL.baseUrl + 'Hear/MouseWheel',
{"dataIndex":selectDataIndex,"delta":event.deltaY})
.then((res)=>{
let byteBuffer= _base64ToArrayBuffer(res.data.base64Image);
//縮放圖像
pixiLoadImg(selectDataIndex,byteBuffer);
}).catch((res)=>{
alert("MouseMove異常");
console.log(res);
});
}
})`

最後,附帶獲取滑鼠在Pixi上的坐標位置的方法:
如果我們是用Pixi的精靈來觸發的,通過事件參數來獲取到位置信息:event.data.getLocalPosition(event.currentTarget.parent);,類似let currentPosition=event.data.getLocalPosition(event.currentTarget.parent);其中currentPosition.x和currentPosition.y就是對應的滑鼠坐標:
如果我們是用Pixi的舞臺上觸發的,通過舞臺上的事件參數來獲取位置信息:event.data.globalX和event.data.globalY就是對應的滑鼠位置。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 通過編碼實戰瞭解quarkus攔截器的另一個高級特性:禁用類級別攔截器,這樣可以避免類級別和方法級別攔截器的疊加衝突 ...
  • [toc] ### 1.晶元手冊中的LED電路圖 ![圖1](https://img-blog.csdnimg.cn/34c2a95aa89c4cbe8a7904429d889564.png) ### 2.官網手冊 ![圖2](https://img-blog.csdnimg.cn/e9b1131d ...
  • 設計字元設備 文件系統調用系統IO的內核處理過程 在Linux文件系統管理中,當應用程式調用open函數時,內核會根據文件路徑找到文件的索引結點(inode),為文件分配文件描述符和文件對象,並根據打開模式和許可權等參數進行相應的操作和設置。 硬體層原理 思路:把底層寄存器配置操作放在文件操作介面里, ...
  • 前面講了Centos如何安裝telnet遠程,這次分享Ubuntu系統如何安裝遠程telnet,作為咱們運維備用遠程途徑 一、下載和安裝 查看系統版本:Ubuntu 22.04.1 LTS 線上安裝: apt install telnet telnetd openbsd-inetd 離線安裝: 離線 ...
  • > 拋磚引玉:多個查詢需要在同一時刻進行數據的修改,就會產生併發控制的問題。我們需要如何避免寫個問題從而保證我們的資料庫數據不會被破壞。 ## 鎖的概念 讀鎖是共用的互相不阻塞的。多個事務在聽一時刻可以同時讀取同一資源,而相互不幹擾。 寫鎖的排他的。一個寫鎖會阻塞其他寫鎖或讀鎖。出於安全考慮只有這樣 ...
  • CentOS 7.9 環境的安裝不再贅述,不清楚可以參看之前的文章:https://www.cnblogs.com/iflytek/p/14403664.html 1、準備GBase 8a的安裝包:GBase8a-NoLicense-Free-8.6.2_build43-R7-redhat7.3-x ...
  • 博客推行版本更新,成果積累制度,已經寫過的博客還會再次更新,不斷地琢磨,高質量高數量都是要追求的,工匠精神是學習必不可少的精神。因此,大家有何建議歡迎在評論區踴躍發言,你們的支持是我最大的動力,你們敢投,我就敢肝 ...
  • 最近翻到 ElementUI 的日期組件源碼,看到一些處理日期的工具方法,挺有意思,平常沒有註意到,特此記錄下來。 ### 獲取當前日期的前一天,後一天 ```js export const prevDate = function(date, amount = 1) { return new Dat ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...