Cocos Creator 2.4x 筆記 - 從Unity到Cocos [1]

內(nèi)容基本來(lái)自Copy Paste Cocos Creator 的官網(wǎng)文檔
主要來(lái)自于閱讀的時(shí)候同時(shí)做筆記

CC Class

CCclass 構(gòu)造函數(shù) ctor: function () {}

聲明變量的時(shí)候加上類型,本質(zhì)上是在聲明處填寫構(gòu)造函數(shù),設(shè)置get/set方法
playerNode:cc.Node

節(jié)點(diǎn)訪問(wèn)和常用接口

獲取組件所在的節(jié)點(diǎn)this.node

獲取其他組件
通過(guò)類型 this.getComponent(cc.Label);
通過(guò)類名 var rotate = this.getComponent("SinRotate");

模塊化方法 var Player = require("Player"); 然后 player:{defualt:null , type:Player}

查找子節(jié)點(diǎn)this.node.children
his.node.getChildByName("Cannon 01");
cc.find("Cannon 01/Barrel/SFX", this.node);

全局查找,只有一個(gè)參數(shù)的find
this.backNode = cc.find("Canvas/Menu/Back");

通過(guò)全局變量訪問(wèn)或require模塊化方法來(lái)實(shí)現(xiàn)跨文件操作
var Global = require("Global");

節(jié)點(diǎn)激活 this.node.active = false;

更改父節(jié)點(diǎn) this.node.parent = parentNode;

更改節(jié)點(diǎn)位置
this.node.x = 100;
this.node.setPosition(cc.v2(100, 50));

更改節(jié)點(diǎn)旋轉(zhuǎn)
this.node.rotation = 90;
this.node.setRotation(90);

縮放
this.node.scaleX = 2;this.node.setScale(2);

尺寸
this.node.width = 100;this.node.setContentSize(cc.size(100, 100));

錨點(diǎn)位置
this.node.setAnchorPoint(1, 0);this.node.anchorX = 1;

顏色透明度

在使用 Sprite、Label 這些基本的渲染組件時(shí),要注意修改顏色和不透明度的操作只能在節(jié)點(diǎn)的實(shí)例上進(jìn)行,因?yàn)檫@些渲染組件本身并沒(méi)有設(shè)置顏色和不透明度的接口。)

mySprite.node.color = cc.Color.RED;
mySprite.node.opacity = 128;

cc.Component 是所有組件的基類,任何組件都包括如下的常見(jiàn)接口(該組件的腳本中,以 this 指代本組件):

this.node:該組件所屬的節(jié)點(diǎn)實(shí)例
this.enabled:是否每幀執(zhí)行該組件的 update 方法,同時(shí)也用來(lái)控制渲染組件是否顯示
update(dt):作為組件的成員方法,在組件的 enabled 屬性為 true 時(shí),其中的代碼會(huì)每幀執(zhí)行
onLoad():組件所在節(jié)點(diǎn)進(jìn)行初始化時(shí)(節(jié)點(diǎn)添加到節(jié)點(diǎn)樹(shù)時(shí))執(zhí)行
start():會(huì)在該組件第一次 update 之前執(zhí)行,通常用于需要在所有組件的 onLoad 初始化完畢后執(zhí)行的邏輯

創(chuàng)建節(jié)點(diǎn)
new cc.Node() 并且通過(guò)node.addComponent(cc.Sprite)方式來(lái)進(jìn)行
克隆和根據(jù)Prefab預(yù)制件生成節(jié)點(diǎn) cc.instantiate

銷毀節(jié)點(diǎn) node.destroy() 銷毀節(jié)點(diǎn)并不會(huì)立刻被移除,而是在當(dāng)前幀邏輯更新結(jié)束后,統(tǒng)一執(zhí)行。當(dāng)一個(gè)節(jié)點(diǎn)銷毀后,該節(jié)點(diǎn)就處于無(wú)效狀態(tài),可以通過(guò) cc.isValid 判斷當(dāng)前節(jié)點(diǎn)是否已經(jīng)被銷毀。if (cc.isValid(this.target))

生命周期回調(diào) Lifetime Callback Function | 鏈接

onLoad 組件腳本的初始化階段,我們提供了 onLoad 回調(diào)函數(shù)。onLoad 回調(diào)會(huì)在節(jié)點(diǎn)首次激活時(shí)觸發(fā),比如所在的場(chǎng)景被載入,或者所在節(jié)點(diǎn)被激活的情況下。在 onLoad 階段,保證了你可以獲取到場(chǎng)景中的其他節(jié)點(diǎn),以及節(jié)點(diǎn)關(guān)聯(lián)的資源數(shù)據(jù)。onLoad 總是會(huì)在任何 start 方法調(diào)用前執(zhí)行,這能用于安排腳本的初始化順序。通常我們會(huì)在 onLoad 階段去做一些初始化相關(guān)的操作
start start 回調(diào)函數(shù)會(huì)在組件第一次激活前,也就是第一次執(zhí)行 update 之前觸發(fā)。start 通常用于初始化一些需要經(jīng)常修改的數(shù)據(jù),這些數(shù)據(jù)可能在 update 時(shí)會(huì)發(fā)生改變。
update 游戲開(kāi)發(fā)的一個(gè)關(guān)鍵點(diǎn)是在每一幀渲染前更新物體的行為,狀態(tài)和方位。
lateUpdate update 會(huì)在所有動(dòng)畫(huà)更新前執(zhí)行,但如果我們要在動(dòng)效(如動(dòng)畫(huà)、粒子、物理等)更新之后才進(jìn)行一些額外操作,或者希望在所有組件的 update 都執(zhí)行完之后才進(jìn)行其它操作,那就需要用到 lateUpdate 回調(diào)。

onEnable當(dāng)組件的 enabled 屬性從 false 變?yōu)?true 時(shí),或者所在節(jié)點(diǎn)的 active 屬性從 false 變?yōu)?true 時(shí),會(huì)激活 onEnable 回調(diào)。倘若節(jié)點(diǎn)第一次被創(chuàng)建且 enabled 為 true,則會(huì)在 onLoad 之后,start 之前被調(diào)用。

onDisable 當(dāng)組件的 enabled 屬性從 true 變?yōu)?false 時(shí),或者所在節(jié)點(diǎn)的 active 屬性從 true 變?yōu)?false 時(shí),會(huì)激活 onDisable 回調(diào)。

onDestroy當(dāng)組件或者所在節(jié)點(diǎn)調(diào)用了 destroy(),則會(huì)調(diào)用 onDestroy 回調(diào),并在當(dāng)幀結(jié)束時(shí)統(tǒng)一回收組件。當(dāng)同時(shí)聲明了 onLoadonDestroy 時(shí),它們將總是被成對(duì)調(diào)用。也就是說(shuō)從組件初始化到銷毀的過(guò)程中,它們要么就都會(huì)被調(diào)用,要么就都不會(huì)被調(diào)用。

一個(gè)組件從初始化到激活,再到最終銷毀的完整生命周期函數(shù)調(diào)用順序?yàn)椋?code>onLoad -> onEnable -> start -> update -> lateUpdate -> onDisable -> onDestroy。

onLoad 節(jié)點(diǎn)激活時(shí)立即調(diào)用 組件 enabled 時(shí)才會(huì)調(diào)用?否
start 節(jié)點(diǎn)激活時(shí)延遲調(diào)用 組件 enabled 時(shí)才會(huì)調(diào)用?是

加載和場(chǎng)景切換

通過(guò)場(chǎng)景名索引和加載切換cc.director.loadScene("MyScene");
對(duì)于AssetBundle區(qū)分加載和運(yùn)行需要使用 cc.director.runScene(scene);

如果需要有全局不因?yàn)閳?chǎng)景加載而銷毀的常駐節(jié)點(diǎn),類似Unity DontDestroyOnLoad 可以使用常駐節(jié)點(diǎn),或全局變量訪問(wèn)
cc.game.addPersistRootNode(myNode); 會(huì)將 myNode 變?yōu)槌qv節(jié)點(diǎn),這樣掛在上面的組件都可以在場(chǎng)景之間持續(xù)作用,我們可以用這樣的方法來(lái)儲(chǔ)存玩家信息,或下一個(gè)場(chǎng)景初始化時(shí)需要的各種數(shù)據(jù)。
取消常駐 cc.game.removePersistRootNode(myNode);

場(chǎng)景加載回調(diào)函數(shù) cc.director.loadScene("MyScene", onSceneLaunched); 上一行里 onSceneLaunched 就是聲明在本腳本中的一個(gè)回調(diào)函數(shù),在場(chǎng)景加載后可以用來(lái)進(jìn)一步的進(jìn)行初始化或數(shù)據(jù)傳遞的操作。由于回調(diào)函數(shù)只能寫在本腳本中,所以場(chǎng)景加載回調(diào)通常用來(lái)配合常駐節(jié)點(diǎn),在常駐節(jié)點(diǎn)上掛載的腳本中使用。

預(yù)加載 cc.director.preloadScene(string sceneName, callback()) 可以靜默加載等待

設(shè)置和獲取資源

所有繼承自 cc.Asset 的類型都統(tǒng)稱資源,如 cc.Texture2D, cc.SpriteFrame, cc.AnimationClip, cc.Prefab 等。它們的加載是統(tǒng)一并且自動(dòng)化的,相互依賴的資源能夠被自動(dòng)預(yù)加載。例如,當(dāng)引擎在加載場(chǎng)景時(shí),會(huì)先自動(dòng)加載場(chǎng)景關(guān)聯(lián)到的資源,這些資源如果再關(guān)聯(lián)其它資源,其它也會(huì)被先被加載,等加載全部完成后,場(chǎng)景加載才會(huì)結(jié)束。

手動(dòng)加載

定義資源屬性后手動(dòng)加載 texture: { default: null, type: cc.Texture2D,},

動(dòng)態(tài)加載

動(dòng)態(tài)加載資源:cc.resources.load 通常我們會(huì)把項(xiàng)目中需要?jiǎng)討B(tài)加載的資源放在 resources 目錄下,配合接口動(dòng)態(tài)加載。你只要傳入相對(duì) resources 的路徑即可,并且路徑的結(jié)尾處 不能 包含文件擴(kuò)展名。

cc.resources.load("test assets/prefab", function (err, prefab) {
    var newNode = cc.instantiate(prefab);
    cc.director.getScene().addChild(newNode);
});

所有需要通過(guò)腳本動(dòng)態(tài)加載的資源,都必須放置在 resources 文件夾或它的子文件夾下。resources 文件夾需要在 assets 根目錄 下手動(dòng)創(chuàng)建。資源動(dòng)態(tài)加載的時(shí)候都是 異步 的,需要在回調(diào)函數(shù)中獲得載入的資源。這么做是因?yàn)?Creator 除了場(chǎng)景關(guān)聯(lián)的資源,沒(méi)有另外的資源預(yù)加載列表,動(dòng)態(tài)加載的資源是真正的動(dòng)態(tài)加載。
有些資源需要指定其類型,否則加載出來(lái)的默認(rèn)類型有誤(例如把spriteFrame加載為Texture2D)

// 加載 SpriteFrame
var self = this;
cc.resources.load("test assets/image", cc.SpriteFrame, function (err, spriteFrame) {
    self.node.getComponent(cc.Sprite).spriteFrame = spriteFrame;
});

資源釋放 cc.resources.release("test assets/image", cc.SpriteFrame);cc.assetManager.releaseAsset(spriteFrame); 進(jìn)行釋放

資源預(yù)加載 cc.resources.preload(path, cctype); 預(yù)加載的加載參數(shù)與正常加載時(shí)一樣,不過(guò)預(yù)加載只會(huì)去下載必要的資源,并不會(huì)進(jìn)行資源的反序列化和初始化工作,所以性能消耗更小,適合游戲運(yùn)行中使用。

cc.resources.preload('test assets/image', cc.SpriteFrame);

// wait for while
cc.resources.load('test assets/image', cc.SpriteFrame, function (err, spriteFrame) {
    self.node.getComponent(cc.Sprite).spriteFrame = spriteFrame;
});

加載遠(yuǎn)程資源和設(shè)備資源 cc.assetManager.loadRemote 。
這種方式有一定限制:1. 這種加載方式只支持圖片、聲音、文本等原生資源類型,不支持 SpriteFrame、SpriteAtlas、Tilemap 等資源的直接加載和解析。(如需遠(yuǎn)程加載所有資源,可使用 Asset Bundle) 2. Web 端的遠(yuǎn)程加載受到瀏覽器的 CORS 跨域策略限制,如果對(duì)方服務(wù)器禁止跨域訪問(wèn),那么會(huì)加載失敗,而且由于 WebGL 安全策略的限制,即便對(duì)方服務(wù)器允許 http 請(qǐng)求成功之后也無(wú)法渲染。

// 遠(yuǎn)程 url 帶圖片后綴名
var remoteUrl = "http://unknown.org/someres.png";
cc.assetManager.loadRemote(remoteUrl, function (err, texture) {
    // Use texture to create sprite frame
});

資源的依賴與釋放
在加載完資源之后,所有的資源都會(huì)臨時(shí)被緩存到 cc.assetManager
針對(duì) JavaScript 中無(wú)法跟蹤對(duì)象引用的問(wèn)題,Asset Manager 提供了一套基于引用計(jì)數(shù)的資源釋放機(jī)制,讓開(kāi)發(fā)者可以簡(jiǎn)單高效地釋放資源,不用擔(dān)心項(xiàng)目規(guī)模的急劇膨脹。每一個(gè)資源對(duì)象都提供了兩個(gè)方法 addRef,decRef,你可以使用這兩個(gè)接口來(lái)對(duì)動(dòng)態(tài)資源的引用進(jìn)行控制

Asset Bundle
從 v2.4 開(kāi)始,Cocos Creator 推出了 Asset Bundle 功能,支持 代碼、資源 和 場(chǎng)景 的分包加載。開(kāi)發(fā)者可將項(xiàng)目中的部分場(chǎng)景、資源、代碼等內(nèi)容劃分到不同的 Asset Bundle 中,這些 Asset Bundle 不會(huì)在游戲啟動(dòng)時(shí)加載,而是由開(kāi)發(fā)者在游戲過(guò)程中手動(dòng)調(diào)用 loadBundle 進(jìn)行加載,從而有效降低游戲啟動(dòng)的時(shí)間,盡可能做到按需加載。關(guān)于 Asset Bundle 的更多介紹,請(qǐng)參考 Asset Bundle。

加載asset bundle cc.assetManager.loadBundle 加載時(shí)需要傳入 Asset Bundle 配置面板中的 Bundle 名稱 或者 Asset Bundle 的 url。

cc.assetManager.loadBundle('01_graphics', (err, bundle) => {
    bundle.load('xxx');
});

從 v2.4.3 開(kāi)始,cc.assetManager.loadBundle 還支持傳入用戶空間中的路徑來(lái)加載用戶空間中的 Asset Bundle。通過(guò)對(duì)應(yīng)平臺(tái)提供的下載接口將 Asset Bundle 提前下載到用戶空間中,然后再使用 loadBundle 進(jìn)行加載,開(kāi)發(fā)者就可以完全自己管理 Asset Bundle 的下載與緩存過(guò)程,更加靈活。

// 提前下載某個(gè) Asset Bundle 到用戶空間 pathToBundle 目錄下。
//需要保證用戶空間下的 Asset Bundle 和對(duì)應(yīng)原始 Asset Bundle 的結(jié)構(gòu)和內(nèi)容完全一樣
// ...
// 通過(guò) Asset Bundle 在用戶空間中的路徑進(jìn)行加載
// 微信小游戲平臺(tái)
cc.assetManager.loadBundle(wx.env.USER_DATA_PATH + '/pathToBundle/bundleName', (err, bundle) => {
    // ...
});

當(dāng) Asset Bundle 加載完成后,會(huì)觸發(fā)回調(diào)并返回錯(cuò)誤信息和 cc.AssetManager.Bundle 類的實(shí)例,這個(gè)實(shí)例就是 Asset Bundle API 的主要入口,開(kāi)發(fā)者可以使用它去加載 Asset Bundle 中的各類資源。在 Asset Bundle 加載完成后,返回了一個(gè) cc.AssetManager.Bundle 類的實(shí)例。

可以通過(guò)名稱進(jìn)行獲取

let bundle = cc.assetManager.getBundle('01_graphics');

加載資源: bundle.load 方法來(lái)加載 Asset Bundle 中的資源,此方法的參數(shù)與 cc.resources.load 相同,

加載場(chǎng)景:Asset Bundle 提供了 loadScene 方法用于加載指定 bundle 中的場(chǎng)景,你只需要傳入 場(chǎng)景名 即可。loadScenecc.director.loadScene 不同的地方在于 loadScene 只會(huì)加載指定 bundle 中的場(chǎng)景,而不會(huì)運(yùn)行場(chǎng)景,你還需要使用 cc.director.runScene 來(lái)運(yùn)行場(chǎng)景。

預(yù)加載:Asset Bundle 中提供了 preloadpreloadDir 接口用于預(yù)加載 Asset Bundle 中的資源。具體的使用方式和 cc.assetManager 一致

釋放資源:常規(guī)的cc.assetManager.releaseAssetbundle.release('image', cc.SpriteFrame);bundle.releaseAll();

移除AssetBundle:cc.assetManager.removeBundle(bundle);

當(dāng)手動(dòng)移除了某個(gè)不需要的 bundle,那么此 bundle 的緩存也會(huì)被移除,如果需要再次使用,則必須再重新加載一次。在移除 Asset Bundle 時(shí),并不會(huì)釋放該 bundle 中被加載過(guò)的資源。如果需要釋放,請(qǐng)先使用 Asset Bundle 的 release / releaseAll 方法:

監(jiān)聽(tīng)與發(fā)射事件

事件處理是在節(jié)點(diǎn)(cc.Node)中完成的。對(duì)于組件,可以通過(guò)訪問(wèn)節(jié)點(diǎn) this.node 來(lái)注冊(cè)和監(jiān)聽(tīng)事件。監(jiān)聽(tīng)事件可以通過(guò) this.node.on() 函數(shù)來(lái)注冊(cè),除了使用on 監(jiān)聽(tīng),我們還可以使用 once 方法。once 監(jiān)聽(tīng)在監(jiān)聽(tīng)函數(shù)響應(yīng)后就會(huì)關(guān)閉監(jiān)聽(tīng)事件。

監(jiān)聽(tīng)事件
注冊(cè)監(jiān)聽(tīng)方法:this.node.on('mousedown', function ( event ) {console.log('Hello!');});
/ 例:點(diǎn)擊事件的綁定 this.node.on(‘touchstart’,this.fire,this);
事件監(jiān)聽(tīng)函數(shù) on 可以傳第三個(gè)參數(shù) target,用于綁定響應(yīng)函數(shù)的調(diào)用者。

// 使用函數(shù)綁定
this.node.on('mousedown', function ( event ) {this.enabled = false;}.bind(this));

// 使用第三個(gè)參數(shù)
this.node.on('mousedown', function (event) {this.enabled = false;}, this);

關(guān)閉監(jiān)聽(tīng):off方法,推薦和onEnable()onDisable() 配合案例

cc.Class({
  extends: cc.Component,

  _sayHello: function () {
    console.log('Hello World');
  },

  onEnable: function () {
    this.node.on('foobar', this._sayHello, this);
  },

  onDisable: function () {
    this.node.off('foobar', this._sayHello, this);
  },
});

發(fā)射事件
發(fā)射事件有兩種方式:emitdispatchEvent。兩者的區(qū)別在于,后者可以做事件傳遞。

在發(fā)射事件時(shí),我們可以在 emit 函數(shù)的第二個(gè)參數(shù)開(kāi)始傳遞我們的事件參數(shù)。同時(shí),在 on 注冊(cè)的回調(diào)里,可以獲取到對(duì)應(yīng)的事件參數(shù)。出于底層事件派發(fā)的性能考慮,這里最多只支持傳遞 5 個(gè)事件參數(shù)。

onLoad () { //事件注冊(cè)
    this.node.on('foo', function (arg1, arg2, arg3) {
      console.log(arg1, arg2, arg3);  // print 1, 2, 3
    });
  },
  start () {
    // 事件發(fā)射
    let arg1 = 1, arg2 = 2, arg3 = 3;
    // At most 5 args could be emit.
    this.node.emit('foo', arg1, arg2, arg3);
  },

派送事件 (用于我不想觸發(fā)全部,而是可以截獲)

dispatchEvent 方法,通過(guò)該方法發(fā)射的事件,會(huì)進(jìn)入事件派送階段。在 Cocos Creator 的事件派送系統(tǒng)中,我們采用冒泡派送的方式。冒泡派送會(huì)將事件從事件發(fā)起節(jié)點(diǎn),不斷地向上傳遞給他的父級(jí)節(jié)點(diǎn),直到到達(dá)根節(jié)點(diǎn)或者在某個(gè)節(jié)點(diǎn)的響應(yīng)函數(shù)中做了中斷處理 event.stopPropagation()。
發(fā)送的節(jié)點(diǎn)c
this.node.dispatchEvent( new cc.Event.EventCustom('foobar', true) );
截獲的節(jié)點(diǎn)b
this.node.on('foobar', function (event) {event.stopPropagation();});

事件對(duì)象
在事件監(jiān)聽(tīng)回調(diào)中,開(kāi)發(fā)者會(huì)接收到一個(gè) cc.Event 類型的事件對(duì)象 event,stopPropagation 就是 cc.Event 的標(biāo)準(zhǔn) API。
在發(fā)送用戶自定義事件的時(shí)候,請(qǐng)不要直接創(chuàng)建 cc.Event 對(duì)象,因?yàn)樗且粋€(gè)抽象類,請(qǐng)創(chuàng)建 cc.Event.EventCustom 對(duì)象來(lái)進(jìn)行派發(fā)。
其中重要的API包含:
API - 類型 - 意義
type -String 事件的類型(事件名)
target- cc.Node 接收到事件的原始對(duì)象
currentTarget - cc.Node 接收到事件的當(dāng)前對(duì)象,事件在冒泡階段當(dāng)前對(duì)象可能與原始對(duì)象不同
getType -Function 獲取事件的類型
stopPropagation-Function 停止冒泡階段,事件將不會(huì)繼續(xù)向父節(jié)點(diǎn)傳遞,當(dāng)前節(jié)點(diǎn)的剩余監(jiān)聽(tīng)器仍然會(huì)接收到事件
stopPropagationImmediate- Function 立即停止事件的傳遞,事件將不會(huì)傳給父節(jié)點(diǎn)以及當(dāng)前節(jié)點(diǎn)的剩余監(jiān)聽(tīng)器
getCurrentTarget-Function 獲取當(dāng)前接收到事件的目標(biāo)節(jié)點(diǎn)
detail-Function 自定義事件的信息(屬于 cc.Event.EventCustom)
setUserData-Function 設(shè)置自定義事件的信息(屬于 cc.Event.EventCustom)
getUserData-Function 獲取自定義事件的信息(屬于 cc.Event.EventCustom)

系統(tǒng)內(nèi)置事件

Cocos Creator 支持的系統(tǒng)事件包含鼠標(biāo)、觸摸、鍵盤、重力傳感四種,其中本章節(jié)重點(diǎn)介紹與節(jié)點(diǎn)樹(shù)相關(guān)聯(lián)的鼠標(biāo)和觸摸事件,這些事件是被直接觸發(fā)在相關(guān)節(jié)點(diǎn)上的,所以被稱為節(jié)點(diǎn)系統(tǒng)事件。與之對(duì)應(yīng)的,鍵盤和重力傳感事件被稱為全局系統(tǒng)事件。
系統(tǒng)事件遵守通用的注冊(cè)方式,開(kāi)發(fā)者既可以使用枚舉類型也可以直接使用事件名來(lái)注冊(cè)事件的監(jiān)聽(tīng)器,事件名的定義遵循 DOM 事件標(biāo)準(zhǔn)。

// 使用枚舉類型來(lái)注冊(cè)
node.on(cc.Node.EventType.MOUSE_DOWN, function (event) {
  console.log('Mouse down');
}, this);

// 使用事件名來(lái)注冊(cè)
node.on('mousedown', function (event) {
  console.log('Mouse down');
}, this);

鼠標(biāo)事件類型與事件對(duì)象
鼠標(biāo)事件在桌面平臺(tái)才會(huì)觸發(fā):
鼠標(biāo)事件在桌面平臺(tái)才會(huì)觸發(fā),系統(tǒng)提供的事件類型如下:

枚舉對(duì)象定義- 對(duì)應(yīng)的事件名- 事件觸發(fā)的時(shí)機(jī)
cc.Node.EventType.MOUSE_DOWN- mousedown 當(dāng)鼠標(biāo)在目標(biāo)節(jié)點(diǎn)區(qū)域按下時(shí)觸發(fā)一次
cc.Node.EventType.MOUSE_ENTER- mouseenter 當(dāng)鼠標(biāo)移入目標(biāo)節(jié)點(diǎn)區(qū)域時(shí),不論是否按下
cc.Node.EventType.MOUSE_MOVE- mousemove 當(dāng)鼠標(biāo)在目標(biāo)節(jié)點(diǎn)區(qū)域中移動(dòng)時(shí),不論是否按下
cc.Node.EventType.MOUSE_LEAVE- mouseleave 當(dāng)鼠標(biāo)移出目標(biāo)節(jié)點(diǎn)區(qū)域時(shí),不論是否按下
cc.Node.EventType.MOUSE_UP - mouseup 當(dāng)鼠標(biāo)從按下?tīng)顟B(tài)松開(kāi)時(shí)觸發(fā)一次
cc.Node.EventType.MOUSE_WHEEL- mousewheel 當(dāng)鼠標(biāo)滾輪滾動(dòng)時(shí)

鼠標(biāo)事件(cc.Event.EventMouse)的重要 API 如下(cc.Event 標(biāo)準(zhǔn)事件 API 除外):
函數(shù)名- 返回值類型 -意義
getScrollY Number 獲取滾輪滾動(dòng)的 Y 軸距離,只有滾動(dòng)時(shí)才有效
getLocation Object 獲取鼠標(biāo)位置對(duì)象,對(duì)象包含 x 和 y 屬性
getLocationX Number 獲取鼠標(biāo)的 X 軸位置
getLocationY Number 獲取鼠標(biāo)的 Y 軸位置
getPreviousLocation Object 獲取鼠標(biāo)事件上次觸發(fā)時(shí)的位置對(duì)象,對(duì)象包含 x 和 y 屬性
getDelta Object 獲取鼠標(biāo)距離上一次事件移動(dòng)的距離對(duì)象,對(duì)象包含 x 和 y 屬性
getButton Number 獲取cc.Event.EventMouse.BUTTON_LEFTcc.Event.EventMouse.BUTTON_RIGHTcc.Event.EventMouse.BUTTON_MIDDLE

觸摸事件類型和事件對(duì)象 網(wǎng)頁(yè)
TOUCH_START還有TOUCH_MOVE TOUCH_END TOUCH_CANCEL 四種微妙差別
觸摸事件API 部分可以獲取 觸點(diǎn)對(duì)象touch,getID,getLocation,獲取上次觸點(diǎn)getPreviousLocation,獲取觸點(diǎn)初始位置 getStartLocation , 獲取移動(dòng)的距離對(duì)象getDelta 需要注意的是,觸摸事件支持多點(diǎn)觸摸,每個(gè)觸點(diǎn)都會(huì)發(fā)送一次事件給事件監(jiān)聽(tīng)器。

觸摸事件的傳遞問(wèn)題,參考事件冒泡:如果c是b的子節(jié)點(diǎn),b是a的子節(jié)點(diǎn):會(huì)通過(guò)c - b - a 冒泡在觸摸事件冒泡的過(guò)程中不會(huì)有觸摸檢測(cè),這意味著即使觸點(diǎn)不在 A B 節(jié)點(diǎn)區(qū)域內(nèi),A B 節(jié)點(diǎn)也會(huì)通過(guò)觸摸事件冒泡的機(jī)制接收到這個(gè)事件。

cc.Node 的其它事件
position-changed 當(dāng)位置屬性修改
rotation-changed 當(dāng)旋轉(zhuǎn)屬性修改時(shí)
scale-changed 當(dāng)縮放屬性修改時(shí)
size-changed 當(dāng)寬高屬性修改時(shí)
anchor-changed 當(dāng)錨點(diǎn)屬性修改時(shí)

屏蔽多點(diǎn)觸摸系統(tǒng)
cc.macro.ENABLE_MULTI_TOUCH = false;

暫停和恢復(fù)節(jié)點(diǎn)事件系統(tǒng)
this.node.pauseSystemEvents();this.node.resumeSystemEvents();

全局系統(tǒng)事件

全局系統(tǒng)事件是指與節(jié)點(diǎn)樹(shù)不相關(guān)的各種全局事件,由 cc.systemEvent 來(lái)統(tǒng)一派發(fā)

定義輸入事件
鍵盤、設(shè)備重力傳感器此類全局事件是通過(guò)函數(shù) cc.systemEvent.on(type, callback, target)注冊(cè)的。
可選的 type 類型有:
cc.SystemEvent.EventType.KEY_DOWN (鍵盤按下)
cc.SystemEvent.EventType.KEY_UP (鍵盤釋放)
cc.SystemEvent.EventType.DEVICEMOTION (設(shè)備重力傳感)

鍵盤事件

cc.Class({
    extends: cc.Component,
    onLoad: function () {
        // add key down and key up event
        cc.systemEvent.on(cc.SystemEvent.EventType.KEY_DOWN, this.onKeyDown, this);
        cc.systemEvent.on(cc.SystemEvent.EventType.KEY_UP, this.onKeyUp, this);
    },

    onDestroy () {
        cc.systemEvent.off(cc.SystemEvent.EventType.KEY_DOWN, this.onKeyDown, this);
        cc.systemEvent.off(cc.SystemEvent.EventType.KEY_UP, this.onKeyUp, this);
    },

    onKeyDown: function (event) {
        switch(event.keyCode) {
            case cc.macro.KEY.a:
                console.log('Press a key');
                break;
        }
    },

    onKeyUp: function (event) {
        switch(event.keyCode) {
            case cc.macro.KEY.a:
                console.log('release a key');
                break;
        }
    }
});

重力傳感器事件 cc.SystemEvent.EventType.DEVICEMOTION

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 生命周期回調(diào) Cocos Creator 為組件腳本提供了生命周期的回調(diào)函數(shù)。用戶只要定義特定的回調(diào)函數(shù),Crea...
    kzc愛(ài)吃梨閱讀 2,705評(píng)論 0 1
  • 1、在IDE中創(chuàng)建腳本比較方便。由于大部分時(shí)間我們都是在編輯組件腳本,所以這里就圍繞組件腳本來(lái)展開(kāi)。 2、coco...
    mjwz5294閱讀 4,234評(píng)論 0 3
  • 1.除了方法, 其他東西都要扔到properties里面了, 并且要給出屬性的默認(rèn)值或者屬性的存取的方法 1) 首...
    視掘閱讀 1,401評(píng)論 0 0
  • 前言 預(yù)備 不知道你有沒(méi)有想過(guò),假如把游戲世界比作一輛汽車,那么這輛“汽車”是如何啟動(dòng),又是如何持續(xù)運(yùn)轉(zhuǎn)的呢? 如...
    程序猿TODO閱讀 800評(píng)論 0 0
  • 今天感恩節(jié)哎,感謝一直在我身邊的親朋好友。感恩相遇!感恩不離不棄。 中午開(kāi)了第一次的黨會(huì),身份的轉(zhuǎn)變要...
    余生動(dòng)聽(tīng)閱讀 10,798評(píng)論 0 11

友情鏈接更多精彩內(nèi)容