摘要:方法的參數(shù)如下名稱默認值描述需要移動的精靈貝塞爾曲線的坐標點的數(shù)組補間需要的幀數(shù),也就是動畫應(yīng)該持續(xù)多長時間緩動類型用于確定精靈是否應(yīng)在補間的起點和終點之間來回移動。
說明
補間動畫指的是,我們可以通過為精靈的位置、比例、透明度,等屬性,設(shè)置開始值和結(jié)束值,制作動畫,動畫中間需要的部分由軟件自動計算填充。
Pixi 沒有內(nèi)置補間引擎,但是你可以使用很多很好的開源的補間庫,比如 Tween.js 和 Dynamic.js 。如果要制作非常專業(yè)的自定義補間效果,可以使用這兩個庫中的其中一個。但是現(xiàn)在我們要使用的是一個名為 Charm.js 的專門用于 Pixi 的補間庫。
使用 Charm 庫要開始使用 Charm ,首先直接用 script 標簽,引入 js 文件
然后創(chuàng)建它的實例
let c = new Charm(PIXI);
變量 c 現(xiàn)在代表 Charm 實例。
和前面的文章中講到的粒子效果一樣,在調(diào)用 state 函數(shù)之后,必須為游戲循環(huán)中的每個幀更新補間。就是在游戲循環(huán)中調(diào)用 Charm 的 update 方法,如下所示:
function gameLoop() { requestAnimationFrame(gameLoop); state(); c.update(); renderer.render(stage); }滑動補間
Charm 最有用的補間效果之一是 slide 。使用 slide 方法可以使精靈從畫布上的當(dāng)前位置平滑移動到任何其他位置。slide 方法有七個參數(shù),但只有前三個參數(shù)是必需的。
名稱 | 默認值 | 描述 |
---|---|---|
anySprite | 需要移動的精靈 | |
finalXPosition | 滑動結(jié)束時 x 坐標 | |
finalYPosition | 滑動結(jié)束時 y 坐標 | |
durationInFrames | 60 | 補間需要的幀數(shù),也就是動畫應(yīng)該持續(xù)多長時間 |
easingType | "smoothstep" | 緩動類型 |
yoyo | false | 用于確定精靈是否應(yīng)在補間的起點和終點之間來回移動。 |
delayTimeBeforeRepeat | 0 | 一個以毫秒為單位的數(shù)字,用于確定精靈 yoyo 之前的延遲時間。 |
示例:
以下是如何使用 slide 方法使精靈用120幀從原始位置移動到坐標為(128,128)的位置的關(guān)鍵代碼。
c.slide(sprite, 128, 128, 120);
效果圖:
查看示例
如果你想讓精靈在起點和終點之間來回移動,請將 yoyo(第六個參數(shù))設(shè)置為 true,代碼如下所示:
c.slide(sprite, 128, 128, 120, "smoothstep", true);
查看示例
補間對象Charm 所有的補間方法都返回一個補間對象,你可以這樣創(chuàng)建:
let slidePixie = c.slide(sprite, 80, 128, 120, "smoothstep",true);
slidePixie 就是補間對象,它包含一些有用的屬性和方法,可以用于控制補間。
其中一個是 onComplete 方法,它將在補間完成后立即運行。以下代碼是精靈到達終點時如何使用 onComplete 方法在控制臺中顯示消息。
let slidePixie = c.slide(sprite, 80, 128, 120, "smoothstep",true); slidePixie.onComplete = () => console.log("一次滑動完成");
如果將 yoyo (slide 方法的第六個參數(shù))設(shè)置為 true,則每當(dāng)精靈到達其起點和終點時,onComplete 方法都將運行。
補間還有 pause 和 play 方法,可以停止和開始補間。
slidePixie.pause(); slidePixie.play();
補間對象還具有 playing 屬性,如果補間當(dāng)前正在播放,則該屬性值為 true。只不過有些補間方法返回的對象中直接有 playing 屬性,有些補間方法返回的對象中的 playing 屬性是在一個叫 tweens 的數(shù)組中, tweens 數(shù)組中包括了這個補間方法創(chuàng)建的所有補間對象。
以 slide 方法為例,完成一個滑動需要創(chuàng)建 x 軸補間對象和 y 軸補間對象,這兩個對象都放在了 tweens 數(shù)組中,這兩個對象也都分別有 playing 屬性。
查看示例
所有 Charm 的補間方法都返回你可以控制和訪問的補間對象。
設(shè)置緩動類型slide 方法的第四個參數(shù)是 easingType 。它是一個字符串,用于確定補間加速和減速的類型。這些類型共有15種可供選擇,并且它們對于 Charm 的所有不同補間方法都是相同的。某些類型對應(yīng)的會有一個基本類型,一個 squared 類型和一個cubed 類型。squared 類型和 cubed 類型只是將基本類型的效果放大而已。大多數(shù) Charm 的補間效果的默認緩動類型是 smoothstep。
Linear:
linear,精靈從開始到停止保持勻速運動。
Smoothstep:
smoothstep,smoothstepSquared,smoothstepCubed。加速精靈并以非常自然的方式減慢速度
Acceleration:
acceleration, accelerationCubed。逐漸加速精靈并突然停止。
如果要更加平滑的加速效果,請使用 sine,sineSquared 或 sineCubed。
Deceleration:
deceleration,decelerationCubed。突然加速精靈并逐漸減慢它。要獲得更加平滑的減速效果,請使用inverseSine,inverseSineSquared或inverseSineCubed。
Bounce:
bounce 10 -10 ,這將使精靈到達起點和終點時略微反彈,更改乘數(shù)10和 -10,可以改變效果。
查看示例
使用 slide 進行場景過渡你在游戲或應(yīng)用程序中肯定要做的一件事就是讓場景過渡,然后將新場景滑入視圖。它可能是你游戲的標題滑動以顯示游戲的第一級,或者可能是一個菜單,可以滑動以顯示更多的應(yīng)用程序內(nèi)容。你可以使用 slide 方法執(zhí)行此操作。
首先,創(chuàng)建兩個容器對象:sceneOne 和 sceneTwo,并將它們添加到舞臺上。
sceneOne = new Container(); sceneTwo = new Container(); stage.addChild(sceneOne); stage.addChild(sceneTwo);
接下來,為每個場景創(chuàng)建精靈。制作一個像畫布一樣大的藍色矩形; 并在矩形中間添加上 Scene One 的文字,將兩者都添加到 sceneOne 容器中。再制作一個像畫布一樣大的紅色矩形;并在矩形中間添加上Scene Two 的文字,將這兩者添加到 sceneTwo 容器中。你最終得到的兩個容器對象,如下圖所示。
以下是關(guān)鍵代碼:
//1. Scene one sprites: //畫藍色矩形 let blueRectangle = new PIXI.Graphics(); blueRectangle.beginFill(0x014ACA); blueRectangle.drawRect(0, 0, canvasWith, canvasHeight); blueRectangle.endFill(); sceneOne.addChild(blueRectangle); //添加文字,并在容器中居中 let sceneOneText = new PIXI.Text("Scene One"); sceneOneText.style = { fill: "#fff", fontSize: "40px" }; let sceneOneTextX = (canvasWith - sceneOneText.width) / 2; let sceneOneTextY = (canvasWith - sceneOneText.height) / 2; sceneOneText.position.set(sceneOneTextX, sceneOneTextY); sceneOne.addChild(sceneOneText); //2. Scene two sprites: //畫紅色矩形 let redRectangle = new PIXI.Graphics(); redRectangle.beginFill(0xEF4631); redRectangle.drawRect(0, 0, canvasWith, canvasHeight); redRectangle.endFill(); sceneTwo.addChild(redRectangle); //添加文字,并在容器中居中 let sceneTwoText = new PIXI.Text("Scene Two"); sceneTwoText.style = { fill: "#fff", fontSize: "40px" }; let sceneTwoTextX = (canvasWith - sceneTwoText.width) / 2; let sceneTwoTextY = (canvasHeight - sceneTwoText.height) / 2; sceneTwoText.position.set(sceneTwoTextX, sceneTwoTextY); sceneTwo.addChild(sceneTwoText);
在一個真實的項目中,你可以為每個容器填充每個場景所需的精靈數(shù)量,你也可以為你的項目添加盡可能多的場景容器。
接下來,將 sceneTwo 移開,使其位于畫布的右邊緣之外。代碼如下所示:
sceneTwo.x = canvasWith;
這將在畫布上顯示 sceneOne,而 sceneTwo 在需要時會從左側(cè)滑出,如下所示。
sceneTwo 就在屏幕外等著。
最后,使用 slide 方法從 sceneOne 過渡到 sceneTwo 。只需將 sceneOne 滑動到左側(cè),然后從右側(cè)滑動 sceneTwo ,取代它的位置,代碼如下。
c.slide(sceneTwo, 0, 0); c.slide(sceneOne, -canvasWith, 0);
下圖顯示了這段代碼的效果。
查看示例
時間過渡你可以自定義一個 wait 函數(shù)在設(shè)定的時間間隔后進行過渡。
function wait(duration = 0) { return new Promise((resolve, reject) => { setTimeout(resolve, duration); }); }
要使用 wait,請為其提供一個參數(shù),它代表你希望等待的時間(以毫秒為單位)。以下是在延遲1秒(1000毫秒)后從 sceneOne 過渡到 sceneTwo 的方法。
wait(1000).then(() => { c.slide(sceneTwo, 0, 0); c.slide(sceneOne, -canvasWith, 0); });
查看示例
其實在 Charm 庫中已經(jīng)定義了 wait 這個方法,原理和上面的 wait 函數(shù)是一樣的。你可以這樣使用它。
c.wait(1000).then(() => { c.slide(sceneTwo, 0, 0); c.slide(sceneOne, -canvasWith, 0); });沿貝塞爾曲線移動
如果你還不清楚什么是貝塞爾曲線,可以先看看這篇文章。
slide 方法沿直線為精靈制作動畫,但你也可以使用另一種方法(followCurve)使精靈沿貝塞爾曲線移動。首先,將貝塞爾曲線定義為4個坐標點的二維數(shù)組,如下所示:
let curve = [ [sprite.x, sprite.y], //起始點 [108, 32], //控制點1 [176, 32], //控制點2 [196, 160] //結(jié)束點 ];
followCurve 方法的參數(shù)如下:
名稱 | 默認值 | 描述 |
---|---|---|
anySprite | 需要移動的精靈 | |
curve | 貝塞爾曲線數(shù)組 | |
durationInFrames | 60 | 補間需要的幀數(shù),也就是動畫應(yīng)該持續(xù)多長時間 |
easingType | "smoothstep" | 緩動類型 |
yoyo | false | 用于確定精靈是否應(yīng)在補間的起點和終點之間來回移動。 |
delayTimeBeforeRepeat | 0 | 一個以毫秒為單位的數(shù)字,用于確定精靈 yoyo 之前的延遲時間。 |
接下來,使用 Charm 的 followCurve 方法使精靈跟隨該曲線。(提供 curve 數(shù)組作為第二個參數(shù))
c.followCurve( sprite, //需要移動的精靈 curve, //貝塞爾曲線數(shù)組 120, //持續(xù)時間,以幀為單位 "smoothstep", //緩動類型 true, //yoyo 1000 //yoyo之前的延遲時間 );
效果圖:
如果你需要使精靈的中點沿著曲線移動,還需要設(shè)置精靈的錨點(anchor)居中,如下所示:
sprite.anchor.set(0.5, 0.5);
查看示例
slide 和 followCurve 方法適用于簡單的來回動畫效果,但你也可以結(jié)合它們以使精靈遵循更復(fù)雜的路徑。
沿路徑移動你可以使用 Charm 的 walkPath 方法連接一系列點,并使精靈移動到每個點。該系列中的每個點都稱為 waypoint 。首先,從由坐標點組成的二維數(shù)組定位路徑點開始,這些 waypoint 映射出你希望精靈遵循的路徑。
let waypoints = [ [32, 32], //要移動到的第一個坐標點 [32, 128], //要移動到的第二個坐標點 [300, 128], //要移動到的第三個坐標點 [300, 32], //要移動到的第四個坐標點 [32, 32] //要移動到的第五個坐標點 ];
你可以根據(jù)需要使用任意多的 waypoint。
walkPath 方法的參數(shù)如下:
名稱 | 默認值 | 描述 |
---|---|---|
anySprite | 需要移動的精靈 | |
waypoints | 坐標點的二維數(shù)組 | |
durationInFrames | 60 | 補間需要的幀數(shù),也就是動畫應(yīng)該持續(xù)多長時間 |
easingType | "smoothstep" | 緩動類型 |
loop | false | 用于確定精靈在到達結(jié)尾時是否從頭開始 |
yoyo | false | 用于確定精靈是否應(yīng)在補間的起點和終點之間來回移動。 |
delayBetweenSections | 0 | 一個以毫秒為單位的數(shù)字,用于確定精靈在移動到路徑的下一部分之前應(yīng)該等待的時間。 |
接下來,使用 walkPath 方法使精靈按順序移動到所有這些點。(前兩個參數(shù)是必需的)
c.walkPath( sprite, //需要移動的精靈 waypoints, //坐標點的二維數(shù)組 300, //持續(xù)時間,以幀為單位 "smoothstep", //緩動類型 true, //循環(huán) true, //輪流反向播放動畫 1000 //移動到路徑的下一部分之前應(yīng)該等待的時間 );
效果圖:
查看示例
而使用 walkCurve 方法,可以使精靈遵循一系列連接的貝塞爾曲線。首先,創(chuàng)建任何貝塞爾曲線數(shù)組,描述你希望精靈遵循的路徑。
let curvedWaypoints = [ //第一條曲線 [[sprite.x, sprite.y],[75, 500],[200, 500],[300, 300]], //第二條曲線 [[300, 300],[250, 100],[100, 100],[sprite.x, sprite.y]] ];
每條曲線的四個點與 followCurve 方法中的相同:起始位置,控制點1,控制點2和結(jié)束位置。第一條曲線中的最后一個點應(yīng)與下一條曲線中的第一個點相同。你可以根據(jù)需要使用盡可能多的曲線。
walkCurve 方法的參數(shù)如下:
名稱 | 默認值 | 描述 |
---|---|---|
anySprite | 需要移動的精靈 | |
curvedWaypoints | 貝塞爾曲線的坐標點的數(shù)組 | |
durationInFrames | 60 | 補間需要的幀數(shù),也就是動畫應(yīng)該持續(xù)多長時間 |
easingType | "smoothstep" | 緩動類型 |
yoyo | false | 用于確定精靈是否應(yīng)在補間的起點和終點之間來回移動。 |
delayBeforeContinue | 0 | 一個以毫秒為單位的數(shù)字,用于確定精靈yoyo之前的延遲時間。 |
接下來,提供 curvedWaypoints 數(shù)組作為 walkCurve 方法中的第二個參數(shù),來試試這個方法。
c.walkCurve( sprite, //需要移動的精靈 curvedWaypoints, //貝塞爾曲線的坐標點的數(shù)組 300, //持續(xù)時間,以幀為單位 "smoothstep", //緩動類型 true, //循環(huán) true, //輪流反向播放動畫 1000 //移動到路徑的下一部分之前應(yīng)該等待的時間 );
效果圖:
查看示例
使用 walkPath 和 walkCurve 將為你提供了一個很好的開端,它們可以為游戲制作一些有趣的動畫。
更多補間效果Charm 有許多其他內(nèi)置的補間效果,你會發(fā)現(xiàn)它們在游戲和應(yīng)用程序中有很多用處。下面是其他一些效果的介紹。
fadeOut 和 fadeIn
fadeOut 方法使精靈逐漸變得透明,fadeIn 方法使精靈從透明逐漸顯現(xiàn)。這兩個方法需要的參數(shù)是一樣的。
參數(shù):
名稱 | 默認值 | 描述 |
---|---|---|
anySprite | 需要產(chǎn)生效果的精靈 | |
durationInFrames | 60 | 持續(xù)的幀數(shù) |
示例:
c.fadeOut(anySprite); c.fadeIn(anySprite);
查看示例
pulse
使用 pulse 方法可以使精靈以穩(wěn)定的速率連續(xù)淡入淡出。
參數(shù):
名稱 | 默認值 | 描述 |
---|---|---|
anySprite | 需要產(chǎn)生效果的精靈 | |
durationInFrames | 60 | 淡入淡出應(yīng)該持續(xù)的幀數(shù),也就是持續(xù)時間 |
minAlpha | 0 | 精靈可以減少到的最小的透明度值 |
示例:
c.pulse(anySprite);
查看示例
如果你只希望精靈在再次淡入之前變?yōu)榘胪该鳎垖⒌谌齻€參數(shù)設(shè)置為0.5,如下所示:
c.pulse(anySprite, 60, 0.5);
scale
你可以使用 scale 方法讓精靈產(chǎn)生縮放效果。
參數(shù):
名稱 | 默認值 | 描述 |
---|---|---|
anySprite | 需要產(chǎn)生效果的精靈 | |
endScaleX | 0.5 | x 軸縮放的比例 |
endScaleY | 0.5 | y 軸縮放的比例 |
durationInFrames | 60 | 持續(xù)時間,以幀為單位 |
示例:
c.scale( sprite, //精靈 0.1, //x軸縮放的比例 0.1, //y軸縮放的比例 100 //持續(xù)時間,以幀為單位 );
查看示例
breathe
如果你希望縮放效果來回 yoyo,請使用 breathe 方法。它是一種縮放效果,使精靈看起來好像在呼吸。
參數(shù):
名稱 | 默認值 | 描述 |
---|---|---|
anySprite | 需要產(chǎn)生效果的精靈 | |
endScaleX | 0.5 | x 軸縮放的比例 |
endScaleY | 0.5 | y 軸縮放的比例 |
durationInFrames | 60 | 持續(xù)時間,以幀為單位 |
yoyo | true | 是否輪流反向播放 |
delayBeforeRepeat | 0 | 一個以毫秒為單位的數(shù)字,用于確定精靈 yoyo 之前的延遲時間。 |
示例:
c.breathe( sprite, //精靈 0.1, //x軸縮放的比例 0.1, //y軸縮放的比例 100, //持續(xù)時間,以幀為單位 true, //輪流反向播放 0, //yoyo 之間的延遲時間 );
查看示例
strobe
使用 strobe 方法通過快速改變精靈比例,使精靈看起來像閃光燈一樣閃爍。
參數(shù):
只需要傳入一個精靈作為參數(shù)即可。
示例:
c.strobe(sprite);
查看示例
wobble
使用 wobble 方法可以使精靈像果凍一樣擺動。
參數(shù):
只需要傳入一個精靈作為參數(shù)即可。
示例:
c.wobble(sprite);
查看示例
如果你使用這些縮放補間效果(scale,breathe,strobe,或者 wobble),將精靈的錨點居中,就可以從精靈的中心進行縮放。
sprite.anchor.set(0.5, 0.5);
注意:
目前, Charm 這個庫支持的 Pixi 版本是 3.0.11。如果使用比較高的版本會有一些問題,比如出現(xiàn)這樣的警告。
這是因為 Pixi 版本4.0.0起已棄用 ParticleContainer ,改為使用 particles.ParticleContainer 了。所以要解決這個問題需要把 Charm.js 文件中的 ParticleContainer 改為 particles.ParticleContainer 。
上一篇 學(xué)習(xí) PixiJS — 視覺效果
下一篇 學(xué)習(xí) PixiJS — 碰撞檢測
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/101801.html
摘要:說明小精靈冒險是一書中最后一個案例。在游戲循環(huán)中,通過減小平鋪精靈的值,使其向左移動。如果方法返回,則退出循環(huán),表示小精靈碰撞到柱子了。重置游戲如果小精靈碰撞到柱子,則在秒鐘延遲后重置游戲。 說明 小精靈冒險 是 Learn Pixi.js 一書中最后一個案例。點擊屏幕讓小精靈飛起來,小精靈上升時,會拍打翅膀,并且會有小星星產(chǎn)生。如果她撞到柱子上,她會爆炸成一堆小星星。幫助她通過15個...
摘要:將水平高斯模糊應(yīng)用于對象。下一步是將此值分配給渲染選項的屬性。蛇圖像的寬度為像素,因此大約個片段會產(chǎn)生很好的效果。通過循環(huán)將數(shù)組中的每個按照橢圓形的軌跡移動,形成波浪效果。 平鋪精靈 平鋪精靈是一種特殊的精靈,可以在一定的范圍內(nèi)重復(fù)一個紋理。你可以使用它們創(chuàng)建無限滾動的背景效果。要創(chuàng)建平鋪精靈,需要使用帶有三個參數(shù)的 TilingSprite 類(PIXI.extras.TilingS...
摘要:說明碰撞檢測,用來檢查兩個精靈是否接觸。如果沒有碰撞到返回值就是。示例發(fā)生碰撞時的回調(diào)函數(shù)如果發(fā)生碰撞,顯示哪邊的邊界發(fā)生碰撞邊界左側(cè)發(fā)生碰撞邊界右側(cè)發(fā)生碰撞邊界 說明 碰撞檢測,用來檢查兩個精靈是否接觸。 Pixi 沒有內(nèi)置的碰撞檢測系統(tǒng), 所以這里我們使用一個名為 Bump 的庫,Bump 是一個易于使用的2D碰撞方法的輕量級庫,可與 Pixi 渲染引擎一起使用。它提供了制作大多數(shù)...
摘要:也就是說用這種圖片做出這樣的效果要制作動畫精靈我們需要用到的方法。定義使用紋理數(shù)組創(chuàng)建動畫精靈的方法。返回值返回一個對象,對象會有一些屬性和方法,用于控制動畫精靈。下一篇學(xué)習(xí)精靈狀態(tài) 說明 看完官方教程中提到的這本書 — Learn Pixi.js ,準備寫寫讀后感了,官方教程中所說的內(nèi)容,基本上就是書的前4章,所以我就從第5章開始寫寫吧。 動畫精靈指的是按順序使用一系列略有不同的圖像...
摘要:支持動畫狀態(tài)的,在動畫開始,執(zhí)行中,結(jié)束時提供回調(diào)函數(shù)支持動畫可以自定義貝塞爾曲線任何包含數(shù)值的屬性都可以設(shè)置動畫倉庫文檔演示功能介紹一定程度上,也是一個動畫庫,適用所有的屬性,并且實現(xiàn)的能更方便的實現(xiàn)幀動畫,替代復(fù)雜的定義方式。 動畫調(diào)研-V1 前言:動畫從用途上可以分為兩種,一種是展示型的動畫,類似于一張GIF圖,或者一段視頻,另一種就是交互性的動畫。這兩種都有具體的應(yīng)用場景,比如...
閱讀 1781·2021-11-11 16:55
閱讀 2579·2021-08-27 13:11
閱讀 3641·2019-08-30 15:53
閱讀 2314·2019-08-30 15:44
閱讀 1402·2019-08-30 11:20
閱讀 1049·2019-08-30 10:55
閱讀 953·2019-08-29 18:40
閱讀 3048·2019-08-29 16:13