CocosCreator教程(入門篇)

目錄
一策州、項(xiàng)目結(jié)構(gòu)
二埠褪、資源分類
三浓利、資源小知識(shí)點(diǎn)
四、場(chǎng)景小知識(shí)點(diǎn)
五钞速、子系統(tǒng)重點(diǎn)
六贷掖、腳本開發(fā)
七、發(fā)布游戲

系列教程
CocosCreator教程(初識(shí)篇)
CocosCreator教程(編輯器篇)


一渴语、項(xiàng)目結(jié)構(gòu)

ProjectName(新建項(xiàng)目)
├──assets
├──library
├──local
├──packages
├──settings
├──temp
└──project.json
子結(jié)構(gòu) 功能
assets 與資源管理器的內(nèi)容同步苹威,游戲的核心目錄(每個(gè)文件都有相應(yīng).meta文件)
library 這里文件的結(jié)構(gòu)和資源的格式將被處理成最終游戲發(fā)布時(shí)需要的形式
local 編輯器使用習(xí)慣記錄(如:窗體布局)
settings 項(xiàng)目設(shè)置
project.json 版本控制,必須與assets共同存在
build 打包導(dǎo)出目錄驾凶,構(gòu)建項(xiàng)目時(shí)牙甫,自動(dòng)生成

PS:.meta文件——記錄某資源在項(xiàng)目中的唯一標(biāo)識(shí),以及其配置信息狭郑,只有在編輯器中對(duì)資源做修改腹暖,.meta文件才會(huì)實(shí)時(shí)變化。因此翰萨,不要在編輯器外脏答,對(duì)資源的內(nèi)容進(jìn)行操作。


二、資源分類

1殖告、場(chǎng)景(scene)

自動(dòng)釋放資源:切換場(chǎng)景后阿蝶,上一個(gè)場(chǎng)景中的資源,從內(nèi)存中釋放黄绩。
延遲加載資源:意味著不用等待所有資源加載完畢羡洁,才顯示場(chǎng)景。(快速切換場(chǎng)景爽丹,資源陸續(xù)在畫面顯示)

2筑煮、貼圖(texture)

普通圖,子層為一張spriteFrame粤蝎。

3真仲、預(yù)制(prefab)

創(chuàng)建方式:拖拽場(chǎng)景節(jié)點(diǎn),到資源管理器初澎。

4秸应、圖集(atlas)

精靈圖,子層為多張spriteFrame碑宴。(精靈圖合成軟件:TexturePacker软啼、Zwoptex)

5、自動(dòng)圖集(auto-atlas)

打包時(shí)延柠,將所在目錄中的所有碎圖祸挪,合成為圖集。

6捕仔、藝術(shù)數(shù)字(label-atlas)

數(shù)字為內(nèi)容的圖集匕积。

7、字體(font)

動(dòng)態(tài)字體:.ttf
位圖字體:.fnt + .png(存在于同一目錄)

8榜跌、粒子(particle)

小型動(dòng)畫

9闪唆、聲音(audio)

模式:web audio、dom audio

10钓葫、骨骼動(dòng)畫(spine / dragonBones)
文件格式 功能
.json 骨骼數(shù)據(jù)
.png 圖集紋理
.txt / .atlas 圖集數(shù)據(jù)
11悄蕾、瓦片圖(tiledMap)
文件格式 功能
.tmx 地圖數(shù)據(jù)
.png 圖集紋理
.tsx tileset 數(shù)據(jù)配置文件
12、文本(text)
13础浮、腳本(script)
14帆调、json

三、資源小知識(shí)點(diǎn)

1豆同、跨項(xiàng)目導(dǎo)入導(dǎo)出資源

操作流程:
(1)導(dǎo)出:文件 => 資源導(dǎo)出番刊,選擇 .fire場(chǎng)景文件,輸出assets目錄的 .zip壓縮包影锈。
(2)導(dǎo)入:文件 => 資源導(dǎo)入芹务,選擇壓縮包源路徑蝉绷、解壓路徑,輸出assets目錄內(nèi)容枣抱。

2熔吗、圖像資源自動(dòng)剪裁

基于size mode,盡量去除spriteFrame無(wú)像素的部分佳晶,減小圖片尺寸桅狠。


四、場(chǎng)景小知識(shí)點(diǎn)

1轿秧、場(chǎng)景中的元素中跌,即是節(jié)點(diǎn),可內(nèi)嵌組件淤刃。
2晒他、坐標(biāo)系
類別 坐標(biāo)軸方向
cocos坐標(biāo)系(世界、本地坐標(biāo)系) x右逸贾、y上、z外
設(shè)備屏幕坐標(biāo)系 x右津滞、y下
3铝侵、錨點(diǎn)

作用:用于變換、子節(jié)點(diǎn)定位基準(zhǔn)触徐。


五咪鲜、子系統(tǒng)重點(diǎn)

1、渲染系統(tǒng)

對(duì)攝像機(jī)撞鹉、渲染組件的了解疟丙。

2、UI系統(tǒng)

對(duì)widget鸟雏、layout等UI組件的了解享郊。

3、動(dòng)畫系統(tǒng)

(1)創(chuàng)建動(dòng)畫的基本流程
(2)時(shí)間曲線(雙擊動(dòng)畫線孝鹊,進(jìn)入編輯窗口)
(3)事件管理(雙擊游標(biāo)炊琉、加減按鈕控制參數(shù)個(gè)數(shù))
(4)腳本控制

4、物理系統(tǒng)

碰撞組件(普通碰撞)
(1)editing——是否為編輯模式
(2)regenerate points——計(jì)算圖形邊界又活,自定生成控制點(diǎn)苔咪,數(shù)值為控制點(diǎn)的生成密度 / 準(zhǔn)確度
(3)ctrl + 點(diǎn)擊——?jiǎng)h除控制點(diǎn)
(4)組件類型:矩形、圓形柳骄、多邊形
(5)設(shè)置碰撞組(項(xiàng)目 => 項(xiàng)目設(shè)置 => 分組設(shè)置):
制定分組 => 匹配分組 => 碰撞組件所在節(jié)點(diǎn)上团赏,設(shè)置所屬分組
(6)腳本控制

Box2D物理引擎(高級(jí)碰撞)

5、音頻系統(tǒng)

(1)audioSource組件
(2)腳本控制


六耐薯、腳本開發(fā)

1舔清、使用 cc.Class 聲明類型

(1)定義 CCClass

var Sprite = cc.Class({
    //...
});

(2)實(shí)例化

var obj = new Sprite();

(3)判斷類型

cc.log(obj instanceof Sprite);       //使用原生JS的instanceof 

(4)構(gòu)造函數(shù)(ctor)

var Sprite = cc.Class({
    //使用ctor聲明構(gòu)造函數(shù)
    ctor: function () {
        cc.log(this instanceof Sprite);
    }
});

(5)實(shí)例方法

var Sprite = cc.Class({
    // 聲明一個(gè)名叫 "print" 的實(shí)例方法
    print: function () { }
});

(6)繼承(extends)

// 父類
var Shape = cc.Class();

// 子類
var Rect = cc.Class({
    //使用 extends 實(shí)現(xiàn)繼承
    extends: Shape
});

(7)父構(gòu)造函數(shù)

var Shape = cc.Class({
    ctor: function () {
        cc.log("Shape");    // 實(shí)例化時(shí)隘世,父構(gòu)造函數(shù)會(huì)自動(dòng)調(diào)用,
    }
});

var Rect = cc.Class({
    extends: Shape
});

var Square = cc.Class({
    extends: Rect,
    ctor: function () {
        cc.log("Square");   // 再調(diào)用子構(gòu)造函數(shù)
    }
});

var square = new Square();

(8)完整聲明屬性

//簡(jiǎn)單類型聲明
properties: {
    score: {
        //這幾個(gè)參數(shù)分別指定了 score 的默認(rèn)值為 0鸠踪,在 屬性檢查器 里丙者,其屬性名將顯示為:“Score (player)”,并且當(dāng)鼠標(biāo)移到參數(shù)上時(shí)营密,顯示對(duì)應(yīng)的 Tooltip械媒。
        default: 0,
        displayName: "Score (player)",
        tooltip: "The score of player",
    }
}

//數(shù)組聲明
properties: {
    names: {
        default: [],
        type: [cc.String]   // 用 type 指定數(shù)組的每個(gè)元素都是字符串類型
    },

    enemies: {
        default: [],
        type: [cc.Node]     // type 同樣寫成數(shù)組,提高代碼可讀性
    },
}

//get/set 聲明
properties: {
    width: {
        get: function () {
            return this._width;
        },
        set: function (value) {
            this._width = value;
        }
    }
}

properties常用參數(shù)

參數(shù) 作用
default 默認(rèn)值
type 限定屬性的數(shù)據(jù)類型
visible 若為false评汰,則不在屬性檢查器面板中顯示該屬性
serializable 若為false纷捞,則不序列化(保存)該屬性
displayName 在屬性檢查器面板中,顯示成指定名字
tooltip 在屬性檢查器面板中被去,添加屬性的Tooltip
2主儡、訪問(wèn)節(jié)點(diǎn)和組件

(1)獲得組件所在的節(jié)點(diǎn)

this.node

(2)獲得其它組件

this.getComponent(組件名)

(3)獲得其它節(jié)點(diǎn)及其組件

// Player.js
cc.Class({
    extends: cc.Component,
    properties: {
        player: {
            default: null,
            type: cc.Node
        }
    }
});

//如果你將屬性的 type 聲明為 Player 組件,當(dāng)你拖動(dòng)節(jié)點(diǎn) "Player Node" 到 屬性檢查器惨缆,player 屬性就會(huì)被設(shè)置為這個(gè)節(jié)點(diǎn)里面的 Player 組件
// Cannon.js
var Player = require("Player");
cc.Class({
    extends: cc.Component,
    properties: {
        // 聲明 player 屬性糜值,這次直接是組件類型
        player: {
            default: null,
            type: Player
        }
    }
});

//查找子節(jié)點(diǎn)
//返回子節(jié)點(diǎn)數(shù)組
this.node.children
//返回對(duì)應(yīng)的子節(jié)點(diǎn)
this.node.getChildByName(子節(jié)點(diǎn)名);
//查找后代節(jié)點(diǎn)
cc.find(子節(jié)點(diǎn)/.../后代節(jié)點(diǎn), this.node);
//全局查找節(jié)點(diǎn)
cc.find(場(chǎng)景/節(jié)點(diǎn)/節(jié)點(diǎn)/...);

(4)訪問(wèn)已有變量里的值(通過(guò)模塊訪問(wèn))

//專門開設(shè)一個(gè)中介模塊,導(dǎo)出接口坯墨;在其他模塊進(jìn)行節(jié)點(diǎn)寂汇、組件、屬性的操作
// Global.js
module.exports = {
    backNode: null,
    backLabel: null,
};

// Back.js
var Global = require("Global");
cc.Class({
    extends: cc.Component,
    onLoad: function () {
        Global.backNode = this.node;
        Global.backLabel = this.getComponent(cc.Label);
    }
});

// AnyScript.js
var Global = require("Global");
cc.Class({
    extends: cc.Component,
    start: function () {
        var text = "Back";
        Global.backLabel.string = text;
    }
});
3捣染、常用節(jié)點(diǎn)和組件接口

(1)節(jié)點(diǎn)狀態(tài)和層級(jí)操作

//激活/關(guān)閉節(jié)點(diǎn)
this.node.active = true;
this.node.active = false;

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

//索引節(jié)點(diǎn)的子節(jié)點(diǎn)
//返回子節(jié)點(diǎn)數(shù)組
this.node.children
//返回子節(jié)點(diǎn)數(shù)量
this.node.childrenCount

(2)更改節(jié)點(diǎn)的變換(位置骄瓣、旋轉(zhuǎn)、縮放耍攘、尺寸)

//更改節(jié)點(diǎn)位置
//分別對(duì) x 軸和 y 軸坐標(biāo)賦值
this.node.x = 100;
this.node.y = 50;
//使用setPosition方法
this.node.setPosition(100, 50);
this.node.setPosition(cc.v2(100, 50));
//設(shè)置position變量
this.node.position = cc.v2(100, 50);

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

//更改節(jié)點(diǎn)縮放
this.node.scaleX = 2;
this.node.scaleY = 2;
this.node.setScale(2);
this.node.setScale(2, 2);

//更改節(jié)點(diǎn)尺寸
this.node.setContentSize(100, 100);
this.node.setContentSize(cc.size(100, 100));
this.node.width = 100;
this.node.height = 100;

//更改節(jié)點(diǎn)錨點(diǎn)位置
this.node.anchorX = 1;
this.node.anchorY = 0;
this.node.setAnchorPoint(1, 0);

(3)顏色和不透明度

//設(shè)置顏色
mySprite.node.color = cc.Color.RED;
//設(shè)置不透明度
mySprite.node.opacity = 128;

(4)常用組件接口
cc.Component 是所有組件的基類榕栏,任何組件都包括如下的常見接口:

接口 作用
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í))執(zhí)行
start() 會(huì)在該組件第一次 update 之前執(zhí)行,通常用于需要在所有組件的 onLoad 初始化完畢后執(zhí)行的邏輯
4示损、生命周期
函數(shù)名 描述
onLoad 在節(jié)點(diǎn)首次激活時(shí)觸發(fā)渗磅,或者所在節(jié)點(diǎn)被激活的情況下觸發(fā)
start 在組件首次激活前
update 動(dòng)畫更新前
lateUpdate 動(dòng)畫更新后
onEnable 當(dāng)組件的 enabled 屬性從 false 變?yōu)?true 時(shí),或者所在節(jié)點(diǎn)的 active 屬性從 false 變?yōu)?true 時(shí)(倘若節(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í)
onDestroy 當(dāng)組件或者所在節(jié)點(diǎn)調(diào)用了 destroy()時(shí)
5脆贵、創(chuàng)建和銷毀節(jié)點(diǎn)

(1)創(chuàng)建新節(jié)點(diǎn)

cc.Class({
  extends: cc.Component,
  properties: {
    sprite: {
      default: null,
      type: cc.SpriteFrame,
    },
  },
  start: function () {
    //動(dòng)態(tài)創(chuàng)建節(jié)點(diǎn)医清,并將它加入到場(chǎng)景中
    var node = new cc.Node('Sprite');
    var sp = node.addComponent(cc.Sprite);
    sp.spriteFrame = this.sprite;
    node.parent = this.node;
  }
});

(2)克隆已有節(jié)點(diǎn)

//
cc.Class({
  extends: cc.Component,
  properties: {
    target: {
      default: null,
      type: cc.Node,
    },
  },
  start: function () {
    //克隆場(chǎng)景中的已有節(jié)點(diǎn)
    var scene = cc.director.getScene();
    var node = cc.instantiate(this.target);
    node.parent = scene;
    node.setPosition(0, 0);
  }
});

(3)創(chuàng)建預(yù)制節(jié)點(diǎn)

//
cc.Class({
  extends: cc.Component,
  properties: {
    target: {
      default: null,
      type: cc.Prefab,    //預(yù)制
    },
  },
  start: function () {
    var scene = cc.director.getScene();
    var node = cc.instantiate(this.target);
    node.parent = scene;
    node.setPosition(0, 0);
  }
});

(4)銷毀節(jié)點(diǎn)

//
cc.Class({
  extends: cc.Component,
  properties: {
    target: cc.Node,
  },
  start: function () {
    // 5 秒后銷毀目標(biāo)節(jié)點(diǎn)
    //銷毀節(jié)點(diǎn)并不會(huì)立刻被移除,而是在當(dāng)前幀邏輯更新結(jié)束后卖氨,統(tǒng)一執(zhí)行
    setTimeout(function () {
      this.target.destroy();
    }.bind(this), 5000);
  },
  update: function (dt) {
    //判斷當(dāng)前節(jié)點(diǎn)是否已經(jīng)被銷毀
    if (cc.isValid(this.target)) {
      this.target.rotation += dt * 10.0;
    }
  }
});

PS:不要使用removeFromParent去銷毀節(jié)點(diǎn)会烙。
原因:調(diào)用一個(gè)節(jié)點(diǎn)的 removeFromParent 后负懦,它不一定就能完全從內(nèi)存中釋放,因?yàn)橛锌赡苡捎谝恍┻壿嬌系膯?wèn)題柏腻,導(dǎo)致程序中仍然引用到了這個(gè)對(duì)象纸厉。

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

(1)加載和切換

//從當(dāng)前場(chǎng)景五嫂,切換到MyScene場(chǎng)景
cc.director.loadScene("MyScene");

(2)通過(guò)常駐節(jié)點(diǎn)颗品,進(jìn)行場(chǎng)景資源管理和參數(shù)傳遞

//常駐節(jié)點(diǎn):不隨場(chǎng)景切換,而自動(dòng)銷毀沃缘,為所有場(chǎng)景提供持久性信息
//設(shè)置常駐節(jié)點(diǎn)
cc.game.addPersistRootNode(myNode);
//取消常駐節(jié)點(diǎn)躯枢,還原為一般場(chǎng)景節(jié)點(diǎn)
cc.game.removePersistRootNode(myNode);

(3)場(chǎng)景加載回調(diào)

//fn:加載MyScene場(chǎng)景時(shí)觸發(fā)
cc.director.loadScene("MyScene", fn);

(4)預(yù)加載場(chǎng)景

//后臺(tái)預(yù)加載場(chǎng)景
cc.director.preloadScene("MyScene", fn);
//有需要時(shí),手動(dòng)加載該場(chǎng)景
cc.director.loadScene("MyScene", fn);
7槐臀、獲取和加載資源

(1)資源屬性的聲明

// NewScript.js
cc.Class({
    extends: cc.Component,
    properties: {
        //所有繼承自 cc.Asset 的類型都統(tǒng)稱資源锄蹂,如 cc.Texture2D, cc.SpriteFrame, cc.AnimationClip, cc.Prefab 等
        texture: {
            default: null,
            type: cc.Texture2D
        },
        spriteFrame: {
            default: null,
            type: cc.SpriteFrame
        }
    }
});

(2)靜態(tài)加載(在屬性檢查器里設(shè)置資源)

// NewScript.js
onLoad: function () {
    //拖拽資源管理器的資源,到屬性檢查器的腳本組件中水慨,即可在腳本里拿到設(shè)置好的資源
    var spriteFrame = this.spriteFrame;
    var texture = this.texture;
    spriteFrame.setTexture(texture);
}

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

//動(dòng)態(tài)加載的資源得糜,需要存放于assets的子目錄resources中

//加載單個(gè)資源
//cc.loader.loadRes(resources的相對(duì)路徑, 類型(可選), 回調(diào)函數(shù))
//加載Prefab資源
cc.loader.loadRes("test assets/prefab", function (err, prefab) {
    var newNode = cc.instantiate(prefab);
    cc.director.getScene().addChild(newNode);
});
//加載SpriteFrame
var self = this;
cc.loader.loadRes("test assets/image", cc.SpriteFrame, function (err, spriteFrame) {
    self.node.getComponent(cc.Sprite).spriteFrame = spriteFrame;
});

//批量加載資源
//cc.loader.loadResDir(resources的相對(duì)路徑, 類型(可選), 回調(diào)函數(shù))
//加載test assets目錄下所有資源
cc.loader.loadResDir("test assets", function (err, assets) {
    // ...
});
//加載test assets目錄下所有SpriteFrame,并且獲取它們的路徑
cc.loader.loadResDir("test assets", cc.SpriteFrame, function (err, assets, urls) {
    // ...
});

//資源淺釋放
//cc.loader.releaseRes(resources的相對(duì)路徑, 類型(可選))
cc.loader.releaseRes("test assets/image", cc.SpriteFrame);
cc.loader.releaseRes("test assets/anim");
//cc.loader.releaseAsset(組件名)
cc.loader.releaseAsset(spriteFrame);

// 資源深釋放讥巡,釋放一個(gè)資源以及所有它依賴的資源
var deps = cc.loader.getDependsRecursively('prefabs/sample');

(4)加載遠(yuǎn)程資源和設(shè)備資源

//加載遠(yuǎn)程資源
//遠(yuǎn)程 url 帶圖片后綴名
var remoteUrl = "http://unknown.org/someres.png";
cc.loader.load(remoteUrl, function (err, texture) {
    //...
});
//遠(yuǎn)程 url 不帶圖片后綴名掀亩,此時(shí)必須指定遠(yuǎn)程圖片文件的類型
remoteUrl = "http://unknown.org/emoji?id=124982374";
cc.loader.load({url: remoteUrl, type: 'png'}, function () {
    //...
});

//加載設(shè)備資源
//用絕對(duì)路徑加載設(shè)備存儲(chǔ)內(nèi)的資源,比如相冊(cè)
var absolutePath = "/dara/data/some/path/to/image.png"
cc.loader.load(absolutePath, function () {
    //...
});

加載限制:
1欢顷、原生平臺(tái)遠(yuǎn)程加載不支持圖片文件以外類型的資源。
2捉蚤、這種加載方式只支持圖片抬驴、聲音、文本等原生資源類型缆巧,不支持SpriteFrame布持、SpriteAtlas、Tilemap等資源的直接加載和解析陕悬。(需要后續(xù)版本中的AssetBundle支持)
3题暖、Web端的遠(yuǎn)程加載受到瀏覽器的CORS跨域策略限制,如果對(duì)方服務(wù)器禁止跨域訪問(wèn)捉超,那么會(huì)加載失敗胧卤,而且由于WebGL安全策略的限制,即便對(duì)方服務(wù)器允許http請(qǐng)求成功之后也無(wú)法渲染拼岳。

(5)資源的依賴和釋放

// 直接釋放某個(gè)貼圖
cc.loader.release(texture);
// 釋放一個(gè) prefab 以及所有它依賴的資源
var deps = cc.loader.getDependsRecursively('prefabs/sample');
cc.loader.release(deps);
// 如果在這個(gè) prefab 中有一些和場(chǎng)景其他部分共享的資源枝誊,你不希望它們被釋放,可以將這個(gè)資源從依賴列表中刪除
var deps = cc.loader.getDependsRecursively('prefabs/sample');
var index = deps.indexOf(texture2d._uuid);
if (index !== -1)
    deps.splice(index, 1);
cc.loader.release(deps);
8惜纸、監(jiān)聽和發(fā)射事件

(1)監(jiān)聽事件

//target是可選參數(shù)叶撒,用于綁定響應(yīng)函數(shù)的調(diào)用者
//boolean是可選參數(shù)绝骚,默認(rèn)為false,表示冒泡流
this.node.on(event, fn, target, boolean);

(2)關(guān)閉監(jiān)聽

this.node.off(event, fn, target, boolean);

(3)發(fā)射事件

//為事件函數(shù)祠够,提供參數(shù)压汪,最多5個(gè)
this.node.emit(event, arg1, arg2, arg3);

(4)派送事件

//grandson.js
//升級(jí)版的on,冒泡到的節(jié)點(diǎn)古瓤,全部注冊(cè)事件
this.node.dispatchEvent( new cc.Event.EventCustom('foobar', true) );

//father.js
//在指定的上級(jí)節(jié)點(diǎn)中止剖,注冊(cè)相同的事件,阻止事件冒泡湿滓,手動(dòng)停止派送
this.node.on('foobar', function (event) {
  event.stopPropagation();
});

(5)事件對(duì)象(回調(diào)參數(shù)的event對(duì)象)

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)聽器仍然會(huì)接收到事件
stopPropagationImmediate Function 立即停止事件的傳遞扔水,事件將不會(huì)傳給父節(jié)點(diǎn)以及當(dāng)前節(jié)點(diǎn)的剩余監(jiān)聽器
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)
9、節(jié)點(diǎn)系統(tǒng)事件

(1)鼠標(biāo)事件類型和事件對(duì)象

枚舉對(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)在目標(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ài)松開時(shí)觸發(fā)一次
cc.Node.EventType.MOUSE_WHEEL mousewheel 當(dāng)鼠標(biāo)滾輪滾動(dòng)時(shí)
函數(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_LEFT或cc.Event.EventMouse.BUTTON_RIGHT或cc.Event.EventMouse.BUTTON_MIDDLE

(2)觸摸事件類型和事件對(duì)象

枚舉對(duì)象定義 對(duì)應(yīng)的事件名 事件觸發(fā)的時(shí)機(jī)
cc.Node.EventType.TOUCH_START touchstart 當(dāng)手指觸點(diǎn)落在目標(biāo)節(jié)點(diǎn)區(qū)域內(nèi)時(shí)
cc.Node.EventType.TOUCH_MOVE touchmove 當(dāng)手指在屏幕上目標(biāo)節(jié)點(diǎn)區(qū)域內(nèi)移動(dòng)時(shí)
cc.Node.EventType.TOUCH_END touchend 當(dāng)手指在目標(biāo)節(jié)點(diǎn)區(qū)域內(nèi)離開屏幕時(shí)
cc.Node.EventType.TOUCH_CANCEL touchcancel 當(dāng)手指在目標(biāo)節(jié)點(diǎn)區(qū)域外離開屏幕時(shí)
API 名 類型 意義
touch cc.Touch 與當(dāng)前事件關(guān)聯(lián)的觸點(diǎn)對(duì)象
getID Number 獲取觸點(diǎn)的 ID将宪,用于多點(diǎn)觸摸的邏輯判斷
getLocation Object 獲取觸點(diǎn)位置對(duì)象,對(duì)象包含 x 和 y 屬性
getLocationX Number 獲取觸點(diǎn)的 X 軸位置
getLocationY Number 獲取觸點(diǎn)的 Y 軸位置
getPreviousLocation Object 獲取觸點(diǎn)上一次觸發(fā)事件時(shí)的位置對(duì)象橡庞,對(duì)象包含 x 和 y 屬性
getStartLocation Object 獲取觸點(diǎn)初始時(shí)的位置對(duì)象较坛,對(duì)象包含 x 和 y 屬性
getDelta Object 獲取觸點(diǎn)距離上一次事件移動(dòng)的距離對(duì)象,對(duì)象包含 x 和 y 屬性

(3)其它事件

枚舉對(duì)象定義 對(duì)應(yīng)的事件名 事件觸發(fā)的時(shí)機(jī)
無(wú) position-changed 當(dāng)位置屬性修改時(shí)
無(wú) rotation-changed 當(dāng)旋轉(zhuǎn)屬性修改時(shí)
無(wú) scale-changed 當(dāng)縮放屬性修改時(shí)
無(wú) size-changed 當(dāng)寬高屬性修改時(shí)
無(wú) anchor-changed 當(dāng)錨點(diǎn)屬性修改時(shí)

PS:枚舉對(duì)象定義扒最、事件名等價(jià)丑勤,在回調(diào)參數(shù)中,作用相同吧趣。

10法竞、全局系統(tǒng)事件
//全局系統(tǒng)事件的類型
cc.SystemEvent.EventType.KEY_DOWN    //鍵盤按下
cc.SystemEvent.EventType.KEY_UP    //鍵盤釋放
cc.SystemEvent.EventType.DEVICEMOTION    //設(shè)備重力傳感

//綁定、解除全局系統(tǒng)事件
cc.systemEvent.on(event, fn, target, boolean);
cc.systemEvent.off(event, fn, target, boolean);
11强挫、動(dòng)作系統(tǒng)(變換系統(tǒng))

(1)動(dòng)作控制

// 執(zhí)行動(dòng)作
node.runAction(action);
// 停止一個(gè)動(dòng)作
node.stopAction(action);
// 停止所有動(dòng)作
node.stopAllActions();

// 給 action 設(shè)置 tag
var ACTION_TAG = 1;
action.setTag(ACTION_TAG);
// 通過(guò) tag 獲取 action
node.getActionByTag(ACTION_TAG);
// 通過(guò) tag 停止一個(gè)動(dòng)作
node.stopActionByTag(ACTION_TAG);

(2)容器動(dòng)作

//順序執(zhí)行
cc.sequence(action1, action2, ...);
//并發(fā)執(zhí)行
cc.spawn(action1, action2, ...);
//指定次數(shù)岔霸,重復(fù)執(zhí)行
cc.repeat(action, times)
//無(wú)限次數(shù),重復(fù)執(zhí)行
cc.repeatForever(action)
//改變動(dòng)作速度倍率纠拔,再執(zhí)行
cc.speed(action, rate)

(3)即時(shí)動(dòng)作

cc.show()    //立即顯示
cc.hide()    //立即隱藏
...

(4)時(shí)間間隔動(dòng)作

cc.moveTo()    //移動(dòng)到目標(biāo)位置
cc.rotateTo()    //旋轉(zhuǎn)到目標(biāo)角度
cc.scaleTo()    //將節(jié)點(diǎn)大小縮放到指定的倍數(shù)
...

(5)動(dòng)作回調(diào)

var finished = cc.callFunc(fn, target, arg);

(6)緩動(dòng)動(dòng)作

var action = cc.scaleTo(0.5, 2, 2);
//使用easeIn曲線秉剑,豐富動(dòng)作表現(xiàn)
action.easing(cc.easeIn(3.0));
...

PS:可以使用緩動(dòng)系統(tǒng),代替動(dòng)作系統(tǒng)稠诲。(緩動(dòng)系統(tǒng)的API更簡(jiǎn)約)

12侦鹏、計(jì)時(shí)器
//interval:以秒為單位的時(shí)間間隔
//repeat:重復(fù)次數(shù)
//delay:開始延時(shí)
this.schedule(fn, interval, repeat, delay)
this.unschedule(fn)
13诡曙、腳本執(zhí)行順序
editor: {
        //executionOrder越小,該組件相對(duì)其它組件就會(huì)越先執(zhí)行(默認(rèn)為0)
        //executionOrder只對(duì) onLoad, onEnable, start, update 和 lateUpdate 有效略水,對(duì) onDisable 和 onDestroy 無(wú)效
        executionOrder: 1
    }
14价卤、標(biāo)準(zhǔn)網(wǎng)絡(luò)接口

(1)XMLHttpRequest——短連接
(2)WebSocket——長(zhǎng)連接

15、對(duì)象池

對(duì)象池的概念
在同一場(chǎng)景中渊涝,需要多次進(jìn)行節(jié)點(diǎn)的生成慎璧、消失時(shí),假如直接進(jìn)行創(chuàng)建跨释、銷毀的操作胸私,就會(huì)很浪費(fèi)性能。因此鳖谈,使用對(duì)象池岁疼,存儲(chǔ)需要消失的節(jié)點(diǎn),釋放需要生成的節(jié)點(diǎn)缆娃,達(dá)到節(jié)點(diǎn)回收利用的目的捷绒。

工作流程
(1)初始化對(duì)象池

properties: {
    enemyPrefab: cc.Prefab    //準(zhǔn)備預(yù)制資源
},
onLoad: function () {
    this.enemyPool = new cc.NodePool();
    let initCount = 5;
    for (let i = 0; i < initCount; ++i) {
        let enemy = cc.instantiate(this.enemyPrefab); // 創(chuàng)建節(jié)點(diǎn)
        this.enemyPool.put(enemy); // 通過(guò) put 接口放入對(duì)象池
    }
}

(2)從對(duì)象池請(qǐng)求對(duì)象

createEnemy: function (parentNode) {
    let enemy = null;
    if (this.enemyPool.size() > 0) { // 通過(guò) size 接口判斷對(duì)象池中是否有空閑的對(duì)象
        enemy = this.enemyPool.get();
    } else { // 如果沒(méi)有空閑對(duì)象,也就是對(duì)象池中備用對(duì)象不夠時(shí)贯要,我們就用 cc.instantiate 重新創(chuàng)建
        enemy = cc.instantiate(this.enemyPrefab);
    }
    enemy.parent = parentNode; // 將生成的敵人加入節(jié)點(diǎn)樹
    enemy.getComponent('Enemy').init(); //接下來(lái)就可以調(diào)用 enemy 身上的腳本進(jìn)行初始化
}

(3)將對(duì)象返回對(duì)象池

onEnemyKilled: function (enemy) {
    // enemy 應(yīng)該是一個(gè) cc.Node
    this.enemyPool.put(enemy); // 和初始化時(shí)的方法一樣暖侨,將節(jié)點(diǎn)放進(jìn)對(duì)象池,這個(gè)方法會(huì)同時(shí)調(diào)用節(jié)點(diǎn)的 removeFromParent
}

清除對(duì)象池

//手動(dòng)清空對(duì)象池崇渗,銷毀其中緩存的所有節(jié)點(diǎn)
myPool.clear();

七字逗、發(fā)布游戲

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市宅广,隨后出現(xiàn)的幾起案子扳肛,更是在濱河造成了極大的恐慌,老刑警劉巖乘碑,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異金拒,居然都是意外死亡兽肤,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門绪抛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)资铡,“玉大人,你說(shuō)我怎么就攤上這事幢码◇孕荩” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵症副,是天一觀的道長(zhǎng)店雅。 經(jīng)常有香客問(wèn)我政基,道長(zhǎng),這世上最難降的妖魔是什么闹啦? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上波岛,老公的妹妹穿的比我還像新娘暖璧。我一直安慰自己,他們只是感情好琳袄,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布江场。 她就那樣靜靜地躺著,像睡著了一般窖逗。 火紅的嫁衣襯著肌膚如雪址否。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天滑负,我揣著相機(jī)與錄音在张,去河邊找鬼。 笑死矮慕,一個(gè)胖子當(dāng)著我的面吹牛帮匾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播痴鳄,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼瘟斜,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了痪寻?” 一聲冷哼從身側(cè)響起螺句,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎橡类,沒(méi)想到半個(gè)月后蛇尚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡顾画,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年取劫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片研侣。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谱邪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出庶诡,到底是詐尸還是另有隱情惦银,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站扯俱,受9級(jí)特大地震影響书蚪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蘸吓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一善炫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧库继,春花似錦箩艺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至拜英,卻和暖如春静汤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背居凶。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工虫给, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人侠碧。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓抹估,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親弄兜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子药蜻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359