轉自: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"); 訪問已有變數裡的值
如果你已經在一個地方儲存了節點或組件的引用,你也可以直接存取它們,一般有兩種方式: