Cocos Creator 訪問節點和組件(摘自官方文檔)

來源:互聯網
上載者:User

轉自:http://blog.csdn.net/alpha_xiao/article/details/52102044

你可以在 屬性偵測器 裡修改節點和組件,也能在指令碼中動態修改。動態修改的好處是能夠在一段時間內連續地修改屬性、過渡屬性,實現漸層效果。指令碼還能夠響應玩家輸入,能夠修改、建立和銷毀節點或組件,實現各種各樣的遊戲邏輯。要實現這些效果,你需要先在指令碼中獲得你要修改的節點或組件。

在本篇教程,我們將介紹如何 獲得組件所在的節點 獲得其它組件 使用 屬性偵測器 設定節點和組件 尋找子節點 全域節點尋找 訪問已有變數裡的值
獲得組件所在的節點

獲得組件所在的節點很簡單,只要在組件方法裡訪問 this.node 變數:

    start: function () {        var node = this.node;        node.x = 100;    }
獲得其它組件

你會經常需要獲得同一個節點上的其它組件,這就要用到 getComponent 這個 API,它會幫你尋找你要的組件。

    start: function () {        var label = this.getComponent(cc.Label);        var text = this.name + ' started';        // Change the text in Label Component        label.string = text;    }

你也可以為 getComponent 傳入一個類名。對使用者定義的組件而言,類名就是指令碼的檔案名稱,並且區分大小寫。例如 "SinRotate.js" 裡聲明的組件,類名就是 "SinRotate"。

    var label = this.getComponent("cc.Label");

在節點上也有一個 getComponent 方法,它們的作用是一樣的:

    start: function () {        cc.log( this.node.getComponent(cc.Label) === this.getComponent(cc.Label) );  // true    }

如果在節點上找不到你要的組件,getComponent 將返回 null,如果你嘗試訪問 null 的值,將會在運行時拋出 "TypeError" 這個錯誤。因此如果你不確定組件是否存在,請記得判斷一下:

    start: function () {        var label = this.getComponent(cc.Label);        if (label) {            label.string = "Hello";        }        else {            cc.error("Something wrong?");        }    }
獲得其它節點及其組件

僅僅能訪問節點自己的組件通常是不夠的,指令碼通常還需要進行多個節點之間的互動。例如,一門自動瞄準玩家的大炮,就需要不斷擷取玩家的最新位置。Cocos Creator 提供了一些不同的方法來獲得其它節點或組件。 利用屬性偵測器設定節點

最直接的方式就是在 屬性偵測器 中設定你需要的對象。以節點為例,這隻需要在指令碼中聲明一個 type 為 cc.Node 的屬性:

// Cannon.jscc.Class({    extends: cc.Component,    properties: {        // 聲明 player 屬性        player: {            default: null,            type: cc.Node        }    }});

這段代碼在 properties 裡面聲明了一個 player 屬性,預設值為 null,並且指定它的物件類型為 cc.Node。這就相當於在其它語言裡聲明了 public cc.Node player = null;。指令碼編譯之後,這個組件在 屬性偵測器 中看起來是這樣的:

接著你就可以將層級管理器上的任意一個節點拖到這個 Player 控制項:

這樣一來它的 player 屬性就會被設定成功,你可以直接在指令碼裡訪問 player:

// Cannon.jsvar Player = require("Player");cc.Class({    extends: cc.Component,    properties: {        // 聲明 player 屬性        player: {            default: null,            type: cc.Node        }    },    start: function () {        var playerComp = this.player.getComponent(Player);        this.checkPlayer(playerComp);    },    // ...});
利用屬性偵測器設定組件

在上面的例子中,如果你將屬性的 type 聲明為 Player 組件,當你拖動節點 "Player Node" 到 屬性偵測器,player 屬性就會被設定為這個節點裡面的 Player 組件。這樣你就不需要再自己調用 getComponent 啦。

// Cannon.jsvar Player = require("Player");cc.Class({    extends: cc.Component,    properties: {        // 聲明 player 屬性,這次直接是組件類型        player: {            default: null,            type: Player        }    },    start: function () {        var playerComp = this.player;        this.checkPlayer(playerComp);    },    // ...});

你還可以將屬性的預設值由 null 改為數組[],這樣你就能在 屬性偵測器 中同時設定多個對象。
不過如果需要在運行時動態擷取其它對象,還需要用到下面介紹的尋找方法。 尋找子節點

有時候,遊戲情境中會有很多個相同類型的對象,像是炮塔、敵人和特效,它們通常都有一個全域的指令碼來統一管理。如果用 屬性偵測器 來一個一個將它們關聯到這個指令碼上,那工作就會很繁瑣。為了更好地統一管理這些對象,我們可以把它們放到一個統一的父物體下,然後通過父物體來獲得所有的子物體:

// CannonManager.jscc.Class({    extends: cc.Component,    start: function () {        this.cannons = [];        this.cannons = this.node.getChildren();    }});

這裡的 getChildren 是 cc.Node 原有的一個 API,可以獲得一個包含所有子節點的數組。

你還可以使用 getChildByName:

this.node.getChildByName("Cannon 01");

如果子節點的層次較深,你還可以使用 cc.find,cc.find 將根據傳入的路徑進行逐級尋找:

cc.find("Cannon 01/Barrel/SFX", this.node);
全域名字尋找

當 cc.find 只傳入第一個參數時,將從情境根節點開始逐級尋找:

this.backNode = cc.find("Canvas/Menu/Back");
訪問已有變數裡的值

如果你已經在一個地方儲存了節點或組件的引用,你也可以直接存取它們,一般有兩種方式:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.