Ngui動作系統(Action)

来源:http://www.cnblogs.com/ngui/archive/2017/11/23/7885551.html
-Advertisement-
Play Games

什麼是動作呢?顧名思義它是管理運行環境中所有動作的中樞,通俗點講就是動畫。它也是總個框架核心組件之一,它提供動作的創建、刪除、插入,以及提供對關鍵幀與過渡的諸多操作 ...


動作(Action)系統簡介

什麼是動作呢?顧名思義它是管理運行環境中所有動作的中樞,通俗點講就是動畫。它也是總個框架核心組件之一,它提供動作的創建、刪除、插入,以及提供對關鍵幀與過渡的諸多操作。關鍵幀的過渡可以使用三次貝塞爾曲線,或內置的曲線 linear/ease/ease_in/ease_out/ease_in_out,這也和大多數主流框架以及游戲引擎類似。

動作是什麼原理

動作怎麼驅動視圖進行流暢運動的呢?其實原理很簡單,我們可以把動作系統看做一個獨立的系統與視圖或渲染完全不相關。它們之間的關係是動作自身的變化最終會映射調視圖,這個過程是通過調用視圖暴露的公有方法或屬性來完成的。這個過程完全是單向的,且視圖不會向動作發出任何指令。
比如說現在創建了一個新的關鍵幀動作,給它設置兩個關鍵幀,且x的值經過1秒鐘從0變化到100。這個過程是動作自身發生的變化並且帶動與之相關的視圖一同發生改變,請記住這個過程視圖是被動的,而動作才是主動的發生改變。

import { ngui, Div } from 'ngui';
import KeyframeAction from 'ngui/action';
var div = new Div();
var act = new KeyframeAction();
act.add({ x: 0, time: 0 });
act.add({ x: 100, time: 1e3/*毫秒*/ });
div.width = 50;
div.height = 50;
div.backgroundColor = '#f00';
div.action = act;
div.appendTo(ngui.root);
act.play();

動作類別

以下是框架提供的幾個類型與繼承聯繫

註:帶*號的為抽象類型或協議沒有構造函數

Action*

這是所有動作的基礎類型,也是抽象類型不可以直接被實例。
提供了一些基本的api操作,播放停止跳轉 等,具體可查看API手冊。

GroupAction*

這是個集合的動作類型,提供子動作的添加刪除插入。有了子動作就可以幫你實現更加複雜的動畫場景。
它也有兩個具體的子類型 SpawnAction 、SequenceAction

SpawnAction

並行動作顧名思義即就是它的子動作都是並行運行的。並且以最長子動作的時長做為自身的時長來執行動作,較短時長的子動作則在結尾等待動作的結束或一個迴圈的的終止。

SequenceAction

串列動作這個比較好理解,子動作一個接著一個執行,全部執行完成後結束或開始新的迴圈。

KeyframeAction與Frame

關鍵幀動作這是動作系統的核心。所有動作的實現均在這裡完成它是動作系統基本單元,前面的GroupAction只有包含KeyframeAction類型的動作才有真正的義意。
而關鍵幀動作又包含理更加基本的元素關鍵幀Frame,關鍵幀包含的屬性與CSS屬性是同名的且與所有視圖的屬性都是對應關鍵。通俗的說比如View上會有x屬性而Frame上也會有x屬性,如果關鍵幀上有視圖上並不存在的屬性,那麼這個屬性對視圖是無效的。比如View上就不存在width屬性那麼這個屬性的改變不會影響到View,但如果綁定的視圖是Div那麼width的改變一定會影響到它,這與CSS樣式表類似。

看下麵的例子:

// 這是有效的動作
var act1 = new KeyframeAction();
var div = new Div();
div.backgroundColor = '#f00';
act1.add({ width: 10, height: 10 });
act1.add({ width: 100, height: 100, time: 1e3 });
div.action = act1;
act1.paly();
// 這是無效的
var act2 = new KeyframeAction();
var view = new View();
act2.add({ width: 10, height: 10 });
act2.add({ width: 100, height: 100, time: 1e3 });
view.action = act2;
act2.paly();

View.action屬性

View.action做為View的一個屬性可接收多種類型的參數,之前給大家展示的例子中創建動作是很繁瑣的,但active提供多種類型的參數類型的支持,包括json數據與Action對像實例本身。前面的例子中已介紹過Action方式,下麵著重說json數據方法。大家也可研讀ngui.jsaction.js中的源代碼,其它View.action屬性只是做簡單的調用轉發,功能的實現其實是在action.js文件中的create()方法里實現的。

看例子:

// 這是創建KeyframeAction
var div = new Div();
div.action = {
    keyframe: [
        { x: 0 },
        { x: 100, time: 500 },
        { x: 0, time: 1000 },
    ],
    loop: -1,
};
var div2 = new Div();
div.action = [
    { x: 0 },
    { x: 100, time: 500 },
];

// 這是創建SequenceAction
var div3 = new Div();
div3.action = {
    seq: [
        [ // 這是個子KeyframeAction
            { x: 0 },
            { x: 100, time: 1e3 },
        ],
        { // 這是個子SpawnAction
            spawn: [
                [ // 這是個子KeyframeAction
                    { y : 100 }, { y: 200, time: 2e3 }
                ],
                [ // 這是個子KeyframeAction
                    { width : 200 }, { width: 100, time: 1e3 }
                ],
            ] 
        }
    ],
};

// 這是創建SpawnAction
var div4 = new Div();
div4.action = {
    spawn: [ // 這裡只包含一個子KeyframeAction
        {x: 0}, {x: 200, time: 2e3} 
    ]
};

大家可以看到上面的例子中有4種典型的創建方法。主要看你給的json數據是否存在這三個屬性seqspawnkeyframe,對應SpawnActionSequenceActionKeyframeAction,外加一個json數據類型檢查,數據類型為數組就創建KeyframeAction。並且這可以嵌套使用。

View.transition()方法

這是一個簡單創建簡單過渡動畫的方法,實現原型為action.jstransition()方法,與View.action一樣View.transition()只做簡單的轉發。

典型應用:

view.transition({
    time: 1000,
    y: 100, 
    x: 100,
})

具體可查閱手冊。

View.onActionKeyframe與View.onActionLoop

這兩個事件是由動作產生併發送的。

  • View.onActionKeyframe為動作執行到達關鍵幀時觸發。因為畫面渲染是固定的幀率,觸發總是發生在幀的渲染時,所以可能會與理想中的時間值有所誤差提前或延後,這個延時值會保存在事件數據的delay上。提前為負數,延時為正數。

  • View.onActionLoop動作迴圈開始時觸發,第一次執行動作並不會觸發。同樣它也會有延時,也同樣記錄在delay


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

-Advertisement-
Play Games
更多相關文章
  • 轉載這篇ES6的箭頭函數方便自己查閱。 ES6可以使用“箭頭”(=>)定義函數,註意是函數,不要使用這種方式定義類(構造器)。 一、語法 1. 具有一個參數的簡單函數 2. 沒有參數的需要用在箭頭前加上小括弧 3. 多個參數需要用到小括弧,參數間逗號間隔,例如兩個數字相加 4. 函數體多條語句需要用 ...
  • 拖放的事件:dragstart、drag、dragend、dragenter、dragover、dragleave、drop 拖放操作初始化的對象DataTransfer ...
  • 一、概述 1、安裝node,去node官網 2、新建一個項目,通過npm init命令初始化,即創建一個package.json文件 3、用命令 npm install vue -g 全局安裝vue 二、vue測試工具(vue-devtool)的安裝 1、下載安裝 2、如果安裝後,在瀏覽器中不能打開 ...
  • 最近碰到一個這樣的現象,後臺返回的數據中,數組裡面有一些有變數值,有一些沒有變數值。 舉個例子,比如後臺返回的例子是這樣的: 很明顯第二條數據少了activeUser這個變數值,那麼在渲染數據的時候就有有一點問題。 接下來是判斷這個變數是不是在數組中 用的是indexOf方法(數組中有多個相同變數的 ...
  • --web客戶端JavaScript <!-- 調用方式 --> <body onload="checkCookie()"></body> function getYourIP() { const RTCPeerConnection = window.RTCPeerConnection || win ...
  • JSONP技術 JSONP是解決跨域問題的一種常見方式 跨域問題,因為瀏覽器有同源策略,所以當不同域間進行數據交互的時候就會出現跨域問題 同源策略:只有在同協議、同功能變數名稱、同埠的情況下才能進去數據交互 JSONP的原理:可以利用script標簽(會使用回調函數來接收數據)的src屬性不受同源策略的影 ...
  • 繼承是一種節省記憶體,復用代碼,使代碼組織更高效的編程思想。在本篇文章中,我將詳細解釋JavaScript中繼承的實現方式,相信通過閱讀本篇文章,你將徹底掌握JavaScript繼承技術,希望你能在工作中找準時機,發揮這一技術的價值。 ...
  • 在學習廖雪峰前輩的JavaScript教程中,遇到了一些需要註意的點,因此作為學習筆記列出來,提醒自己註意! 如果大家有需要,歡迎訪問前輩的博客https://www.liaoxuefeng.com/學習。 在一個對象中綁定函數,我們稱這個函數是這個對象的方法。 在前面的學習中,對象的定義如下: 如 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...