iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 10
3
Modern Web

PixiJS,方便好用的 WebGL 內容產生工具系列 第 10

[PixiJS - Day-10] Ticker 與 動態製作

  • 分享至 

  • xImage
  •  

回顧 PixiJS 在建立後會產生的幾個成員:

  • loader
  • renderer
  • stage
  • ticker
  • view

本篇會前半會提到 ticker

PIXI.ticker.Ticker:
通常在製作隨著時間更新畫面的網頁時,以往會使用setIntervalsetTimeoutrequestAnimationFrame等方式
目前版本的 PixiJS 在建立實體時產生了一個 PIXI.ticker.Ticker實體,可將更新的程式碼放在 ticker 的監聽裡

先前版本的 PIXI 使用 requestAnimationFrame 更新程式


基本範例 中能看到對 ticker 的操作:

16 // Listen for animate update
17 app.ticker.add(function(delta) {
18     // just for fun, let's rotate mr rabbit a little
19     // delta is 1 if running at 100% performance
20     // creates frame-independent tranformation
21     bunny.rotation += 0.1 * delta;
22 });

由於 canvas 與 WebGL 需要隨著時間更新畫面,
以往會使用這類型的程式碼:

animate();
function animate() {
    requestAnimationFrame(animate); // 無限執行 animate();
    renderer.render(stage); // 重繪場景
}

基本範例中沒有提到 renderer 的更新,主要是 app.ticker 處裡掉了

所以若是沒有需要隨著時間更新的程式時,可以不用操作 app.ticker
例如:官網的拖曳範例 Dragging - PixiJS Examples
alt

我在實作合圖上傳的功能時,就沒有操作 app.ticker
alt
後續文章會介紹這個例子

有興趣的話可以玩玩看 app.ticker 的方法:

app.ticker.stop();

就會發現 app 不會動,因為 app 用來更新畫面的 ticker 停止了


列舉一些從官方列出來的 PIXI.ticker.Ticker 的方法:
started: 檢查 ticker 是否在運作;
另外還有
addaddOnceFPSminFPSspeedstartstopupdate
可看出PIXI.ticker.Ticker類別可控制的項目

由於我比較少使用 PIXI.ticker.Ticker 類別,完整 PIXI.ticker.Ticker 的說明,可參考 官網說明 ,可控制項目會比使用 requestAnimationFrame 要多


使用 PixiJS 製作動態:
由於 PixiJS 隨著時間更新畫面,
最基本控制動態的方法是將屬性變化寫在 app.ticker 的呼叫裡,
回到剛剛的 基本範例
alt
兔子的旋轉角度會隨著時間累加

16 // Listen for animate update
17 app.ticker.add(function(delta) {
18     // just for fun, let's rotate mr rabbit a little
19     // delta is 1 if running at 100% performance
20     // creates frame-independent tranformation
21     bunny.rotation += 0.1 * delta; // 每次 ticker 更新時,兔子的旋轉角度也增加一點
22 });

另外提一個簡單與令人懷念的演算法:
兔子會跟著滑鼠的游標移動
CodePen
alt
(因為是錄製轉 gif ,畫面會有延遲的情形)

程式碼:

app.ticker.add(function(delta) {
    // 目前滑鼠的 x 座標
    var mouseX = app.renderer.plugins.interaction.mouse.global.x;
    // 目前滑鼠的 y 座標
    var mouseY = app.renderer.plugins.interaction.mouse.global.y;

    // 跟隨座標的演算法
    bunny.x += (mouseX - bunny.x) * 0.0625;
    bunny.y += (mouseY - bunny.y) * 0.0625;
});

在製作較複雜的動畫時,我會使用 GreenSock 的 GSAP
由於 GSAP Tween 的是物件的值,使用上很直接
示意 Gif:
alt
程式碼:

TweenMax.to(bunny, 2, {
	repeat: -1, // 重複無限次
	yoyo: true, // 會倒回到原始位置
	x: Math.random() * app.renderer.width, // 兔子移動到場景上隨機 x 座標
	y: Math.random() * app.renderer.height, // 兔子移動到場景上隨機 y 座標
	ease: Strong.easeInOut // ease 方式
});

很多時候須處理的動態不只有一段,我會使用 GreenSock 的 timelineLitetimelineMax

由於是佇列的概念,我在學習的時候有遇到一些瓶頸
卡了一圈後,我覺得學習的最佳實踐就是 timelineMax 官網上的範例
alt

系列文章不會做太多動態說明,有興趣的話再參考 GSAP 的官網與教學了


萬花筒例子有應用到GSAP,會在後續的文章說明


上一篇
[PixiJS - Day-09] 遮罩
下一篇
[PixiJS - Day-11] PIXI.Text 與 PIXI.TextStyle
系列文
PixiJS,方便好用的 WebGL 內容產生工具31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言