歡迎入群學(xué)習(xí)交流:535098339
各路大神弄的資料
// 1.動(dòng)態(tài)加載資源
//第一個(gè)參數(shù)是resource下的文件名,不加后綴.function里第二個(gè)參數(shù)是資源類型
// 加載 Prefab
cc.loader.loadRes("test assets/prefab", function (err, prefab) {
let newNode = cc.instantiate(prefab);
cc.director.getScene().addChild(newNode);
});
// 加載 AnimationClip
cc.loader.loadRes("test assets/anim", function (err, clip) {
myNode.getComponent(cc.Animation).addClip(clip, "anim");
anim.play('anim'); //播放動(dòng)畫
});
// 加載 SpriteAtlas(圖集),并且獲取其中的一個(gè) SpriteFrame
// 注意 atlas 資源文件(plist)通常會(huì)和一個(gè)同名的圖片文件(png)放在一個(gè)目錄下, 所以需要在第二個(gè)參數(shù)指定資源類型
cc.loader.loadRes("test assets/sheep", cc.SpriteAtlas, function (err, atlas) {
let frame = atlas.getSpriteFrame('sheep_down_0');
sprite.spriteFrame = frame;
});
// 加載 SpriteFrame
cc.loader.loadRes("test assets/image", cc.SpriteFrame, function (err, spriteFrame) {
myNode.getComponent(cc.Sprite).spriteFrame = spriteFrame;
});
// 加載 SpriteFrame第二種方式
//這個(gè)方法與上一個(gè)方法不同的是直接改圖片的紋理,但凡是場(chǎng)景用到的test.png,一定會(huì)變成一樣的.如果要批量改一個(gè)預(yù)制體的圖片的話建議用上一個(gè)
sprite.spriteFrame.setTexture(cc.url.raw('res/test.png'));
//9.加載json
let url = cc.url.raw('resources/HeroDefault.json')
cc.loader.load(url, function (err, res) {
cc.log('load[' + url + '], err[' + err + '] result: ' + JSON.stringify(res));
});
// http://blog.csdn.net/alpha_xiao/article/details/52102252 這個(gè)比官網(wǎng)的詳細(xì),有示意圖,新手可以看
// http://sunmoon-x.com/cocoscreator%E8%B5%84%E6%BA%90%E5%8A%A0%E8%BD%BD1-3-1%E7%89%88%E6%9C%AC/ 這個(gè)可以更深入的了解加載資源.
//加載播放聲音
cc.audioEngine.play(cc.url.raw("resources/sounds/test.mp3" + url), false,1);
//加載網(wǎng)絡(luò)圖片
setSpriteFrame_sprite_url: function (sprite, url) { //設(shè)置網(wǎng)絡(luò)圖片
//加載https圖片失敗用下面方法.
// let url_http=url.replace('https','http')
cc.loader.load({
url: url,
type: 'png'
}, function (err, texture) {
if (err) {
console.log('加載圖片失敗' + err)
return;
}
sprite.spriteFrame = new cc.SpriteFrame(texture);
//sprite.spriteFrame.setTexture(texture) 希望你放棄setTexture這種方法,賊坑!
});
},
// 2.順序執(zhí)行動(dòng)作.
let moveTime = 0.2;
let x = 0;
let y = -32;
let action = cc.moveBy(moveTime, x, y); //向下移動(dòng)32像素
let finished = cc.callFunc(function (target, score) {
cc.log('回調(diào)發(fā)生')
}, this, 100)
let myAction = cc.sequence(action, finished);
// 3. 官方示例碰撞檢測(cè) 點(diǎn)擊剛體觸發(fā)事件
cc.Class({
extends: cc.Component,
properties: {
collider: {
default: null,
type: cc.PolygonCollider
},
title: {
default: null,
type: cc.Label
}
},
// use this for initialization
onLoad: function () {
cc.director.getCollisionManager().enabled = true;
cc.director.getCollisionManager().enabledDebugDraw = true;
this.title.string = 'normal';
cc.eventManager.addListener({
event: cc.EventListener.TOUCH_ONE_BY_ONE,
onTouchBegan: (touch, event) => {
let touchLoc = touch.getLocation();
if(cc.Intersection.pointInPolygon(touchLoc,this.collider.world.points)){
this.title.string = 'Hit';
} else {
this.title.string = 'Not hit';
}
return true;
},
}, this.node);
},
});
// 4.自定義類 把類作為一個(gè)對(duì)象的屬性,比如二維數(shù)組的實(shí)現(xiàn)
let Item = cc.Class({
name: 'Item',
properties: {
id: 0,
itemName: '',
itemPrice: 0,
iconSF: cc.SpriteFrame
}
});
cc.Class({
extends: cc.Component,
properties: {
items: {
default: [],
type: Item
}
},
});
//5.得到一個(gè)節(jié)點(diǎn)
this._player = this.node.getChildByName('player');
this._player = cc.find('Canvas/player')
//6.設(shè)置顏色
this.node.color = cc.Color.RED; //默認(rèn)是WHITE.
//7.導(dǎo)入外部腳本
let cfg = 1;
module.exports = cfg; //這兩句是cfg.js 在other.js里獲取cfg的值用: let cfg=require('cfg');
//module.exports 是一個(gè)空對(duì)象,也可以像下面那樣來(lái)獲得cfg
module.exports = {
getCfg: function () {
return cfg;
},
}
//8.用本地?cái)?shù)據(jù)庫(kù)保存設(shè)置,游戲存檔之類的.
if (JSON.parse(cc.sys.localStorage.getItem('config')) !== undefined) {
let config = JSON.parse(cc.sys.localStorage.getItem('config'));
}
cc.sys.localStorage.setItem('config', JSON.stringify(config));
//9.音頻默認(rèn)是使用 webAudio 的方式加載并播放的向胡,只有在不支持的瀏覽器才會(huì)使用 dom 元素加載播放恼蓬。
cc.loader.load(cc.url.raw('resources/background.mp3'), callback);
//10.長(zhǎng)按實(shí)現(xiàn)人物持續(xù)移動(dòng)
const self=this;
this.node.on(cc.Node.EventType.TOUCH_START, function (event) {
this.cb = function () {
cc.log("長(zhǎng)按")
};
self.scheduleOnce(this.cb, 0.15);
}, this.node);
this.node.on(cc.Node.EventType.TOUCH_END, function (event) {
self.unschedule(this.cb);
}, this.node);
//11 本地存儲(chǔ)圖片,用原生
loadNative = function (url, callback) {
let dirpath = jsb.fileUtils.getWritablePath() + 'img/';
let filepath = dirpath + MD5(url) + '.png';
function loadEnd() {
cc.loader.load(filepath, function (err, tex) {
if (err) {
cc.error(err);
} else {
let spriteFrame = new cc.SpriteFrame(tex);
if (spriteFrame) {
spriteFrame.retain();
callback(spriteFrame);
}
}
});
}
if (jsb.fileUtils.isFileExist(filepath)) {
cc.log('Remote is find' + filepath);
loadEnd();
return;
}
let saveFile = function (data) {
if (typeof data !== 'undefined') {
if (!jsb.fileUtils.isDirectoryExist(dirpath)) {
jsb.fileUtils.createDirectory(dirpath);
}
if (jsb.fileUtils.writeDataToFile(new Uint8Array(data), filepath)) {
cc.log('Remote write file succeed.');
loadEnd();
} else {
cc.log('Remote write file failed.');
}
} else {
cc.log('Remote download file failed.');
}
};
let xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
cc.log("xhr.readyState " + xhr.readyState);
cc.log("xhr.status " + xhr.status);
if (xhr.readyState === 4) {
if (xhr.status === 200) {
xhr.responseType = 'arraybuffer';
saveFile(xhr.response);
} else {
saveFile(null);
}
}
}.bind(this);
xhr.open("GET", url, true);
xhr.send();
};
// 設(shè)置適配模式
cc.view.setOrientation(cc.macro.ORIENTATION_PORTRAIT);
cc.view.setDesignResolutionSize(750, 1334, 0);
//然后場(chǎng)景里的節(jié)點(diǎn)加上widget適配.
//后臺(tái)監(jiān)聽函數(shù)
cc.game.on(cc.game.EVENT_HIDE, function(event){
cc.log("切換后臺(tái)",event);
});
cc.game.on(cc.game.EVENT_SHOW, function(event){
cc.log("切換前臺(tái)",event);
});
//得到j(luò)ava的變量
var id = jsb.reflection.callStaticMethod("org/cocos2dx/javascript/JsbService", "getUidToken", "()Ljava/lang/String;");
var result = jsb.reflection.callStaticMethod("org/cocos2dx/javascript/JsbService", "getBatteryPercent", "()I");
jsb.reflection.callStaticMethod("org/cocos2dx/javascript/JsbService", "wxShareUrl", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V", url, title, desc, type);
//取消node的所有監(jiān)聽
this.node.targetOff(this.node);
//取消計(jì)時(shí)器的所有監(jiān)聽
this.unscheduleAllCallbacks();
//--->>> 動(dòng)作,類似c2dx api 基本無(wú)變化
var mTo = cc.moveBy(1,-100, -200);
var mAction = cc.repeatForever(cc.sequence(cc.moveBy(1,-100, -200),mTo.reverse(),cc.delayTime(0.5),cc.callFunc(function(action,data){
console.log("action callback:"+data.himi);
},this,{tx:100,himi:"i'm action callback and bring data"})));
mySprite.node.runAction(mAction);
//暫停動(dòng)作
mySprite.node.stopAction(mAction);
//
順便提一下cocos creator里是通過(guò)設(shè)置 節(jié)點(diǎn)的 active 屬性僵芹,來(lái)控制可見性的处硬,
setPosition等方法只能修改本節(jié)點(diǎn),不能修改附屬的子節(jié)點(diǎn)拇派,但是可以通過(guò)給父節(jié)點(diǎn)加動(dòng)作runAction(cc.MoveTo(...))郁油,來(lái)變相達(dá)到想要的效果
動(dòng)作系統(tǒng):https://blog.csdn.net/likendsl/article/details/53413050
//按鈕全局添加音效事件
cc.Component.EventHandler._emitEvents = cc.Component.EventHandler.emitEvents;
cc.Component.EventHandler.emitEvents = function (clickEvents, event) {
if (event instanceof cc.Event.EventTouch) {
if (event.type == "touchend") {
cc.ss.sound.playEffect("buttonclick.mp3")
}
}
cc.Component.EventHandler._emitEvents.apply(this, arguments);
};
//設(shè)置場(chǎng)景全局加速
cc.director.getScheduler().setTimeScale(1.5);
cc.director.getPhysicsManager().enabledAccumulator = true;
cc.director.getPhysicsManager().FIXED_TIME_STEP = 1 / 20
某大神關(guān)于性能優(yōu)化的一些見解https://forum.cocos.com/t/topic/75032/2
不清楚你用的版本是否可以使用渲染組件了。
可以的話攀痊,魚如果可以用instance來(lái)渲染,理論上可以大幅度地減少drawcall拄显。
骨骼動(dòng)畫的定制我也不太清除引擎組的進(jìn)度苟径。但是以我最近在寫的骨骼動(dòng)畫來(lái)說(shuō),減少動(dòng)畫K幀的數(shù)目躬审,應(yīng)該可以減少找插值的關(guān)鍵幀的時(shí)間棘街,但這個(gè)不一定是瓶頸。
有一個(gè)很值得注意的地方承边,不開啟碰撞檢測(cè)的時(shí)候遭殉,還有30ms,但是加上碰撞檢測(cè)博助,達(dá)到了幾百ms险污,有理由懷疑瓶頸在 碰撞檢測(cè) 上,或者說(shuō)富岳,由于碰撞后邏輯導(dǎo)致的 骨骼動(dòng)畫顯示蛔糯,消失,導(dǎo)致提交的cmdbuffer需要不斷重新創(chuàng)建窖式,骨骼動(dòng)畫不斷調(diào)用構(gòu)造函數(shù)蚁飒,析構(gòu)函數(shù)的開銷
至于解決方案:
前者好說(shuō),用上 場(chǎng)景管理樹 :hlbvh, quat-tree, 應(yīng)該都有現(xiàn)成的萝喘,感興趣可以去看看bullet物理引擎的官方文檔,里面碰撞檢測(cè)管線的描述很詳細(xì)实抡,這可以減少碰撞檢測(cè)的開銷熏版,但是不好說(shuō)減少多少,畢竟場(chǎng)景也沒(méi)多少物體哼丈。
后者呢,老生常談凸椿,用 對(duì)象池 吧削祈。如果開銷瓶頸不是動(dòng)畫,而是創(chuàng)建和析構(gòu)上脑漫,那么回收骨骼動(dòng)畫的時(shí)候髓抑,最好不要將骨骼動(dòng)畫的節(jié)點(diǎn)從節(jié)點(diǎn)樹上拿下來(lái),而是 將骨骼動(dòng)畫移動(dòng)到屏幕外(移動(dòng)到場(chǎng)景外优幸,會(huì)破壞場(chǎng)景管理樹的結(jié)構(gòu)吨拍,需要重新創(chuàng)建,所以記得profile一下性能瓶頸网杆,究竟是碰撞是瓶頸羹饰,還是渲染是瓶頸,得出結(jié)論后碳却,再?zèng)Q定是否要移動(dòng)骨骼動(dòng)畫到場(chǎng)景外队秩,這是一環(huán)套一環(huán)的) ,然后可以進(jìn)行一下嘗試:
1.將節(jié)點(diǎn)的active設(shè)置為false
2.將節(jié)點(diǎn)的動(dòng)畫停掉昼浦,
3.將節(jié)點(diǎn)的透明度設(shè)置為0
并且這幾個(gè)方案都嘗試一下吧馍资。哪一個(gè)真正能提高性能,我最近也在寫游戲引擎关噪,個(gè)人愚見鸟蟹,這個(gè)和引擎開發(fā)者,做出的 設(shè)計(jì)取舍 有關(guān)使兔。最好去問(wèn)問(wèn)做這一塊的引擎開發(fā)者