1. 程式人生 > >Cocos Creator 模組化指令碼(摘自官方文件)

Cocos Creator 模組化指令碼(摘自官方文件)

模組化指令碼

Cocos Creator 允許你將程式碼拆分成多個指令碼檔案,並且讓它們相互呼叫。要實現這點,你需要了解如何在 Cocos Creator 中定義和使用模組,這個步驟簡稱為模組化

如果你還不確定模組化究竟能做什麼,模組化相當於:

  • C/C++ 中的 include
  • C# 中的 using
  • Java 和 Python 中的 import
  • HTML 中的 <link>

模組化使你可以在 Cocos Creator 中引用其它指令碼檔案:

  • 訪問其它檔案匯出的引數
  • 呼叫其它檔案匯出的方法
  • 使用其它檔案匯出的型別
  • 使用或繼承其它 Component

Cocos Creator 中的 JavaScript 使用和 Node.js 幾乎相同的 CommonJS 標準來實現模組化,簡單來說:

  • 每一個單獨的指令碼檔案就構成一個模組
  • 每個模組都是一個單獨的作用域
  • 同步的 require 方法來引用其它模組
  • 設定 module.exports 為匯出的變數

如果你還不太明白,沒關係,下面會詳細講解。

在本文中,“模組”和“指令碼”這兩個術語是等價的。所有“備註”都屬於進階內容,一開始不需要了解。
不論模組如何定義,所有使用者程式碼最終會由 Cocos Creator 編譯為原生的 JavaScript,可直接在瀏覽器中執行。

引用模組

require

除了 Cocos Creator 提供的介面,所有使用者定義的模組都需要呼叫 require 來訪問。例如我們有一個元件定義在 Rotate.js

// Rotate.js

cc.Class({
   extends: cc.Component,
   // ...
});

現在要在別的腳本里訪問它,可以:

var Rotate = require("Rotate");

require 返回的就是被模組匯出的物件,通常我們都會將結果立即存到一個變數(var Rotate)。傳入 require 的字串就是模組的檔名,這個名字不包含路徑也不包含字尾,而且大小寫敏感。

require 完整範例

接著我們就可以使用 Rotate 派生一個子類,新建一個指令碼 SinRotate.js

// SinRotate.js

var Rotate = require
("Rotate"); var SinRotate = cc.Class({ extends: Rotate, update: function (dt) { this.rotation += this.speed * Math.sin(dt); } });

這裡我們定義了一個新的元件叫 SinRotate,它繼承自 Rotate,並對 update 方法進行了重寫。

同樣的這個元件也可以被其它指令碼接著訪問,只要用 require("SinRotate")

備註:

  • require 可以在指令碼的任何地方任意時刻進行呼叫。
  • 遊戲開始時會自動 require 所有指令碼,這時每個模組內部定義的程式碼就會被執行一次,所以之後無論又被 require 幾次,返回的始終是同一份例項。
  • 除錯時,可以隨時在 Developer Tools 的 Console 中 require 專案裡的任意模組。

定義模組

定義元件

每一個單獨的指令碼檔案就是一個模組,例如前面新建的指令碼 Rotate.js

// Rotate.js

var Rotate = cc.Class({
    extends: cc.Component,
    properties: {
        speed: 1
    },
    update: function () {
        this.transform.rotation += this.speed;
    }
});

當你在指令碼中聲明瞭一個元件,Cocos Creator 會預設把它匯出,其它指令碼直接 require 這個模組就能使用這個元件。

定義普通 JavaScript 模組

模組裡不單單能定義元件,實際上你可以匯出任意 JavaScript 物件。假設有個指令碼 config.js

// config.js

var cfg = {
    moveSpeed: 10,
    version: "0.15",
    showTutorial: true,

    load: function () {
        // ...
    }
};
cfg.load();

現在如果我們要在其它指令碼中訪問 config 物件:

// player.js

var config = require("config");
cc.log("speed is", config.moveSpeed);

結果會有報錯:"TypeError: Cannot read property 'moveSpeed' of null",這是因為 cfg 沒有被匯出。由於 require 實際上獲取的是目標指令碼內的 module.exports 變數,所以我們還需要在 config.js 的最後設定 module.exports = config

// config.js - v2

var cfg = {
    moveSpeed: 10,
    version: "0.15",
    showTutorial: true,

    load: function () {
        // ...
    }
};
cfg.load();

module.exports = cfg;

這樣 player.js 便能正確輸出:"speed is 10"。

那為什麼定義 Component 時可以不用設定 exports ? 因為 Component 是 Cocos Creator 中的特殊型別,如果一個指令碼定義了 Component 卻沒有宣告 exports,Cocos Creator 會自動將 exports 設定為 Component。

備註:

  • 在 module 上增加的其它變數是不能匯出的,也就是說 exports 不能替換成其它變數名,系統只會讀取 exports 這個變數。

更多示例

匯出變數

  • module.exports 預設是一個空物件({}),可以直接往裡面增加新的欄位。
// foobar.js:

module.exports.foo = function () {
    cc.log("foo");
};
module.exports.bar = function () {
    cc.log("bar");
};
// test.js:

var foobar = require("foobar");
foobar.foo();    // "foo"
foobar.bar();    // "bar"
  • module.exports 的值可以是任意 JavaScript 型別。
// foobar.js:

module.exports = {
    FOO: function () {
        this.type = "foo";
    },
    bar: "bar"
};
// test.js:

var foobar = require("foobar");
var foo = new foobar.FOO();
cc.log(foo.type);      // "foo"
cc.log(foobar.bar);    // "bar"

封裝私有變數

每個指令碼都是一個單獨的作用域,在指令碼內使用 var 定義的區域性變數,將無法被模組外部訪問。我們可以很輕鬆的封裝模組內的私有變數:

// foobar.js:

var dirty = false;
module.exports = {
    setDirty: function () {
        dirty = true;
    },
    isDirty: function () {
        return dirty;
    },
};
// test1.js:

var foo = require("foobar");
cc.log(typeof foo.dirty);        // "undefined"
foo.setDirty();
// test2.js:

var foo = require("foobar");
cc.log(foo.isDirty());           // true

迴圈引用

第三方模組引用

相關推薦

Cocos Creator 模組指令碼(摘自官方)

模組化指令碼 Cocos Creator 允許你將程式碼拆分成多個指令碼檔案,並且讓它們相互呼叫。要實現這點,你需要了解如何在 Cocos Creator 中定義和使用模組,這個步驟簡稱為模組化。 如果你還不確定模組化究竟能做什麼,模組化相當於: C/C++ 中的 i

Cocos Creator 使用物件池(摘自官方)

使用物件池 在執行時進行節點的建立(cc.instantiate)和銷燬(node.destroy)操作是非常耗費效能的,因此我們在比較複雜的場景中,通常只有在場景初始化邏輯(onLoad)中才會進行節點的建立,在切換場景時才會進行節點的銷燬。如果製作有大量敵人或子彈需

Cocos Creator 建立和銷燬節點(摘自官方)

建立新節點 除了通過場景編輯器建立節點外,我們也可以在指令碼中動態建立節點。通過 new cc.Node() 並將它加入 到場景中,可以實現整個建立過程。 以下是一個簡單的例子: cc.Class({ extends: cc.Component, prope

Cocos Creator 訪問節點和元件(摘自官方)

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

Cocos Creator 使用 cc.Class 宣告型別(摘自官方)

使用 cc.Class 宣告型別 cc.Class 是一個很常用的 API,用於宣告 Cocos Creator 中的類,為了方便區分,我們把使用 cc.Class 宣告的類叫做CCClass。 定義 CCClass 呼叫 cc.Class,傳入一個原型物件,在原型

Cocos Creator中獲取和載入資源(官方摘錄)

Cocos Creator 有一套統一的資源管理機制 ,在本篇教程,我們將介紹資源的分類如何在 屬性檢查器 裡設定資源動態載入 Asset動態載入 Raw Asset資源的分類目前的資源分成兩種,一種叫做 Asset,一種叫做 Raw Asset。AssetCreator 提

官方: Dubbo 框架設計、模組說明、依賴關係

  以下內容全文轉自 apache 官方 dubbo文件:http://dubbo.apache.org/en-us/docs/dev/design.html   框架設計   圖片描述: 淺藍色背景的左側區域顯示服務使用者介面,淺綠

pymssql模組官方的翻譯

譯者注:譯者部落格(http://blog.csdn.net/lin_strong),轉載請保留這條。此為pymssql模組version2.1.4官方文件的翻譯,僅供學習交流使用,請勿用於商業用途。 模組級符號 pymssql.version Unicode

《JDK10新特性官方》JEP307: G1 Full GC的並行

作者: Stefan Johansson 建立時間:2017/01/17 11:40 更新時間:2018/03/29 07:39 型別: 特性 狀態: 已關閉/已提交 元件:hotspot/gc 範圍:實現類 討論: openjdk.java.net上的hotspot-gc-dev 影響:M

Apache Storm 官方 —— 序列

原文連結    譯者:魏勇 本文闡述了 Storm 0.6.0 以上版本的序列化機制。在低於 0.6.0 版本的 Storm 中使用了另一種序列化系統,詳細資訊可以參考 Serialization (prior to 0.6.0) 一文。 Storm 中的 tuple 可以包含任何型別的物件

爬蟲筆記之BeautifulSoup模組官方筆記

                            爬蟲筆記之BeautifulSoup模組官方文件筆記 文章開始把我喜歡的這句話送個大家:這個世界上還

MyBatis 註解(摘自MyBatis官方

註解 目標 相對應的 XML 描述 @CacheNamespace 類 <cache> 為給定的名稱空間 (比如類) 配置快取。  屬性:implemetation,evictio

Cocos Creator初探--Script指令碼生命週期詳解

介紹: 對於從Unity3D轉過來的開發者來說,cocos creator的元件式指令碼應該會很容易上手,以下是cocos creator指令碼生命週期流程圖。 onLoad() 元件指令碼的初始化階段觸發該回調,類似與Unity的Awake onE

Spring Boot官方筆記--PartIV: Spring Boot特性

23. SpringApplication特性 Banner SpringApplicationBuilder Events and Listeners Web Environment ApplicationArguments: 獲取SpringApplication.run(...)

spring 官方的介面理解整理(四)型別轉換spring例項解析

上篇文章解析了spring型別轉換的介面和他們的分工,怎麼通過設計模式實現轉換功能。 這篇需要些上篇的知識,如果沒有看可以從這兒跳轉spring 官方文件的介面理解整理(三)型別轉換 一、準備新建Maven專案,pom.xml內容如下 <properties>

spring 官方的介面理解整理(三)型別轉換

所有相關介面的uml圖: 一、spring中型別轉換裡面我開始看的時候覺得converter和formatter的功能很多疑問,先來分析這兩個介面:  1、Converter.java package org.springframework.core.convert.

OpenCV-Python官方三——在OpenCV中繪製函式

在OpenCV中繪製函式 目標 · 學習使用OpenCV繪製不同的幾何形狀 · 您將學習以下函式:cv2.line(),cv2.circle(),cv2.rectangle(),cv2.ellipse(),cv2.putText()等。 程式碼  &nbs

OpenCV-Python 官方

開始使用視訊 目標 學習讀取視訊,顯示視訊並且儲存視訊。 學會從視訊中捕獲並顯示。 你將會學到這些方法:cv2.VideoCapture() cv2.VideoWriter()  從照相機捕獲視訊 通常,我們必須用相機捕捉實時流。OpenCV

OpenCV-Python 官方學習

影象學習: 目標: 1.在這裡你會學習到如何讀取一個影象,如何取顯示並且儲存它。 2.你將徐匯這些方法:cv2.imread() , cv2.imshow() , cv2.imwrite() ; 3.自然而然的你就學會了如何使用Matplotlib庫去顯示圖片。 OpenCV的使用

TensorFlow官方樣例——三層卷積神經網路訓練MNIST資料

        上篇部落格根據TensorFlow官方文件樣例實現了一個簡單的單層神經網路模型,在訓練10000次左右可以達到92.7%左右的準確率。但如果將神經網路的深度拓展,那麼很容易就能夠達到更高的準確率。官方中文文件中就提供了這樣的樣例,它的網路結構如