深夜福利亚洲_你懂得影院夜精品a_91原创在线视频_国产特级淫片免费看_国产一区二区美女视频_在线观看视频亚洲_国产精品天天看天天狠_91在线免费网站_精品在线视频一区_日本高清视频免费在线观看_国产一区久久_在线观看网站黄不卡

您的位置:首頁(yè) >資訊 >

環(huán)球快消息!PixiJS 修煉指南 - 01. 啟程

簡(jiǎn)介

什么是 PixiJS

PixiJS 是一個(gè)使用便捷且高效的2D渲染引擎——沒(méi)錯(cuò),它不是大而全的游戲引擎,而是更輕量的渲染引擎。

這也使得它更專注于做好高效的2D渲染工作,給予WebGL高效渲染,實(shí)現(xiàn)上萬(wàn)對(duì)象渲染的粒子效果;同時(shí)也提供了更高的自由度,可用于做任何游戲類型的渲染層,甚至僅僅用于宣傳頁(yè)面的2D動(dòng)畫繪制。


(資料圖片僅供參考)

同時(shí),作為渲染引擎,它又比純粹的 Canvas 使用起來(lái)更為便捷,可以直接通過(guò)操作 SpriteContainerGraphics等對(duì)象的屬性完成畫面中渲染效果的更新。

這樣輕量易上手而又高效的渲染引擎,對(duì)于快速搭建輕量級(jí)的H5小游戲或者游戲 demo 來(lái)說(shuō)可謂再合適不過(guò)。

而且,從2014年10月的第一個(gè)版本發(fā)布至今已過(guò)去近十年,仍然在不斷更新迭代。2022年的 PixiJS v6 開(kāi)始更是提供了 TypeScript 的支持,提供了內(nèi)部對(duì)象更加方便的智能提示支持,也讓大型項(xiàng)目使用 TS 開(kāi)發(fā)后更加規(guī)范和可維護(hù)。最新的 v7 更是拋棄了各種歷史包袱,更新到了現(xiàn)代化的前端項(xiàng)目生態(tài),并且改進(jìn)了一些歷史 API(比如 interactive),提供新的更深入優(yōu)化項(xiàng)目性能的能力。

對(duì)于諸如骨骼動(dòng)畫、游戲?yàn)V鏡、物理引擎、跨平臺(tái)框架等需求,PixiJS 也有各種第三方工具、插件的支持,可擴(kuò)展性也十分優(yōu)秀。

為什么寫這篇文章

這樣優(yōu)秀的工具,卻可能因?yàn)楣俜綀F(tuán)隊(duì)人力有限無(wú)暇顧及文檔維護(hù),或是覺(jué)得都是基本的開(kāi)發(fā)概念不需要再重新寫文檔贅述,官方的文檔較為簡(jiǎn)陋,基本只是羅列 API 的參考手冊(cè)。

對(duì)于之前沒(méi)太多了解的新同學(xué)來(lái)說(shuō),上手可能要走不少?gòu)澛贰?/p>

于是就想在個(gè)人學(xué)習(xí)的筆記基礎(chǔ)上,梳理一個(gè)從基礎(chǔ)概念開(kāi)始的學(xué)習(xí)流程供大家參考,希望能對(duì)有需要的同學(xué)有所幫助。

搭建項(xiàng)目

首先,我們來(lái)搭建一個(gè)使用 PixiJS 渲染的游戲項(xiàng)目。

方法 1. 靜態(tài)引用 dist 資源

如果只是想快速體驗(yàn),可以參考官方文檔指南,在頁(yè)面內(nèi)通過(guò) <script>標(biāo)簽引入 PixiJS 的 dist 文件后,直接在靜態(tài)項(xiàng)目?jī)?nèi)體驗(yàn)使用 PixiJS:

<script src="https://pixijs.download/release/pixi.js"></script><script>  const { Application } = window.PIXI;  const app = new Application({    width: 640,    height: 360,    backgroundColor: 0x6495ed,  });  document.body.appendChild(app.view);</script>

這一方式的優(yōu)點(diǎn)是快速可用。

但缺點(diǎn)也很明顯,沒(méi)有構(gòu)建環(huán)境的支持無(wú)法使用 TypeScript 等相關(guān)能力,也不具備 Tree Shaking 優(yōu)化項(xiàng)目產(chǎn)物大小等前端構(gòu)建項(xiàng)目的常用特性。

方法 2. 基于 npm 包構(gòu)建(推薦)

這一途徑則是在現(xiàn)有的前端構(gòu)建項(xiàng)目中,通過(guò) npm/pnpm 安裝 PixiJS,再 import 需要的模塊到頁(yè)面內(nèi)進(jìn)行開(kāi)發(fā)。

優(yōu)點(diǎn)是可以完整地使用所有 PixiJS 應(yīng)有的能力,以及前端構(gòu)建項(xiàng)目所具有的所有便捷特性。缺點(diǎn)是搭建最初的項(xiàng)目結(jié)構(gòu)稍微需要花一點(diǎn)時(shí)間。

推薦使用 Vite 創(chuàng)建一個(gè)基本的 Vanilla + TypeScript 項(xiàng)目,再安裝 pixi.js和幾個(gè)常用的 PixiJS 基本子包:

$ npm create vite@latest my-pixi-demo$ cd my-pixi-demo$ npm install -S pixi.js @pixi/utils

然后清空項(xiàng)目的入口腳本(一般為 src/main.ts),修改為:

import { Application } from "pixi.js";const app = new Application({  width: 640,  height: 360,  backgroundColor: 0x6495ed,});document.body.appendChild(app.view as HTMLCanvasElement);

啟動(dòng)開(kāi)發(fā)構(gòu)建服務(wù):

$ npm run dev

點(diǎn)擊打開(kāi)出現(xiàn)的開(kāi)發(fā)預(yù)覽頁(yè)面鏈接,不出意外的話,就能看到游戲的畫布出現(xiàn)在瀏覽器內(nèi)了。

開(kāi)始工作

創(chuàng)建成員

剛才我們搭建完項(xiàng)目后,創(chuàng)建了一個(gè) PixiJS 提供的 Application對(duì)象,它就是我們開(kāi)發(fā)的 游戲應(yīng)用了。

只不過(guò)目前它里面空空如也,只是繪制了一個(gè)指定背景色和寬高尺寸的空畫布。

接下來(lái)我們就要往里面加入各種成員,讓它熱鬧起來(lái)。

import {  Application,  Graphics,  Sprite,  Text,} from "pixi.js";const app = new Application({  width: 640,  height: 360,  backgroundColor: 0x6495ed,});document.body.appendChild(app.view as HTMLCanvasElement);// 創(chuàng)建文本成員const slogan = new Text("Hello, developer!", {  fill: 0xffffff,  fontSize: 32,});slogan.position.set(20, 20);// 創(chuàng)建圖形成員const sloganBg = new Graphics();sloganBg.position.set(10, 10);sloganBg.lineStyle(4, 0x333333, .25);sloganBg.beginFill(0xefefef, .5);sloganBg.drawRoundedRect(0, 0, slogan.width + 20, slogan.height + 20, 10);sloganBg.endFill();app.stage.addChild(slogan, sloganBg);// 創(chuàng)建精靈成員const sprite = Sprite.from("https://hk.krimeshu.com/sprite-minion.png");sprite.anchor.set(0.5, 0.5);sprite.position.set(app.screen.width / 2, app.screen.height / 2);app.stage.addChild(sprite);

效果大致如下:

基本概念

上面的例子中,除了之前提到的 Application之外,主要有以下幾個(gè)新面孔:

TextGraphicsSprite

以及 Application的幾個(gè)成員:

app.stageapp.screenapp.view

顯然,TextGraphicsSprite將會(huì)是我們之后開(kāi)發(fā)游戲常用的成員類型。其中的 TextGraphics顧名思義很好理解,就是 文本圖形。而 Sprite其實(shí)也是它的字面意思“精靈”,它是具有圖形材質(zhì)和一系列屬性、操作方法的成員對(duì)象,是我們?cè)谟螒蛑兄苯硬僮鞯幕A(chǔ)單元之一。

1. 容器與層級(jí)

如果查看他們的 type 聲明就會(huì)發(fā)現(xiàn),它們具有這樣的繼承派生關(guān)系:

符號(hào) ->表示繼承。

Graphics -> ContainerSprite -> ContainerText -> Sprite -> Container

可見(jiàn)它們都屬于一個(gè)共同的祖先類別 Container,而 Container又繼承于更原始的 DisplayObject

可推測(cè) DisplayObject是 PixiJS 中可用于繪制的 可顯示對(duì)象,應(yīng)該是渲染底層操作的基礎(chǔ)單位。

Container是在 DisplayObject的基礎(chǔ)上具有類似 Web 節(jié)點(diǎn)性質(zhì)的樹(shù)形結(jié)構(gòu)對(duì)象。整個(gè)游戲需要繪制的成員,都以嵌套的樹(shù)形結(jié)構(gòu)最終掛載于 app.stage這個(gè)頂級(jí) Container之下。

實(shí)際上因?yàn)?PixiJS 沒(méi)有 CSS 的層級(jí)概念,繪制時(shí)其實(shí)就是按照遍歷整個(gè) app.stage的樹(shù)形結(jié)構(gòu),從上到下、從前到后進(jìn)行繪制,后繪制對(duì)象覆蓋先繪制的對(duì)象的優(yōu)先級(jí)來(lái)決定層級(jí)覆蓋關(guān)系。

GraphicsSpriteText則是在 Container基礎(chǔ)上,擁有更多特化后的繪制能力和操作方法的可顯示對(duì)象具體子類。將它們的實(shí)例通過(guò) addChild加入到游戲的 app.stage中,就會(huì)被 PixiJS 繪制出來(lái),最終出現(xiàn)在我們眼前了。

const text1 = new Text("...");const text2 = new Text("...");// ...app.stage.addChild(  text1,  text2,  //...);

2. 屏幕

除了 app.stage之外,上面還用到了 app.screenapp.view這兩個(gè) Application的屬性。

通過(guò)查看類型定義,我們發(fā)現(xiàn)前者的類型是 Rectangle,即矩形,對(duì)其的官方定義為:

Rectangle對(duì)象是一個(gè)由它左上角的 原點(diǎn)(x, y)和自身 寬度width+高度height定義的區(qū)域。

app.screen就是我們整個(gè)游戲應(yīng)用的矩形渲染區(qū)域,平時(shí)游戲中只有位于這個(gè)區(qū)域內(nèi)的可顯示對(duì)象才能被用戶在頁(yè)面上看到。

3. 畫布

最后的 app.view則是 PixiJS 應(yīng)用的渲染器所持有的 Canvas 畫布對(duì)象引用。

在我們的例子中,因?yàn)閯?chuàng)建 Application時(shí)沒(méi)有傳入畫布對(duì)象,所以 PixiJS 內(nèi)部會(huì)幫我們創(chuàng)建符合指定屬性的畫布,并掛載在 app實(shí)例的 view屬性上。在這一切完成之后,我們最后將創(chuàng)建的 app.view畫布通過(guò) appendChild()加入到頁(yè)面的 DOM 樹(shù)內(nèi)。

同樣的,我們也可以不使用自動(dòng)創(chuàng)建的畫布,而是使用頁(yè)面上已有的 Canvas 畫布對(duì)象來(lái)創(chuàng)建 Application應(yīng)用對(duì)象:

const canvas = document.querySelector("#cvsMyGame");const app = new Application({  view: canvas,  width: canvas.width,  height: canvas.height,});

這個(gè)例子里,如果我們不將 canvas 的寬高傳給 Application的構(gòu)造參數(shù),PixiJS 將會(huì)用一個(gè)默認(rèn)的尺寸創(chuàng)建游戲,并修改為 canvas 的新寬高。所以還是需要獲取后賦值傳入,稍顯啰嗦。

4. 更多適配

如果我們的游戲是面向移動(dòng)端設(shè)備開(kāi)發(fā)的話,還需要增加一個(gè)分辨率參數(shù),以適配高分辨率設(shè)備的像素密度:

const app = new Application({  view: canvas,  width: canvas.width,  height: canvas.height,  resolution: window.devicePixelRatio || 2,});

不過(guò)如果我們的游戲應(yīng)用與網(wǎng)頁(yè)視口的尺寸始終保持一致(即所謂的“全屏游戲”)的話,其實(shí)可以也不用傳入這么多參數(shù),只需要這樣配置:

const app = new Application({  view: canvas,  resizeTo: window,  autoDensity: true,});

通過(guò) resizeTo屬性指定應(yīng)用畫布跟隨網(wǎng)頁(yè)窗口尺寸,還可以在用戶屏幕旋轉(zhuǎn)、調(diào)整窗口尺寸后由 PixiJS 自動(dòng)調(diào)整畫布尺寸,以適配用戶設(shè)備的最新畫面狀態(tài)。

——不過(guò)頁(yè)面內(nèi)的成員坐標(biāo)和尺寸并不會(huì)按新舊尺寸的比例進(jìn)行調(diào)整更新,畢竟實(shí)際游戲場(chǎng)景的成員數(shù)可能相當(dāng)多,而且不同成員的定位適配策略通常并不相同,還是需要在檢測(cè)到對(duì)應(yīng) resize事件后自行調(diào)整。

這次我們創(chuàng)建了一個(gè)基本的 PixiJS 游戲應(yīng)用,并對(duì)一些基礎(chǔ)概念進(jìn)行了說(shuō)明。

但這個(gè)基本 demo 中還是有不少東西沒(méi)有說(shuō)清楚,并且這個(gè)應(yīng)用的代碼也沒(méi)有合理組織,之后我們將在這個(gè)基礎(chǔ)上繼續(xù)補(bǔ)充和完善。

如果有什么紕漏與謬誤歡迎指出~

關(guān)鍵詞:

玖玖在线播放| 欧美专区视频| 久久综合久久99| 91精品久久久久久| 日韩精品免费观看视频| 欧美一区二区三区视频免费| 性综艺节目av在线播放| www.日韩精品| 中文字幕免费高| 亚洲成人直播| 国产精品美女www爽爽爽视频| 成人在线高清| 亚洲福利视频在线| 麻豆av在线导航| 亚洲成人激情自拍| 五月婷婷开心综合| 欧洲国产精品| 精品视频网站| 九九热精品视频国产| 最新日韩精品| 欧美成人在线直播| 2017亚洲天堂1024| 天涯成人国产亚洲精品一区av| 一区二区三区网址| 国产亚洲成年网址在线观看| 免费看毛片的网址| 国产米奇在线777精品观看| 日本电影一区二区三区| 雨宫琴音一区二区在线| 97人人干人人| 亚洲激情在线| 久久爱av电影| 一本综合精品| 久久综合给合久久狠狠色| 欧美在线亚洲| 亚洲最大福利网站| 亚洲福利一区| 日本高清久久一区二区三区| 三级久久三级久久| 不卡中文字幕在线| 国产精品一区二区果冻传媒| 超碰成人在线免费观看| 国产精品自拍网站| 人妻有码中文字幕| 国产精品视频线看| 激情乱色小说视频| 亚洲大片一区二区三区| 一二三四在线视频观看社区| 岛国av一区二区三区| 国产永久免费高清在线观看 | 亚洲成在人线免费观看| 一区二区日本视频| 亚洲1区2区3区4区| 激情综合闲人网| 91精品国产综合久久精品| 欧洲一区二区三区| 在线观看亚洲区| 91国内精品| 国产欧美日韩专区发布| 在线视频亚洲| 免费日韩在线观看| 亚洲免费观看高清完整版在线| 最新在线地址| 欧美α欧美αv大片| 国产精品麻豆成人av电影艾秋| 午夜精品久久久久久久白皮肤| 青青草成人影院| 欧美日韩一区二区三区免费| 91一区二区在线观看| 一区二区三区不卡在线视频| 精品成人在线观看| 国产精品xxxav免费视频| 91九色在线观看| 国产精品一二三四五| 高清孕妇孕交╳╳交| 日韩精品最新网址| 精品国产一区二区三区不卡蜜臂| 国产精品一区二区三区不卡 | 精品无码久久久久久国产| av日韩久久| 91精品中国老女人| 国产精品资源站在线| 自拍偷拍21p| 欧美高清激情brazzers| 深夜福利一区| 欧美第一黄网| 国产精品久久久久久久岛一牛影视| av午夜在线| 欧美成人在线网站| 91久久中文| 另类小说色综合| 日韩欧美中文字幕一区| 啪啪激情综合网| 正在播放一区| 欧美性xxxxx极品| 日韩黄色碟片| 欧美主播一区二区三区美女 久久精品人| 国产亚洲精品超碰| 一二三四区在线观看| 国产精品www色诱视频| 国产剧情av麻豆香蕉精品| 久草在线在线| 久久综合久久八八| 香蕉久久久久久久av网站| jizz国产| 色吧影院999| 性色一区二区| 在线观看av网| 欧美成年人视频网站欧美| 久久国产精品毛片| 最近最新mv在线观看免费高清| 久久夜色精品国产亚洲aⅴ| 日本少妇一区二区| 成人免费在线电影| 国产精品一区二区三| 久久久久久久综合| 日本综合视频| 亚洲免费精品视频| 欧美揉bbbbb揉bbbbb| 国产成人av| 亚洲精品久久久中文字幕| 一区二区在线视频播放| 秋霞影院一区二区| 1769视频在线播放免费观看| 国产精品久久久久久久9999| 91网上在线视频| 最新欧美色图| 一个色的综合| 69久久99精品久久久久婷婷| 天堂俺去俺来也www久久婷婷| 黄色成人在线看| 亚洲欧洲在线视频| 老司机一区二区| 欧美人与牲禽动交com | av成人资源| 福利视频免费在线观看| 欧美xxx久久| 天堂久久一区二区三区| 欧美精品电影| 国内精品一区二区| 日本道精品一区二区三区| 天天综合网网欲色| 水莓100在线视频| 亚洲自拍高清视频网站| 亚洲va天堂va国产va久| 久久麻豆精品| 九一国产在线| 久久精品99| 欧美一区二区黄| 日日夜夜精品视频免费| 看黄网站在线| 欧美日韩国产一二| 亚洲国产精品字幕| 国产麻豆欧美日韩一区| 免费日韩成人| 五月综合网站| 国产成+人+综合+亚洲欧洲| 精品国产福利在线| 国产一区白浆| 日韩电影av| 国产wwwxx| 国产精品视频自在线| 日韩欧美亚洲综合| 久久aⅴ乱码一区二区三区| av资源在线播放| 欧美黑人经典片免费观看| 韩国三级日本三级少妇99| 午夜精品久久久久影视| 亚洲欧美高清| 色婷婷综合久久久中字幕精品久久| 亚洲 高清 成人 动漫| 日本国产一区二区三区| 欧美亚洲国产怡红院影院| 久久国产精品99精品国产| 精品麻豆剧传媒av国产九九九| av免费播放| 久久亚洲午夜电影| 中文字幕亚洲无线码a| 夜夜精品视频一区二区| 国产亚洲综合精品| 日韩美香港a一级毛片| 性史性dvd影片农村毛片| 裸模一区二区三区免费| 中文字幕亚洲欧美在线| 亚洲午夜在线视频| 久久一区视频| 麻豆久久一区| 五丁香在线视频| 日韩 欧美 自拍| 91av视频在线观看| 欧美精品久久天天躁| 国产盗摄一区二区三区| 色婷婷精品视频| 性欧美猛交videos| 国产精品视频中文字幕| 麻豆精品视频| 午夜精品理论片| 日韩欧美国产精品| 亚洲精品成人在线| 国产一区啦啦啦在线观看|