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