Creator 常用方法
基础方法
var str = JSON.stringify(jsObj);// 对象转String
var obj = JSON.parse(str);// String转对象
cc.debug.setDisplayStats(false);// 隐藏debug
cc.director.loadScene('SceneName');// 切换场景
var label = this.node.getComponent(cc.Label);// 获取组件
var label = this.getComponent(cc.Label);
var script = this.addComponent("MarkScript");
var label = this.node.getComponentInChildren(cc.Label);
label.string = "title";// 更新Label文字
var rand = Math.floor(Math.random()*100);// 随机数(0 - 99)
var playerPos = this.game.player.getPosition(); // 节点坐标
var distance = point1.sub(point2).mag();// 两点之间的距离
this.node.destroy(); // 销毁节点
this.node.removeFromParent();
this.sprite.spriteFrame = spriteFrame; // 更改纹理
this.bgSprite.node.color = cc.color(0, 128, 255); //更改颜色
var music = cc.audioEngine.play(musicRes, false); // 播放音乐
cc.audioEngine.stop(music); // 停止播放
定时任务
var marginTime = 5; var repeat = 3; var delay = 10;
repeat=cc.macro.REPEAT_FOREVER;
this.schedule(function () { this.doSomething(); }, marginTime, repeat, delay);
this.scheduleOnce(function () { this.doSomething(); }, 2);
this.unschedule(scheduleCallback);
JS日期格式化
var DateUtil = require('DateUtil');
var DateUtil = {
dateFormat: function (fmt, date) {
if (!date) {
date = new Date();
}
let ret;
const opt = {
"Y+": date.getFullYear().toString(), // 年
"M+": (date.getMonth() + 1).toString(), // 月
"d+": date.getDate().toString(), // 日
"H+": date.getHours().toString(), // 时
"m+": date.getMinutes().toString(), // 分
"s+": date.getSeconds().toString() // 秒
// 有其他格式化字符需求可以继续添加,必须转化成字符串
};
for (let k in opt) {
ret = new RegExp("(" + k + ")").exec(fmt);
if (ret) {
fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
};
};
return fmt;
}
}
module.exports = DateUtil;
数据存储
var userData = { name: 'alex', level: 1, gold: 100 };
cc.sys.localStorage.setItem(keyString, JSON.stringify(userData));
var savedData = cc.sys.localStorage.getItem(keyString);
var userData = JSON.parse(savedData);
资源加载
// 加载Resources文件夹内的资源文件:不需要带文件后缀名
cc.resources.load(path, function (err, res) {
if (err) {
func.call(this, err);
} else {
func.call(this, null, res.text);// 文本字符串
func.call(this, null, res.json);// json对象
func.call(this, null, res);// 音乐,视频
func.call(this, null, new cc.SpriteFrame(res));// 图片
}
});
// 加载本地资源文件:需要带后缀名
if (jsb.fileUtils.isFileExist(path)) {
cc.assetManager.loadAny({ url: path }, function (err, res) {
if(err){
func.call(this, err);
} else {
func.call(this, null, res);// 文本字符串
func.call(this, null, res);// json对象
func.call(this, null, res);// 音乐,视频
var texture = new cc.Texture2D();
texture.initWithElement(res);
texture.handleLoadedTexture();
func.call(this, null, new cc.SpriteFrame(texture)); // 图片
}
})
} else {
func.call(this, "file not exist");
}
动态增加 Prefab
var prefab = cc.instantiate(this.Prefab);
var script = prefab.getComponent('PrefabScript');
var callback = {
onItemClicked(itemData) {
},
};
script.setData(itemData, callback);
this.node.addChild(prefab);
prefab.setPosition(cc.v2(0, 0));
全局工具类
var Utils = require('Utils');
var Utils = {
items: new Array(),
HOST: “http://www.xxxxxx.com”,
}
module.exports = Utils;
可在UI展示的日志工具类
// Log.js
var Log = {
i(obj1, obj2, obj3, obj4, obj5) {
if (obj5 == undefined) {
if (obj4 == undefined) {
if (obj3 == undefined) {
if (obj2 == undefined) {
cc.log(obj1);
} else {
cc.log(obj1, obj2);
}
} else {
cc.log(obj1, obj2, obj3);
}
} else {
cc.log(obj1, obj2, obj3, obj4);
}
} else {
cc.log(obj1, obj2, obj3, obj4, obj5);
}
if (this.onUpdate) {
if (obj1 != undefined) { this.onUpdate(obj1); }
if (obj2 != undefined) { this.onUpdate(obj2); }
if (obj3 != undefined) { this.onUpdate(obj3); }
if (obj4 != undefined) { this.onUpdate(obj4); }
if (obj5 != undefined) { this.onUpdate(obj5); }
}
},
// onUpdate(appendLogText) { },
}
module.exports = Log;
键盘鼠标事件监听
cc.systemEvent.on(cc.SystemEvent.EventType.KEY_DOWN, function (event) {
console.log(event.keyCode);
}, this);
cc.systemEvent.on(cc.SystemEvent.EventType.KEY_DOWN, function (event) {
switch (event.keyCode) {
case cc.macro.KEY.space:
break;
}
}, this);
cc.systemEvent.on(cc.SystemEvent.EventType.MOUSE_DOWN, function (event) {
console.log(event.getLocation());
}, this);
cc.systemEvent.on(cc.SystemEvent.EventType.TOUCH_START, callback, this.node);
cc.systemEvent.on(cc.SystemEvent.EventType.TOUCH_MOVE, callback, this.node);
cc.systemEvent.on(cc.SystemEvent.EventType.TOUCH_END, callback, this.node);
cc.systemEvent.on(cc.SystemEvent.EventType.TOUCH_CANCEL, callback, this.node);
动作系统
moveBy, rotateTo, scaleTo, delayTime, jumpBy, fadeTo[透明度], fadeIn, fadeOut, blink[闪烁]
var move = cc.moveBy(animTime, moveX, moveY);
var moveBack = cc.moveBy(animTime, -moveX, -moveY);
var scale = cc.scaleTo(animTime, scaleX, scaleY);
var oneByOneAnim = cc.sequence(action1, action2);
var allStartAnim = cc.spawn(move, scale);
var repeatAnim = cc.repeat(cc.sequence(move, moveBack), repeatTime);
var repeatForeverAnim = cc.repeatForever(cc.sequence(move, moveBack));
var speedUpAnim = cc.speed(cc.spawn(move, scale), 0.5);
node.runAction(anim);
var jumpUp = cc.moveBy(this.jumpDuration, cc.p(0, this.jumpHeight)).easing(cc.easeCubicActionOut());
var jumpDown = cc.moveBy(this.jumpDuration, cc.p(0, -this.jumpHeight)).easing(cc.easeCubicActionIn());
var jumpAction = cc.repeatForever(cc.sequence(jumpUp, jumpDown));
this.node.runAction(jumpAction);
碰撞回调
init () {
var manager = cc.director.getCollisionManager();
manager.enabled = true;
manager.enabledDebugDraw = true;
},
/**
* 当碰撞产生的时候调用
* @param {Collider} other 产生碰撞的另一个碰撞组件
* @param {Collider} self 产生碰撞的自身的碰撞组件
*/
onCollisionEnter: function (other, self) {
console.log('on collision enter');
// 碰撞系统会计算出碰撞组件在世界坐标系下的相关的值,并放到 world 这个属性里面
var world = self.world;
// 碰撞组件的 aabb 碰撞框
var aabb = world.aabb;
// 上一次计算的碰撞组件的 aabb 碰撞框
var preAabb = world.preAabb;
// 碰撞框的世界矩阵
var t = world.transform;
// 以下属性为圆形碰撞组件特有属性
var r = world.radius;
var p = world.position;
// 以下属性为 矩形 和 多边形 碰撞组件特有属性
var ps = world.points;
},
/**
* 当碰撞产生后,碰撞结束前的情况下,每次计算碰撞结果后调用
* @param {Collider} other 产生碰撞的另一个碰撞组件
* @param {Collider} self 产生碰撞的自身的碰撞组件
*/
onCollisionStay: function (other, self) {
console.log('on collision stay');
},
/**
* 当碰撞结束后调用
* @param {Collider} other 产生碰撞的另一个碰撞组件
* @param {Collider} self 产生碰撞的自身的碰撞组件
*/
onCollisionExit: function (other, self) {
console.log('on collision exit');
}
瓦片地图
step1: "新建地图",
step2: "导入瓦片地图文件",
step3: "新建ground图层",
step4: "新建barriers图层",
step5: "新建actions对象层",
step6: "对象层新建,擦入图块,填写描述,写入数据",
JS 常用方法
JSB fileUtils
jsb.fileUtils.isFileExist(filePath);
jsb.fileUtils.isDirectoryExist(foldPath);
jsb.fileUtils.createDirectory(foldPath);
jsb.fileUtils.getStringFromFile(stringContent, filePath);
jsb.fileUtils.writeStringToFile(stringContent, filePath);
jsb.fileUtils.getDataFromFile(dataContent, filePath);
jsb.fileUtils.writeDataToFile(dataContent, filePath);
jsb.fileUtils.removeFile(filePath);
jsb.fileUtils.getWritablePath();
JS 数组
var size = array.length;
var string = array.toString();// "a,b,c,d,e"
var string = array.join("-");// "a-b-c-d-e"
var newSize = array.push(item1, item2);// 数组追加元素,并返回新数组长度
var newSize = array.unshift(item); // 数组从前面追加元素,并返回新数组长度
var lastItem = array.pop();// 删除数组最后一个元素,并返回该元素
var firstItem = array.shift(); // 删除数组第一个元素,并返回该元素
delete array[0];// 把 array 中的首个元素改为 undefined
array.splice(position, deleteCount, "addItem1", "addItem2");// 方法返回一个包含已删除项的数组
array.splice(0, 1);// 删除 array 中的第一个元素
var array3 = array1.concat(array2); // 连接2个数组
var array4 = array1.concat(array2, array3);// 连接3个数组
var array5 = array1.concat(array2, item1, [item2, item3]);// 连接多个数组和元素
var array2 = array1.slice(startPosition, endPosition);// 从数组中截取一个新数组
array.sort();// 字符串数组排序
array.sort(function(a, b) { return a.price - b.price; });// 原数按规则排序
array.sort(function(a, b){return 0.5 - Math.random()}); // 随机排序,打乱顺序
JS Map
var map = new Map();
map.set("id", { name: "", age: 10 });
map.set({ id: "", attr: "" }, { name: "", age: 10 });
map.has("id");
map.get("id").age;
map.delete("id");
map.keys();
map.values();
map.clear();
JS String
var char = string.charAt(index);
var charCode = string.charCodeAt(index);
var string4 = string.concat(string2, string3);
var index = string.indexOf("", formIndex);
var string = string.replace(/orgString/, "targetString");
var string = string.replace(/orgString/g, "targetString");
var array = string.split("\n");
var string = string.substr(start, length);
var string = string.substring(start, stop);
网络请求Get
get(url, callback) {
var xhr = new XMLHttpRequest();
xhr.onload = function () { // 请求成功回调
var response = xhr.responseText;
callback.call(this, null, response);
};
xhr.onerror = function () { // 请求出错回调
callback.call(this, "http error");
};
xhr.onloadend = function () { // 请求结束回调
};
xhr.ontimeout = function () { // 请求超时回调
callback.call(this, "http timeout");
};
xhr.setRequestHeader('key', 'value'); // 设置请求头
xhr.open("GET", url, true);
xhr.send();
},
网络请求Post
post(url, body, callback) {
var xhr = new XMLHttpRequest();
xhr.onload = function () {
var response = xhr.responseText;
callback.call(this, null, response);
};
xhr.onerror = function () {
callback.call(this, "http error");
};
xhr.onloadend = function () {
};
xhr.ontimeout = function () {
callback.call(this, "http timeout");
};
xhr.open("POST", url, true);
xhr.send(body);
},
文件下载
downloadFile(filePath, url, callback, skipExist) {
if (skipExist && jsb.fileUtils.isFileExist(filePath)) {
callback.onSuccess(filePath);
return;
}
var downloader = new jsb.Downloader();
downloader.createDownloadFileTask(url, filePath, "identifier");
var errorCallback = function (sender, errorCode, errorCodeInternal, errorMsg) {
Log.i(sender, errorCode, errorCodeInternal, errorMsg);
jsb.fileUtils.removeFile(filePath);
if (callback.onFailed) {
callback.onFailed(errorMsg);
}
};
var progressCallback = function (sender, buffer, receivedBytes, totalSize) {
if (callback.onProgress) {
var progress = receivedBytes / totalSize;
callback.onProgress(progress, filePath);
}
};
var successCallback = function (sender) {
if (callback.onSuccess) {
callback.onSuccess(filePath);
}
};
downloader.setOnTaskError(errorCallback);
downloader.setOnTaskProgress(progressCallback);
downloader.setOnFileTaskSuccess(successCallback);
},
JSZip解压
// 首先将 jszip.min.js 导入工程作为插件
// Utils.js
unZipFiles(zipFilePath, foldPath, callback) {
cc.log("zipFilePath:" + zipFilePath);
jsb.fileUtils.createDirectory(foldPath);
var zip = new JSZip();
var subCount = 0;
var count = 0;
var _unzipFirstFile = function (res, files) {
var file = files.shift();
if (!file) {
callback.onCompleted();
}
var name = file.name;
if (!file.dir) {
if (name.indexOf(".jpg") != -1) {
res.file(name).async('uint8array').then(uint8array => {
jsb.fileUtils.writeDataToFile(uint8array, foldPath + "/" + name);
callback.onFileUnziped(name, ++count, subCount);
_unzipFirstFile(res, files);
}, error => {
++count;
callback.onFileIgnored(name, count, subCount, error);
_unzipFirstFile(res, files);
})
} else {
++count;
callback.onFileIgnored(name, count, subCount, "not .jpg file");
_unzipFirstFile(res, files);
}
} else {
++count;
jsb.fileUtils.createDirectory(foldPath + "/" + name);
callback.onFileIgnored(name, count, subCount, "create directory");
_unzipFirstFile(res, files);
}
};
zip.loadAsync(jsb.fileUtils.getDataFromFile(zipFilePath)).then(function (res) {
callback.onStart();
var fileArray = Object.values(res.files);
subCount = fileArray.length;
_unzipFirstFile(res, fileArray);
}, function (error) {
callback.onError(error);
});
},
// MainSceneScript.js
unzipFromResourcesFoldTest {
cc.resources.load("common/image", cc.Asset, function (err, res) {
if (err) {
cc.log(err);
} else {
var Utils = require('Utils');
var zipCallback = {
onStart() { },
onCompleted() { cc.log("onCompleted"); },
onError(error) { cc.log("onUnzipError"); },
onFileUnziped(name, count, subCount) {
cc.log("正在解压资源(" + parseInt(count / subCount * 100) + "%):" + name);
},
onFileIgnored(name, count, subCount, reason) {
cc.log("正在解压资源(" + parseInt(count / subCount * 100) + "%):" + name);
},
}
var unzipFold = Config.ROOT_PATH;
Utils.unZipFiles(res.nativeUrl, unzipFold, zipCallback);
}
});
}