Scene.js 11.1 KB
const saveKey = "DataKey_Cocos_FT11";
const BaseUI = require('BaseUI');
cc.Class({

	extends: BaseUI,

	properties: {
		audEnter: cc.AudioClip,
		audMove: cc.AudioClip,
		audMerge: cc.AudioClip,
		audClick: cc.AudioClip,
		pfbItemAnswer: cc.Prefab,
		pfbItemQuestion: cc.Prefab,
		layerOver: cc.Prefab,
	},

	// 生命周期 onLoad
	onLoad() {
		this._super();
		this.initNodes();
		this.initSceneData();
		this.initSize();
	},
	initNodes() {

	},

	onEnable() {

	},

	onDisable() {

	},

	_resList: null,
	initSceneData() {
		this._resList = [];
		window.GameData = {};
	},

	_designSize: null,  // 设计分辨率
	_frameSize: null,  // 屏幕分辨率
	_mapScaleMin: null,  // 场景中常用缩放(取大值)
	_mapScaleMax: null,  // 场景中常用缩放(取小值)
	_cocosScale: null,  // cocos 自缩放 (较少用到)
	initSize() {

	},


	// 生命周期 start
	start() {
		this.getData((data) => {
			console.log('data:', data);
			this.data = data;
			if (data) {
				this.preloadItem()
			}
		})
	},

	getData(cb) {
		// 获取数据
		if (window.courseware) {
			const getData = window.courseware.getData;
			getData((data) => {
				data = data || this.getDefaultData();
				cb && cb(data);
			}, saveKey);
		} else {
			cb && cb(this.getDefaultData());
		}
	},

	getDefaultData() {
		let dataJson = '{"questionList":[{"questionAudio":"http://staging-teach.cdn.ireadabc.com/d2a9d8815d0370dc3b9aa18987dee584.mp3","questionText":"这是标题文本1","optionList":[{"text":"i am jumping","optionDragonBone":{"skeJsonData":{"url":""},"texJsonData":{"url":""},"texPngData":{"url":""},"skeJsonData2":{"url":""},"texJsonData2":{"url":""},"texPngData2":{"url":""}},"optionAudio":"http://staging-teach.cdn.ireadabc.com/4e267b9c0b58ebb153bfc0ae520cb7fe.mp3"},{"text":"i am rolling","optionDragonBone":{"skeJsonData":{"url":"http://staging-teach.cdn.ireadabc.com/48b884b3c7b3a717f6e4b055f490a1f1.json","name":"walkingfish_ske.json"},"texJsonData":{"url":"http://staging-teach.cdn.ireadabc.com/608b2c5f85297f0b7930325733b7bea9.json","name":"walkingfish_tex.json"},"texPngData":{"url":"http://staging-teach.cdn.ireadabc.com/ecfd66f932659635f5b66642378d826b.png","name":"walkingfish_tex.png"},"skeJsonData2":{"url":""},"texJsonData2":{"url":""},"texPngData2":{"url":""}},"optionAudio":"http://staging-teach.cdn.ireadabc.com/90fd9908a33a3d087ac53e6f7d794c18.mp3"},{"text":"i am dancing","optionDragonBone":{"skeJsonData":{"url":""},"texJsonData":{"url":""},"texPngData":{"url":""},"skeJsonData2":{"url":""},"texJsonData2":{"url":""},"texPngData2":{"url":""}},"optionAudio":""},{"text":"i am drving","optionDragonBone":{"skeJsonData":{"url":""},"texJsonData":{"url":""},"texPngData":{"url":""},"skeJsonData2":{"url":""},"texJsonData2":{"url":""},"texPngData2":{"url":""}},"optionAudio":""}]},{"questionAudio":"","questionText":"这是标题文本2","optionList":[{"text":"标题文本21","optionDragonBone":{"skeJsonData":{"url":""},"texJsonData":{"url":""},"texPngData":{"url":""},"skeJsonData2":{"url":""},"texJsonData2":{"url":""},"texPngData2":{"url":""}},"optionAudio":""},{"text":"标题文本22","optionDragonBone":{"skeJsonData":{"url":""},"texJsonData":{"url":""},"texPngData":{"url":""},"skeJsonData2":{"url":""},"texJsonData2":{"url":""},"texPngData2":{"url":""}},"optionAudio":""},{"text":"标题文本23","optionDragonBone":{"skeJsonData":{"url":""},"texJsonData":{"url":""},"texPngData":{"url":""},"skeJsonData2":{"url":""},"texJsonData2":{"url":""},"texPngData2":{"url":""}},"optionAudio":""}]}]}';
		let data = JSON.parse(dataJson);
		return data;
	},

	preloadItem() {
		this.addPreloadItem();
		this.preload();
	},

	addPreloadItem() {
		for (let i = 0; i < this.data.questionList.length; i++) {
			this._resList.push({ url: this.data.questionList[i].questionAudio });
			for (let j = 0; j < this.data.questionList[i].optionList.length; j++) {
				this._resList.push({ url: this.data.questionList[i].optionList[j].optionAudio });
				this._resList.push({ url: this.data.questionList[i].optionList[j].optionDragonBone.skeJsonData.url });
				this._resList.push({ url: this.data.questionList[i].optionList[j].optionDragonBone.texJsonData.url });
				this._resList.push({ url: this.data.questionList[i].optionList[j].optionDragonBone.texPngData.url });
				this._resList.push({ url: this.data.questionList[i].optionList[j].optionDragonBone.skeJsonData2.url });
				this._resList.push({ url: this.data.questionList[i].optionList[j].optionDragonBone.texJsonData2.url });
				this._resList.push({ url: this.data.questionList[i].optionList[j].optionDragonBone.texPngData2.url });
			}
		}
	},

	preload() {
		cc.assetManager.loadAny(this._resList, null, null, (err, data) => {
			this.loadEnd();
			if (window && window["air"]) {
				window["air"].hideAirClassLoading();
			}

			cc.debug.setDisplayStats(false);
		});
	},


	loadEnd() {
		GameData.questionIndex = 0;
		this.questionList = [];
		for (let i = 0; i < this.data.questionList.length; i++) {
			this.questionList[i] = i;
		}
		this.initData();

		this.startGame();
	},

	initData() {
		// 所有全局变量 默认都是null 
		let optionList = this.data.questionList[GameData.questionIndex].optionList;
		this.optionList = [];
		for (let i = 0; i < optionList.length; i++) {
			this.optionList[i] = i;
		}
		this.initQuestionAndAnswer();
		this.initTitle();
		this.updateBtnStatus();
	},

	startGame() {
		this.playAudioEntrer();
	},

	initTitle() {
		let label = this.nodeDict.labTitle.getComponent(cc.Label);
		label.string = this.data.questionList[GameData.questionIndex].questionText;
		label._forceUpdateRenderData();
		if (this.nodeDict.labTitle.width > 567) {
			this.nodeDict.labTitle.scale = 567 / this.nodeDict.labTitle.width
		}
	},

	// 初始化题干以及选项
	initQuestionAndAnswer() {
		let optionList = this.data.questionList[GameData.questionIndex].optionList;
		let answerIndexs = [1, 2, 3];
		if (optionList.length == 4) {
			answerIndexs = [1, 2, 3, 4];
		}
		for (let i = 0; i < optionList.length; i++) {
			let question = cc.instantiate(this.pfbItemQuestion);
			question.parent = this.nodeDict.nodQuestionParent;
			question.x = this.getItemX(optionList, i);
			let ItemQuestion = question.getComponent('ItemQuestion');
			ItemQuestion.setInfo(optionList[i], i, this);
			ItemQuestion.setGray();

			let answer = cc.instantiate(this.pfbItemAnswer);
			answer.parent = this.nodeDict.nodAnswerParent;

			let index = Math.floor(Math.random() * answerIndexs.length)
			answer.x = this.getItemX(optionList, answerIndexs[index] - 1);
			answerIndexs.splice(index, 1);

			answer.getComponent('ItemAnswer').setInfo(optionList[i], i, this);
		}
	},
	getItemX(optionList, index) {
		let itemWidth = 300;
		let space = 10;
		let x = index * (itemWidth + space) - 1.5 * (itemWidth + space);
		if (optionList.length == 3) {
			space = 56;
			x = index * (itemWidth + space) - 1 * (itemWidth + space);
		}
		return x;
	},


	playAudioEntrer() {
		GameData.isAudio = true;
		let id = cc.audioEngine.play(this.audEnter, false, 1);
		cc.audioEngine.setFinishCallback(id, () => {
			GameData.isAudio = false;
			this.playAudioQuestion();
		})
	},

	playAudioQuestion(isBtn) {
		GameData.isAudio = true;
		let url = this.data.questionList[GameData.questionIndex].questionAudio;
		// url = 'http://127.0.0.1/iamflying.mp3';
		cc.assetManager.loadRemote(url, null, (err, clip) => {
			if (err) {
				console.log(err)
				this.showRandomQuestion();
				return;
			}
			let id = cc.audioEngine.play(clip, false, 1);
			cc.audioEngine.setFinishCallback(id, () => {
				GameData.isAudio = false;
				if (!isBtn) {
					this.showRandomQuestion();
				}
			})
		});
	},
	playAudioMove() {
		GameData.isAudio = true;
		let id = cc.audioEngine.play(this.audMove, false, 1);
		cc.audioEngine.setFinishCallback(id, () => {
			GameData.isAudio = false;
		})
	},
	playAudioMerge() {
		GameData.isAudio = true;
		let id = cc.audioEngine.play(this.audMerge, false, 1);
		cc.audioEngine.setFinishCallback(id, () => {
			GameData.isAudio = false;
		})
	},

	// 随机亮起一个题干
	showRandomQuestion() {
		GameData.currOptionIndex = this.optionList[Math.floor(Math.random() * this.optionList.length)]
		let question = this.nodeDict.nodQuestionParent.children[GameData.currOptionIndex];
		let ItemQuestion = question.getComponent('ItemQuestion');
		ItemQuestion.setNormal();
		ItemQuestion.showQipao();
		ItemQuestion.playAudioOption();
	},

	showNext(index) {
		for (let i = 0; i < this.optionList.length; i++) {
			if (this.optionList[i] == index) {
				this.optionList.splice(i, 1);
				break;
			}
		}
		if (this.optionList.length == 0) {
			this.checkOver();
		} else {
			this.showRandomQuestion();
		}
	},

	checkOver() {
		for (let i = 0; i < this.questionList.length; i++) {
			if (this.questionList[i] == GameData.questionIndex) {
				this.questionList.splice(i, 1);
				break;
			}
		}
		if (this.questionList.length == 0) {
			let node = cc.instantiate(this.layerOver);
			node.parent = this.node;
		}
	},

	moveToQuestion(ItemAnswer) {
		GameData.isMoving = true;
		let index = ItemAnswer.index;
		let question = this.nodeDict.nodQuestionParent.children[index];
		let pos = this.nodeDict.nodQuestionParent.convertToWorldSpaceAR(question.position);
		pos = this.nodeDict.nodAnswerParent.convertToNodeSpaceAR(pos);
		this.playAudioMove();
		cc.tween(ItemAnswer.node)
			.to(0.8, { position: pos })
			.call(() => {
				question.getComponent('ItemQuestion').setChooseRight(ItemAnswer.dragonBone, ItemAnswer.animationName);
				ItemAnswer.node.destroy();
				this.getComponent(cc.Animation).play('animLight');
				this.playAudioMerge();
				cc.tween(question)
					.delay(3)
					.call(() => {
						question.getComponent('ItemQuestion').stopRightAnimation();
						this.getComponent(cc.Animation).play('animDark');
						GameData.isMoving = false;
					})
					.start()
			})
			.start()
	},

	updateBtnStatus() {
		if (GameData.questionIndex == 0) {
			this.nodeDict.btnLast.getComponent(cc.Button).interactable = false;
		} else {
			this.nodeDict.btnLast.getComponent(cc.Button).interactable = true;
		}
		if (GameData.questionIndex == this.data.questionList.length - 1) {
			this.nodeDict.btnNext.getComponent(cc.Button).interactable = false;
		} else {
			this.nodeDict.btnNext.getComponent(cc.Button).interactable = true;
		}
	},

	onTurnLast() {
		if (GameData.isAudio) {
			return;
		}
		GameData.questionIndex--;
		this.nodeDict.nodAnswerParent.destroyAllChildren();
		this.nodeDict.nodQuestionParent.destroyAllChildren();
		this.initData();
		this.playAudioQuestion();
	},
	onReplay() {
		if (GameData.isAudio) {
			return;
		}
		this.nodeDict.nodAnswerParent.destroyAllChildren();
		this.nodeDict.nodQuestionParent.destroyAllChildren();
		this.initData();
		this.startGame();
	},
	onTurnNext() {
		if (GameData.isAudio) {
			return;
		}
		GameData.questionIndex++;
		this.nodeDict.nodAnswerParent.destroyAllChildren();
		this.nodeDict.nodQuestionParent.destroyAllChildren();
		this.initData();
		this.startGame();
	},

	buttonListener(button) {
		if (button.node.name == 'btnTitle') {
			if (!GameData.isAudio) {
				this.playAudioQuestion(true);
			}
		} else if (button.node.name == 'btnLast') {
			this.onTurnLast();
		} else if (button.node.name == 'btnReplay') {
			this.onReplay();
		} else if (button.node.name == 'btnNext') {
			this.onTurnNext();
		}
	},

});