/** * 主场景 */ cc.Class({ extends: cc.Component, properties: { // 标题 title: { default: null, type: cc.Label, }, // 选项(带声音) op_sound: { default: null, type: cc.Prefab, }, // 选项(图片) op_pic: { default: null, type: cc.Prefab, }, }, // 生命周期 onLoad onLoad() { this.initSceneData(); this.initSize(); }, _imageResList: null, _audioResList: null, _animaResList: null, initSceneData() { this._imageResList = []; this._audioResList = []; this._animaResList = []; }, _designSize: null, // 设计分辨率 _frameSize: null, // 屏幕分辨率 _mapScaleMin: null, // 场景中常用缩放(取大值) _mapScaleMax: null, // 场景中常用缩放(取小值) _cocosScale: null, // cocos 自缩放 (较少用到) initSize() { // 注意cc.winSize只有在适配后(修改fitHeight/fitWidth后)才能获取到正确的值,因此使用cc.getFrameSize()来获取初始的屏幕大小 let screen_size = cc.view.getFrameSize().width / cc.view.getFrameSize().height; let design_size = cc.Canvas.instance.designResolution.width / cc.Canvas.instance.designResolution.height; let f = screen_size >= design_size; cc.Canvas.instance.fitHeight = f; cc.Canvas.instance.fitWidth = !f; const frameSize = cc.view.getFrameSize(); this._frameSize = frameSize; this._designSize = cc.view.getDesignResolutionSize(); let sx = cc.winSize.width / frameSize.width; let sy = cc.winSize.height / frameSize.height; this._cocosScale = Math.min(sx, sy); sx = frameSize.width / this._designSize.width; sy = frameSize.height / this._designSize.height; this._mapScaleMin = Math.min(sx, sy) * this._cocosScale; this._mapScaleMax = Math.max(sx, sy) * this._cocosScale; }, // 生命周期 start start() { let getData = this.getData.bind(this); if (window && window.courseware) { getData = window.courseware.getData; } getData((data) => { console.log("data:", data); this.data = data; this.data = JSON.parse(JSON.stringify(this.data)); this.preloadItem(); }); }, preloadItem() { // this.addPreloadImage(); // this.addPreloadAudio(); // this.addPreloadAnima(); // this.preload(); this.initView(); }, addPreloadImage() { for (var i = 0; i < this.data.total; i++) { this._imageResList.push({ url: this.data["pic_url_" + i] }); } }, addPreloadAudio() { for (var i = 0; i < this.data.total; i++) { this._audioResList.push({ url: this.data["audio_url_" + i] }); } }, addPreloadAnima() {}, preload() { const preloadArr = this._imageResList.concat(this._audioResList).concat(this._animaResList); cc.assetManager.loadAny(preloadArr, null, null, (err, data) => { this.loadEnd(); if (window && window["air"]) { window["air"].hideAirClassLoading(); } cc.debug.setDisplayStats(false); }); }, loadEnd() { this.initData(); this.initAudio(); this.initView(); }, _cantouch: null, initData() { // 所有全局变量 默认都是null this._cantouch = true; }, audioBtn: null, initAudio() { const audioNode = cc.find("Canvas/res/audio"); const getAudioByResName = (resName) => { return audioNode.getChildByName(resName).getComponent(cc.AudioSource); }; this.audioBtn = getAudioByResName("btn"); }, initView() { this.initBg(); this.initPic(); // 初始化title this.title.string = this.data.title; this.title.node.on(cc.Node.EventType.TOUCH_START, () => { this.playAudioByUrl(this.data.audio_title); }); if (window && window["air"]) { window["air"].hideAirClassLoading(); } // for (var i = 0; i < this.data.total; i++) { // const op_s = cc.instantiate(this.op_sound); // op_s.getComponent("op_sound")._opId = i; // op_s.getComponent("op_sound")._soundUrl = this.data["audio_url_" + i]; // const op_p = cc.instantiate(this.op_pic); // op_p.getComponent("op_pic")._opId = i; // op_p.getComponent("op_pic").setPic(this.data["pic_url_" + i]); // } }, initBg() { const bgNode = cc.find("Canvas/bg"); bgNode.scale = this._mapScaleMax; }, pic1: null, pic2: null, initPic() { const canvas = cc.find("Canvas"); const maxW = canvas.width * 0.7; this.getSprNodeByUrl(this.data.pic_url, (sprNode) => { const picNode1 = sprNode; picNode1.scale = maxW / picNode1.width; picNode1.baseX = picNode1.x; canvas.addChild(picNode1); this.pic1 = picNode1; const labelNode = new cc.Node(); labelNode.color = cc.Color.YELLOW; const label = labelNode.addComponent(cc.Label); label.string = this.data.text; label.fontSize = 60; label.lineHeight = 60; label.font = cc.find("Canvas/res/font/BRLNSDB").getComponent("cc.Label").font; picNode1.addChild(labelNode); }); this.getSprNodeByUrl(this.data.pic_url_2, (sprNode) => { const picNode2 = sprNode; picNode2.scale = maxW / picNode2.width; canvas.addChild(picNode2); picNode2.x = canvas.width; picNode2.baseX = picNode2.x; this.pic2 = picNode2; const labelNode = new cc.Node(); const label = labelNode.addComponent(cc.RichText); const size = 60; label.font = cc.find("Canvas/res/font/BRLNSDB").getComponent(cc.Label).font; label.string = `<outline color=#751e00 width=4><size=${size}><color=#ffffff>${this.data.text}</color></size></outline>`; label.lineHeight = size; picNode2.addChild(labelNode); }); }, // ------------------------------------------------ getSprNode(resName) { const sf = cc.find("Canvas/res/img/" + resName).getComponent(cc.Sprite).spriteFrame; const node = new cc.Node(); node.addComponent(cc.Sprite).spriteFrame = sf; return node; }, getSpriteFrimeByUrl(url, cb) { cc.loader.load({ url }, (err, img) => { const spriteFrame = new cc.SpriteFrame(img); if (cb) { cb(spriteFrame); } }); }, getSprNodeByUrl(url, cb) { const node = new cc.Node(); const spr = node.addComponent(cc.Sprite); this.getSpriteFrimeByUrl(url, (sf) => { spr.spriteFrame = sf; if (cb) { cb(node); } }); }, playAudioByUrl(audio_url, cb = null) { if (audio_url) { cc.assetManager.loadRemote(audio_url, (err, audioClip) => { const audioId = cc.audioEngine.play(audioClip, false, 0.8); if (cb) { cc.audioEngine.setFinishCallback(audioId, () => { cb(); }); } }); } }, // ------------------------------------------ });