Commit a4a0c910 authored by liujiangnan's avatar liujiangnan

feat: 初始化

parent b074272e
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -25,7 +25,12 @@ export function initAir(_this) { ...@@ -25,7 +25,12 @@ export function initAir(_this) {
osmoFingerReadCallback: function (res) { osmoFingerReadCallback: function (res) {
_this.log(`***成功调用osmoFingerReadCallback***参数==${res}`); _this.log(`***成功调用osmoFingerReadCallback***参数==${res}`);
}, },
startScanCodeCallback: null,
needUpdateCallback: null,
getEngineInfoCallback: null, getEngineInfoCallback: null,
takePictureCallBack: null,
configurationPortraitCallback: null,
configurationLandscapeCallback: null,
recognitionCameraCallBack: null, recognitionCameraCallBack: null,
testCallBack: null, testCallBack: null,
recordCallBack: null, recordCallBack: null,
...@@ -149,14 +154,22 @@ export function initAir(_this) { ...@@ -149,14 +154,22 @@ export function initAir(_this) {
}; };
window.courseware.callOcMethod("stopTest", {}); window.courseware.callOcMethod("stopTest", {});
}, },
openRecognitionCamera(callback) { takePicture(callback) {
_this.log(`===成功调用takePicture===`);
window.air.takePictureCallBack = (res) => {
callback && callback(JSON.stringify(res));
window.air.takePictureCallBack = null;
};
window.courseware.callOcMethod("takePicture", {});
},
openRecognitionCamera(params = {}, callback) {
window.courseware.hasCalledOpenRecognitionCamera = true; window.courseware.hasCalledOpenRecognitionCamera = true;
_this.log(`===成功调用openRecognitionCamera===`); _this.log(`===成功调用openRecognitionCamera===${JSON.stringify(params)}`);
window.air.recognitionCameraCallBack = (res) => { window.air.recognitionCameraCallBack = (res) => {
callback && callback(JSON.stringify(res)); callback && callback(JSON.stringify(res));
window.air.recognitionCameraCallBack = null; window.air.recognitionCameraCallBack = null;
}; };
window.courseware.callOcMethod("openRecognitionCamera", {}); window.courseware.callOcMethod("openRecognitionCamera", params);
}, },
closeRecognitionCamera() { closeRecognitionCamera() {
window.courseware.hasCalledOpenRecognitionCamera = false; window.courseware.hasCalledOpenRecognitionCamera = false;
...@@ -178,6 +191,32 @@ export function initAir(_this) { ...@@ -178,6 +191,32 @@ export function initAir(_this) {
}; };
window.courseware.callOcMethod("getEngineInfo", {}); window.courseware.callOcMethod("getEngineInfo", {});
}, },
changeHost() {
_this.log(`===成功调用changeHost===`);
// 调用原生获取机器信息
if (window.air.engineInfo) {
const engineInfo = JSON.parse(window.air.engineInfo);
window.courseware.callOcMethod("changeHost", {isStagingEnv: engineInfo.isDev != 1});
}
},
needUpdate(label, url, callback) {
_this.log(`===成功调用needUpdate===`);
// 调用原生获取机器信息
window.air.needUpdateCallback = (res) => {
callback && callback(res);
window.air.needUpdateCallback = null;
};
window.courseware.callOcMethod("needUpdate", { label: label, url: url });
},
startScanCode(callback) {
_this.log(`===成功调用startScanCode===`);
// 调用原生开始扫码
window.air.startScanCodeCallback = (res) => {
callback && callback(res);
window.air.startScanCodeCallback = null;
};
window.courseware.callOcMethod("startScanCode", {});
},
openOsmo(params = {}) { openOsmo(params = {}) {
window.courseware.hasCalledOpenOsmo = true; window.courseware.hasCalledOpenOsmo = true;
_this.log(`===成功调用openOsmo===${JSON.stringify(params)}`); _this.log(`===成功调用openOsmo===${JSON.stringify(params)}`);
...@@ -218,6 +257,22 @@ export function initAir(_this) { ...@@ -218,6 +257,22 @@ export function initAir(_this) {
_this.log(`===成功调用closeOsmoFingerRead===`); _this.log(`===成功调用closeOsmoFingerRead===`);
window.courseware.callOcMethod("closeOsmoFingerRead", {}); window.courseware.callOcMethod("closeOsmoFingerRead", {});
}, },
onConfigurationPortrait(params = {}, callback) {
_this.log(`===成功调用onConfigurationPortrait||竖屏===`);
window.air.configurationPortraitCallback = (res) => {
callback && callback(res);
window.air.configurationPortraitCallback = null;
};
window.courseware.callOcMethod("onConfigurationPortrait", params);
},
onConfigurationLandscape(params = {}, callback) {
_this.log(`===成功调用onConfigurationLandscape||横屏===`);
window.air.configurationLandscapeCallback = (res) => {
callback && callback(res);
window.air.configurationLandscapeCallback = null;
};
window.courseware.callOcMethod("onConfigurationLandscape", params);
},
callOcMethod(method, param) { callOcMethod(method, param) {
const paramStr = JSON.stringify(param); const paramStr = JSON.stringify(param);
_this.log(`===成功调用原生方法${method}===参数==${paramStr}`); _this.log(`===成功调用原生方法${method}===参数==${paramStr}`);
......
...@@ -6,7 +6,8 @@ cc.Class({ ...@@ -6,7 +6,8 @@ cc.Class({
properties: { properties: {
}, },
callNetworkApiPost(baseUrl, uri, data, callBack) { callNetworkApiPost(uri, data, callBack) {
this.getBaseUrl((baseUrl) => {
const xhr = new XMLHttpRequest(); const xhr = new XMLHttpRequest();
const url = `${baseUrl}${uri}`; const url = `${baseUrl}${uri}`;
xhr.open("POST", url, true); xhr.open("POST", url, true);
...@@ -17,9 +18,11 @@ cc.Class({ ...@@ -17,9 +18,11 @@ cc.Class({
} }
} }
xhr.send(JSON.stringify(data)); xhr.send(JSON.stringify(data));
});
}, },
callNetworkApiGet(baseUrl, uri, data, callBack) { callNetworkApiGet(uri, data, callBack) {
this.getBaseUrl((baseUrl) => {
let queryStr = '?'; let queryStr = '?';
const params = []; const params = [];
for (const key in data) { for (const key in data) {
...@@ -35,532 +38,129 @@ cc.Class({ ...@@ -35,532 +38,129 @@ cc.Class({
} }
}; };
const url = `${baseUrl}${uri}${queryStr}`; const url = `${baseUrl}${uri}${queryStr}`;
console.log('url = ' + url); console.warn('url = ' + url);
xhr.open('GET', url, true);
xhr.send();
},
callNetworkApiGetLocal(baseUrl, uri, data, callBack) {
let queryStr = '?';
const params = [];
for (const key in data) {
if (Object.hasOwnProperty.call(data, key)) {
params.push(`${key}=${data[key]}`);
}
}
queryStr += params.join("&");
const xhr = new XMLHttpRequest();
xhr.onreadystatechange = () => {
if (xhr.readyState == 4 && (xhr.status >= 200 && xhr.status < 400)) {
callBack(xhr.responseText);
}
};
const url = `${baseUrl}${uri}${queryStr}`;
console.log('url = ' + url);
xhr.open('GET', url, true); xhr.open('GET', url, true);
xhr.send(); xhr.send();
},
// 需要预加载的数量
preloadCount: null,
// 统计已加载的数量
loadedCount: null,
baseApiUrl: null, // API地址
engineCode: null, // 机器唯一编码
userCode: null, // 用户唯一编码
name: null, // 用户取的英文名
birthday: null, // 用户的生日
courseIds: null, // 根据推荐生成的课件ID数组
currentIndex: null, // 当前进行的是courseIds里第几个课件
// 统一释放异步资源的方法
onLoad() {
this.preloadCount = 0;
this.loadedCount = 0;
initAir(this);
this.initAudio();
},
start() {
this.turnPageWait = 0;
this.node.zIndex = 9999;
cc.game.addPersistRootNode(this.node);
this.initListener();
this.initPageInfo();
this.hideUI();
this.showWaitingLetters();
this.initTerminalInfo(() => {
this.getUserStar(); // 获取用户所获得的星星数量
this.getUserQrcode(); // 获取用户动态小程序码
this.loadGame();
}); });
}, },
initAudio() { async getBaseUrl(callback) {
this.bigStarClip = cc.find('middleLayer/res/audio/big_star').getComponent(cc.AudioSource).clip; const engineInfo = await this.getEngineInfo();
}, const { isDev, uuid } = JSON.parse(engineInfo);
this.isDev = isDev;
initTerminalInfo(callback) {
window.courseware.getEngineInfo(res => {
const { isDev, uuid } = JSON.parse(res);
if (isDev) {
// 这里后面给个测试环境地址
this.baseApiUrl = `https://api.iplayabc.com/`;
} else {
this.baseApiUrl = `https://api.iplayabc.com/`;
}
this.engineCode = uuid; this.engineCode = uuid;
this.getUserCode(callback); // 获取用户基本信息 if (isDev == 1) {
}); callback('http://staging-openapi.iteachabc.com');
},
getUserCode(callback) {
this.callNetworkApiPost(this.baseApiUrl, "v1/terminal/store", {
engine_code: this.engineCode,
name: 'default_name',
birthday: '20200202'
}, res => {
if (res.code === 200) {
this.userCode = res.data.user_code;
this.name = res.data.name;
this.birthday = res.data.birthday;
callback && callback();
}else{
console.log("-----error------");
console.log(res.msg);
// TODO 提示错误和上报错误
}
});
},
getUserQrcode() {
cc.assetManager.loadRemote(`${this.baseApiUrl}v1/wechart/wxacode?user_code=${this.userCode}`,{ext: '.jpeg'}, (err, img) => {
if(err) {
console.log("==远程图片加载错误==");
// TODO 上报错误
} else { } else {
const spriteFrame = new cc.SpriteFrame(img); callback('http://openapi.iteachabc.com');
cc.find('middleLayer/qrcode').getComponent(cc.Sprite).spriteFrame = spriteFrame;
} }
})
}, },
getUserStar() { getEngineInfo() {
this.callNetworkApiGet(this.baseApiUrl, "v1/terminal/user/stars", { if (window.air.engineInfo) {
user_code: this.userCode, return window.air.engineInfo;
}, res => { } else {
if (res.code === 200) { return new Promise((resolve, reject) => {
// const starLabel = cc.find('middleLayer/star_count_label').getComponent(cc.Label); window.courseware.getEngineInfo(() => {
const starLabel = cc.find('middleLayer/star_node/star_count_label').getComponent(cc.RichText); resolve(window.air.engineInfo);
starLabel.string = `<outline color=black width=2><b>${res.data} </b></outline>` ; });
}else{
console.log("-----error------");
console.log(res.msg);
// TODO 提示错误和上报错误
}
}); });
},
initPageInfo() {
const addressText = cc.find('middleLayer/ui/address');
const str = cc.sys.localStorage.getItem('ip');
console.log('str = ' + str);
if (str) {
addressText.getComponent(cc.EditBox).string = str;
}
const nameText = cc.find('middleLayer/ui/bundleName');
const bundleName = cc.sys.localStorage.getItem('bundleName');
if (bundleName) {
nameText.getComponent(cc.EditBox).string = bundleName;
}
const courseIdNode = cc.find('middleLayer/ui/courseId');
const courseId = cc.sys.localStorage.getItem('courseId');
if (courseId) {
courseIdNode.getComponent(cc.EditBox).string = courseId;
} }
global.middleLayer = cc.find('middleLayer').getComponent('middleLayer');
middleLayer.log("middleLayer.log('像这样在这里打log')");
}, },
asyncCallNetworkApiGet(apiName, data) {
getHistoryLastCourse(callback) { return new Promise((resolve, reject) => {
this.callNetworkApiGet(this.baseApiUrl, `v1/terminal/user/answers/1`, { user_code: this.userCode }, res => { this.callNetworkApiGet(apiName, data, (res => {
callback(res.data.rows[0]); resolve(res);
}));
}); });
}, },
asyncCallNetworkApiPost(uri, data) {
loadGame() { return new Promise((resolve, reject) => {
this.callNetworkApiGet(this.baseApiUrl, `v1/preference/courseware`, { user_code: this.userCode }, res => { this.callNetworkApiPost(uri, data, (res) => {
if (res.code !== 200) { resolve(res);
console.log("-----error------");
console.log(res.msg);
// TODO 提示错误和上报错误
return;
}
this.courseIds = res.data;
this.getHistoryLastCourse(item => {
this.currentIndex = item?this.courseIds.indexOf(item.syllabus_id):0;
this.loadOnlineCourseWare(this.courseIds[this.currentIndex], false);
}); });
}); });
}, },
addStar(count, animationFlag) { onMiddleLayerLoadingFinish() {
if (cc.sys.isNative && cc.sys.os == cc.sys.OS_IOS) {
if(animationFlag){ jsb.reflection.callStaticMethod(
// TODO 添加星星的动画 "RootViewController",
"getMiddleLayerInfoFinish:",
for (let i=0; i<count; i++) { ""
);
setTimeout(() => {
let star = cc.find('middleLayer/star_node/icon_star');
const resItem = cc.find('middleLayer/res/icon_bigstar');
const starBig = cc.instantiate(resItem);
starBig.parent = star.parent;
showBigStar(starBig, star);
}, i * 500);
}
playAudio(this.bigStarClip);
}
this.callNetworkApiPost(this.baseApiUrl, `v1/terminal/star/save`, {
syllabus_id: this.courseItem.course_id,
courseware_id: this.courseItem.id,
engine_code: this.engineCode,
template_name: this.courseItem.template_name,
stars: count,
})
},
preloadAll() {
if (window.preloadBundleAndSourcesFlag) {
// 只加载一次就行了
return;
}
window.preloadBundleAndSourcesFlag = true;
cc.find("middleLayer/ui/ProgressLabel").active = true;
cc.find('middleLayer/ui/loadingProgress').active = true;
let platform = "web_desktop";
if (cc.sys.os == cc.sys.OS_IOS) {
platform = "ios";
} else if (cc.sys.os == cc.sys.OS_ANDROID) {
platform = "android";
}
this.callNetworkApiGet(`http://staging-teach.ireadabc.com`, `/api/syllabus/v1/allbundles`, { orgid: 488, platform }, (data) => {
if (data.rows && data.rows.length > 0) {
this.preloadCount += data.rows.length;
} }
this.callNetworkApiGet(`http://staging-teach.ireadabc.com`, `/api/syllabus/v1/allresources`, { orgid: 488 }, (data1) => { if (cc.sys.isNative && cc.sys.os == cc.sys.OS_ANDROID) {
if (data1.rows && data1.rows.length > 0) { jsb.reflection.callStaticMethod(
this.preloadCount += data1.rows.length; "com/iplayabc/cocos/AppActivity",
"getMiddleLayerInfoFinish",
"(Ljava/lang/String;)Ljava/lang/String;",
""
);
} }
console.log('data.rows = ' + JSON.stringify(data.rows));
this.batchPreloadScene(data.rows);
this.preloadSource(data1.rows);
});
});
}, },
preloadSourceImman() {
// 测试用
cc.find("middleLayer/ui/ProgressLabel").active = true;
cc.find('middleLayer/ui/loadingProgress').active = true;
this.callNetworkApiGet(`http://staging-teach.ireadabc.com`, `/api/courseware/v1/getresources`, { courseid: 20894 }, (data1) => {
if (data1.rows && data1.rows.length > 0) {
this.preloadCount += data1.rows.length;
}
this.log('data1.rows = ' + JSON.stringify(data1.rows));
this.preloadSource(data1.rows);
});
},
batchPreloadScene(scenes = []) { // 需要预加载的数量
const expects = [ preloadCount: null,
// 'op_03_2', // 统计已加载的数量
// 'OP10_online', loadedCount: null,
];
const _this = this;
let i = 0;
const load = function () {
const scene = scenes[i];
if (expects.includes(scene.sceneName)) {
_this.loadedCount++;
_this.updateProcessBar();
i++;
if (i < scenes.length) {
setTimeout(() => {
load();
}, 1);
}
return;
}
cc.assetManager.loadBundle(scene.bondleUrl, { version: scene.version }, (err, bundle) => {
console.log(`${scene.bondleUrl}---场景开始loadBundle----`);
if (!bundle) {
_this.loadedCount++;
_this.updateProcessBar();
i++;
if (i < scenes.length) {
setTimeout(() => {
load();
}, 1);
}
return;
}
bundle.preloadScene(scene.sceneName, () => { }, () => {
console.log(`${scene.sceneName}场景预加载结束`);
_this.loadedCount++;
_this.updateProcessBar();
i++;
if (i < scenes.length) {
setTimeout(() => {
load();
}, 1);
}
});
});
}
if (scenes && scenes.length > 0) { isDev: null,
load(); engineCode: null, // 机器唯一编码
}
},
preloadSource(array) { dataStore: null, // 内存数据仓库
const rows = array || []; currentSceneName: null, // 当前模板名称
const batchLoad = () => {
let tempArr = rows.splice(0, 10);
let len = tempArr.length;
for (let i = 0; i < tempArr.length; i++) {
cc.assetManager.loadRemote(tempArr[i], (err, texture) => {
if (err) {
console.log(err)
}
this.loadedCount++;
this.updateProcessBar();
if (i === len - 1) {
batchLoad();
}
});
}
}
batchLoad();
},
updateProcessBar() { // 统一释放异步资源的方法
const label = cc.find("middleLayer/ui/ProgressLabel").getComponent(cc.Label); onLoad() {
const loadingProgress = cc.find('middleLayer/ui/loadingProgress'); this.preloadCount = 0;
label.string = `正在加载:${this.loadedCount} / ${this.preloadCount}`; this.loadedCount = 0;
if (this.loadedCount > this.preloadCount * 0.99) {
cc.find("middleLayer/ui/ProgressLabel").active = false;
loadingProgress.active = false;
this.showLog("资源全部加载完成");
}
loadingProgress.getComponent(cc.ProgressBar).progress = this.loadedCount / this.preloadCount;
},
asyncDelayLog(str) { this.dataStore = {};
console.log(str); initAir(this);
return new Promise((resolve, reject) => { this.reWriteAir();
setTimeout(() => {
resolve();
}, 1);
});
}, },
initListener() { start() {
this.node.zIndex = 9999;
cc.find('middleLayer/qrcode_bg').on('click', () => { cc.game.addPersistRootNode(this.node);
cc.find('middleLayer/qrcode').active = false;
cc.find('middleLayer/qrcode_bg').active = false;
});
cc.find('middleLayer/BtnShowQrcode').on('click', () => {
cc.find('middleLayer/qrcode').active = true;
cc.find('middleLayer/qrcode_bg').active = true;
});
cc.find('middleLayer/ExitBtn').on('click', () => {
cc.find('middleLayer/BtnRight').active = false;
cc.find('middleLayer/BtnLeft').active = false;
cc.tween(exitBtn)
.to(0.1, { scaleX: 0.4, scaleY: 0.6 })
.to(0.1, { scaleX: 0.6, scaleY: 0.4 })
.to(0.1, { scaleX: 0.5, scaleY: 0.5 })
.call(() => {
exitBtn.active = false;
cc.game.removePersistRootNode(this.node);
cc.director.getScene().destroy();
cc.audioEngine.stopAll();
window.courseware.freeAllOcMethod();
cc.director.loadScene("debug_shell", null, null, (err, scene) => {
});
})
.start();
});
cc.find('middleLayer/BtnRight').on('click', () => {
this.goNextPage();
});
cc.find('middleLayer/BtnLeft').on('click', () => {
this.goPrePage();
});
cc.find('middleLayer/ui/BtnOpenOsmo').on('click', () => {
window.courseware.openOsmo();
});
cc.find('middleLayer/ui/BtnCloseOsmo').on('click', () => {
window.courseware.closeOsmo();
});
cc.find('middleLayer/ui/BtnOpenRecord').on('click', () => {
window.courseware.startRecord('');
});
cc.find('middleLayer/ui/BtnCloseRecord').on('click', () => {
window.courseware.stopRecord(0, res => {
this.log('--------录音返回结果 stopRecord ------------');
this.log(JSON.stringify(res))
this.log('------------------------------');
});
});
cc.find('middleLayer/ui/BtnOpenTest').on('click', () => {
window.courseware.startTest('');
});
cc.find('middleLayer/ui/BtnCloseTest').on('click', () => {
window.courseware.stopTest(res => {
this.log('--------录音评测返回结果 stopTest ---------');
this.log(JSON.stringify(res))
this.log('------------------------------');
});
});
const BtnStartLocal = cc.find('middleLayer/ui/BtnStartLocal'); this.initListener();
BtnStartLocal.on('click', () => {
const addressText = cc.find('middleLayer/ui/address');
const str = addressText.getComponent(cc.EditBox).string;
cc.sys.localStorage.setItem('ip', str);
const address = str.split(':')[0];
const port = str.split(':')[0] | 8081;
this.localMode = true;
this.loadLocalBundle(address, port);
this.showWaitingLetters(); this.showWaitingLetters();
this.hideUI(); this.onMiddleLayerLoadingFinish();
this.showDebugUI();
});
const BtnStartOnline = cc.find('middleLayer/ui/BtnStartOnline');
BtnStartOnline.on('click', () => {
const nameText = cc.find('middleLayer/ui/bundleName');
const bundleName = nameText.getComponent(cc.EditBox).string;
cc.sys.localStorage.setItem('bundleName', bundleName);
this.loadOnlineBundle(bundleName);
this.showDebugUI();
});
const BtnStartCourseWare = cc.find('middleLayer/ui/BtnStartCourseWare');
BtnStartCourseWare.on('click', () => {
const courseIdNode = cc.find('middleLayer/ui/courseId');
const courseId = courseIdNode.getComponent(cc.EditBox).string;
cc.sys.localStorage.setItem('courseId', courseId);
this.loadOnlineCourseWare(courseId);
this.showDebugUI();
});
const BtnLoad = cc.find('middleLayer/ui/BtnLoad'); this.loadOnlineBundle("OP_03_2");
BtnLoad.on('click', () => { },
this.preloadCount = 0;
this.loadedCount = 0;
cc.find("middleLayer/ui/ProgressLabel").active = true;
cc.find('middleLayer/ui/loadingProgress').active = true;
// this.preloadAll();
this.preloadSourceImman();
});
const btnClose = cc.find('middleLayer/ConsoleNode/BtnClose'); initListener() {
const btnOpen = cc.find('middleLayer/ConsoleNode/BtnOpen');
const consoleNode = cc.find('middleLayer/ConsoleNode/Console');
const consoleBg = cc.find('middleLayer/ConsoleNode/bg');
btnOpen.on('click', () => {
btnClose.active = true;
btnOpen.active = false;
consoleNode.active = true;
consoleBg.active = true;
});
btnClose.on('click', () => {
btnClose.active = false;
btnOpen.active = true;
consoleNode.active = false;
consoleBg.active = false;
});
}, },
goNextCourseware() { reWriteAir() {
this.currentIndex ++; window.courseware.getData = async (callback) => {
if(!this.courseIds[this.currentIndex]){ const data = this.dataStore[this.currentSceneName];
this.currentIndex = 0; callback && callback(data);
} }
this.callNetworkApiGet(`http://iteachabc.com`, `/api/courseware/v1/${this.courseIds[this.currentIndex]}/list`, {}, (data) => { if (!window.air) {
if (data.rows && data.rows.length > 0) { window.air = {};
this.courses = data.rows;
this.courseIndex = 0;
this.courseItem = data.rows[0];
this.loadPageBundle();
} else {
// 没有制作课件页,直接切换到下一个课件
this.goNextCourseware();
} }
window.air.hideAirClassLoading = () => {
window.air.onCourseInScreen && window.air.onCourseInScreen(() => {
console.log("***成功调用onCourseInScreen***");
window.air.onCourseInScreen = null;
}); });
this.hideWaitingLetters();
}
}, },
goPrePage() { async loadOnlineBundle(bundleName) {
this.goTarIndexPage(this.courseIndex - 1); cc.audioEngine.stopAll();
}, this.currentSceneName = bundleName;
goNextPage() {
this.goTarIndexPage(this.courseIndex + 1);
},
goTarIndexPage(index) {
if (!this.courses || index == this.courseIndex || index < 0 ) {
return;
}
this.showMask();
this.showWaitingLetters();
window.courseware.freeAllOcMethod();
if (index > this.courses.length - 1) {
// 本课件播放完了,切换到下一个课件
this.goNextCourseware();
return;
}
this.courseIndex = index;
this.courseItem = this.courses[this.courseIndex];
this.loadPageBundle();
},
log(str) {
const logStr = `${new Date().toLocaleString()}: ${str}`;
console.log(logStr);
const content = cc.instantiate(cc.find('middleLayer/ConsoleNode/content'));
content.active = true;
const label = content.getChildByName('label');
label.getComponent(cc.Label).string = logStr;
const consoleContent = cc.find('middleLayer/ConsoleNode/Console/content');
consoleContent.addChild(content);
consoleContent.getComponent(cc.Layout).updateLayout();
},
hideUI() {
cc.find('middleLayer/ui').active = false;
},
loadOnlineBundle(bundleName) {
this.showWaitingLetters(); this.showWaitingLetters();
this.callNetworkApiGet(`http://staging-teach.ireadabc.com`, `/api/template/v1/${bundleName}`, {}, (data) => { const data = await this.asyncCallNetworkApiGet(`/api/template/v1/${bundleName}`, {});
let configData = null; let configData = null;
if (cc.sys.os == cc.sys.OS_IOS) { if (cc.sys.os == cc.sys.OS_IOS) {
configData = data.data.conf.ios; configData = data.data.conf.ios;
...@@ -572,179 +172,29 @@ cc.Class({ ...@@ -572,179 +172,29 @@ cc.Class({
const sceneName = configData.sceneName; const sceneName = configData.sceneName;
const version = configData.version; const version = configData.version;
const bondleUrl = configData.bondleUrl; const bondleUrl = configData.bondleUrl;
this.loadBundle(sceneName, version, bondleUrl);
});
},
courses: null,
courseIndex: 0,
courseItem: null,
loadOnlineCourseWare(courseId, linkFlag) {
this.hideUI();
this.showMask();
this.showWaitingLetters();
let api = `/api/courseware/v1/${courseId}/list`;
if (linkFlag === true) {
api = `/api/courseware/v1/${courseId}/eq/level/list`;
}
this.callNetworkApiGet(`http://iteachabc.com`, api, {}, (data) => {
if (data.rows && data.rows.length > 0) {
this.courses = data.rows;
this.courseIndex = data.index || 0;
this.courseItem = data.rows[this.courseIndex];
}
if (this.courses && this.courses.length > 1 && this.courseIndex <= this.courses.length - 1) {
// cc.find('middleLayer/BtnRight').active = true;
}
if (this.courseIndex > 0) {
cc.find('middleLayer/BtnLeft').active = false;
}
this.reWriteAir();
this.loadPageBundle();
});
},
loadLocalBundle(address, port) {
this.callNetworkApiGetLocal(`http://${address}:${port}`, '/dist/config.json', {}, (datastr) => {
const data = JSON.parse(datastr);
let sceneName = '';
let version = '';
let bondleUrl = '';
if (cc.sys.os == cc.sys.OS_IOS) {
sceneName = data.ios.sceneName;
version = data.ios.version;
bondleUrl = `http://${address}:${port}/dist/ios/${sceneName}/`;
} else if (cc.sys.os == cc.sys.OS_ANDROID) {
sceneName = data.android.sceneName;
version = data.android.version;
bondleUrl = `http://${address}:${port}/dist/android/${sceneName}/`;
} else {
sceneName = data.android.sceneName;
version = "";
bondleUrl = `http://${address}:${port}/dist/web_desktop/`;
}
this.loadBundle(sceneName, version, bondleUrl);
});
},
loadPageBundle() {
let sceneName, version, bondleUrl = "";
if (cc.sys.os == cc.sys.OS_IOS) {
sceneName = this.courseItem.conf.ios.sceneName;
version = this.courseItem.conf.ios.version;
bondleUrl = this.courseItem.conf.ios.bondleUrl;
} else if (cc.sys.os == cc.sys.OS_ANDROID) {
sceneName = this.courseItem.conf.android.sceneName;
version = this.courseItem.conf.android.version;
bondleUrl = this.courseItem.conf.android.bondleUrl;
} else {
sceneName = this.courseItem.conf.web_desktop.sceneName;
version = this.courseItem.conf.web_desktop.version;
bondleUrl = this.courseItem.conf.web_desktop.bondleUrl;
}
this.loadBundle(sceneName, version, bondleUrl); this.loadBundle(sceneName, version, bondleUrl);
}, },
loadBundle(sceneName, version, bondleUrl) { loadBundle(sceneName, version, bondleUrl) {
this.currentBundleInfo = { sceneName, version, bondleUrl };
cc.assetManager.loadBundle(bondleUrl, { version: version }, async (err, bundle) => { cc.assetManager.loadBundle(bondleUrl, { version: version }, async (err, bundle) => {
if (err) { if (err) {
return this.asyncDelayLog(err); console.error(err);
return;
} }
bundle.loadScene(sceneName, null, null, (err, scene) => { bundle.loadScene(sceneName, null, null, (err, scene) => {
if (err) { if (err) {
this.asyncDelayLog('err: ', err); console.error(err);
} }
cc.audioEngine.stopAll();
cc.director.runScene(scene, null, () => { cc.director.runScene(scene, null, () => {
console.log('sceneName = ' + sceneName);
const Canvas = cc.find('Canvas'); const Canvas = cc.find('Canvas');
const middleLayer = cc.find('middleLayer'); const middleLayer = cc.find('middleLayer');
// cc.find('middleLayer/ExitBtn').active = true;
this.hideMask();
this.hideWaitingLetters();
Canvas.getComponent(cc.Widget).updateAlignment(); Canvas.getComponent(cc.Widget).updateAlignment();
middleLayer.scale = Canvas.width / middleLayer.width; middleLayer.scale = Canvas.width / middleLayer.width;
// this.showLog('middleLayer.scale = ' + middleLayer.scale);
}); });
}); });
}); });
}, },
showMask() {
const mask = cc.find('middleLayer/mask');
mask.active = true;
cc.tween(mask)
.set({ opacity: 0 })
.to(0.2, { opacity: 180 })
.start();
},
hideMask() {
const mask = cc.find('middleLayer/mask');
mask.stopAllActions();
cc.tween(mask)
.set({ opacity: 180 })
.to(0.2, { opacity: 0 })
.call(() => {
mask.active = false;
})
.start();
},
turnPageWait: 0,
reWriteAir() {
window.courseware.getData = (callback) => {
let data = null;
if (this.courseItem.data) {
data = JSON.parse(this.courseItem.data);
}
this.log("===成功调用getData===" + this.courseItem.data);
callback && callback(data);
}
window.courseware.nextPage = () => {
setTimeout(() => {
this.goNextPage();
}, this.turnPageWait);
this.turnPageWait = 0;
}
window.courseware.beforePage = () => {
this.goPrePage();
}
window.courseware.sendAnswer = (answerObj) => {
this.log("===成功调用sendAnswer===" + JSON.stringify(answerObj));
this.turnPageWait = 2000;
this.addStar(3, true); // 上报成绩则获得三颗星星并展示动画
this.callNetworkApiPost(this.baseApiUrl, `v1/terminal/save/answer`, {
syllabus_id: this.courseItem.course_id,
courseware_id: this.courseItem.id,
engine_code: this.engineCode,
name: this.name,
template_name: this.courseItem.template_name,
template_description: this.courseItem.template_description,
result: JSON.stringify(answerObj),
}, (data) => {
answerObj.callback && answerObj.callback(JSON.stringify(data.data));
});
}
window.courseware.addStar = this.addStar.bind(this);
},
callNativeFunction(param) {
const paramStr = JSON.stringify(param);
if (cc.sys.isNative && cc.sys.os == cc.sys.OS_IOS) {
return jsb.reflection.callStaticMethod('CocosMng', 'cocosWithNativeProtocol:', paramStr);
} else if (cc.sys.isNative && cc.sys.os == cc.sys.OS_ANDROID) {
return jsb.reflection.callStaticMethod('com/iplayabc/cocos/AppActivity', 'cocosWithNativeProtocol', '(Ljava/lang/String;)Ljava/lang/String;', paramStr);
} else if (cc.sys.isNative && cc.sys.os == cc.sys.OS_WINDOWS) {
console.log('汪汪汪')
} else {
console.error('非源生环境');
}
},
showWaitingLetters() { showWaitingLetters() {
if (this.isShowWaiting) { if (this.isShowWaiting) {
return; return;
} }
...@@ -783,52 +233,6 @@ cc.Class({ ...@@ -783,52 +233,6 @@ cc.Class({
this.isShowWaiting = false; this.isShowWaiting = false;
}, },
showLog(str) {
if (!this.logList) {
this.logList = [];
}
this.logList.push(str);
console.log(str);
if (this.logList.length == 1) {
this.showOneLog();
}
},
showDebugUI() {
cc.find('middleLayer/ConsoleNode/BtnOpen').active = true;
},
showOneLog() {
const str = this.logList[0];
if (str === undefined) {
return;
}
const node = new cc.Node();
node.anchorX = 0.5;
const label = node.addComponent(cc.RichText);
label.string = `<outline color=black width=3>${str}</outline>`;
label.maxWidth = this.node.width / 2;
node.x = this.node.width / 4;
node.y = -this.node.height / 2;
node.parent = this.node;
cc.tween(node)
.to(5, { y: this.node.height })
.removeSelf()
.start();
setTimeout(() => {
this.logList.shift();
this.showOneLog();
}, 1000);
},
exit() {
cc.game.removePersistRootNode(this.node);
cc.director.loadScene("emptyScene", () => {
this.callNativeFunction({ name: 'exit', value: '' });
});
},
getRainbowColorList() { getRainbowColorList() {
return [ return [
cc.color(255, 255, 0), cc.color(255, 255, 0),
...@@ -849,5 +253,10 @@ cc.Class({ ...@@ -849,5 +253,10 @@ cc.Class({
cc.color(255, 128, 0), cc.color(255, 128, 0),
cc.color(255, 255, 0), cc.color(255, 255, 0),
]; ];
},
log(str) {
console.log(str);
} }
}); });
...@@ -94,13 +94,13 @@ export function getScaleRateBy2Node(baseNode, targetNode, maxFlag = true) { ...@@ -94,13 +94,13 @@ export function getScaleRateBy2Node(baseNode, targetNode, maxFlag = true) {
} }
} }
export function getDistance (start, end){ export function getDistance(start, end) {
var pos = cc.v2(start.x - end.x, start.y - end.y); var pos = cc.v2(start.x - end.x, start.y - end.y);
var dis = Math.sqrt(pos.x*pos.x + pos.y*pos.y); var dis = Math.sqrt(pos.x * pos.x + pos.y * pos.y);
return dis; return dis;
} }
export function playAudioByUrl(audio_url, cb=null) { export function playAudioByUrl(audio_url, cb = null) {
if (audio_url) { if (audio_url) {
cc.assetManager.loadRemote(audio_url, (err, audioClip) => { cc.assetManager.loadRemote(audio_url, (err, audioClip) => {
const audioId = cc.audioEngine.play(audioClip, false, 0.8); const audioId = cc.audioEngine.play(audioClip, false, 0.8);
...@@ -114,21 +114,21 @@ export function playAudioByUrl(audio_url, cb=null) { ...@@ -114,21 +114,21 @@ export function playAudioByUrl(audio_url, cb=null) {
} }
export function btnClickAnima(btn, time=0.15, rate=1.05) { export function btnClickAnima(btn, time = 0.15, rate = 1.05) {
btn.tmpScale = btn.scale; btn.tmpScale = btn.scale;
btn.on(cc.Node.EventType.TOUCH_START, () => { btn.on(cc.Node.EventType.TOUCH_START, () => {
cc.tween(btn) cc.tween(btn)
.to(time / 2, {scale: btn.scale * rate}) .to(time / 2, { scale: btn.scale * rate })
.start() .start()
}) })
btn.on(cc.Node.EventType.TOUCH_CANCEL, () => { btn.on(cc.Node.EventType.TOUCH_CANCEL, () => {
cc.tween(btn) cc.tween(btn)
.to(time / 2, {scale: btn.tmpScale}) .to(time / 2, { scale: btn.tmpScale })
.start() .start()
}) })
btn.on(cc.Node.EventType.TOUCH_END, () => { btn.on(cc.Node.EventType.TOUCH_END, () => {
cc.tween(btn) cc.tween(btn)
.to(time / 2, {scale: btn.tmpScale}) .to(time / 2, { scale: btn.tmpScale })
.start() .start()
}) })
} }
...@@ -165,10 +165,10 @@ export function getSprNodeByUrl(url, cb) { ...@@ -165,10 +165,10 @@ export function getSprNodeByUrl(url, cb) {
export function playAudio(audioClip, cb = null) { export function playAudio(audioClip, cb = null) {
if (audioClip) { if (audioClip) {
const audioId = cc.audioEngine.playEffect(audioClip, false, 0.8); const audioId = cc.audioEngine.playEffect(audioClip, false);
if (cb) { if (cb) {
cc.audioEngine.setFinishCallback(audioId, () => { cc.audioEngine.setFinishCallback(audioId, () => {
cb && cb(); cb();
}); });
} }
} }
...@@ -177,15 +177,85 @@ export function playAudio(audioClip, cb = null) { ...@@ -177,15 +177,85 @@ export function playAudio(audioClip, cb = null) {
export async function asyncDelay(time) { export async function asyncDelay(time) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
try { try {
setTimeout(() => { cc.tween(cc.find('Canvas'))
resolve(); .delay(time)
}, time * 1000); .call(() => {
resolve(null);
})
.start();
} catch (e) { } catch (e) {
reject(e); reject(e);
} }
}) })
} }
export async function asyncLoadDragonBoneAnime(node, { skeJsonData: { url: skeJsonDataUrl }, texJsonData: { url: texJsonDataUrl }, texPngData: { url: texPngDataUrl } }) {
if (!texPngDataUrl || !texJsonDataUrl || !texPngDataUrl
|| texPngDataUrl == '' || texJsonDataUrl == '' || texPngDataUrl == '') {
return;
}
return new Promise((resolve, reject) => {
if (node.animaNode) {
node.animaNode.removeFromParent();
}
const animaNode = new cc.Node();
animaNode.name = 'animaNode';
animaNode.parent = node;
animaNode.active = true;
node.animaNode = animaNode;
const dragonDisplay = animaNode.addComponent(dragonBones.ArmatureDisplay);
const loadTexture = new Promise((resolve, reject) => {
cc.assetManager.loadRemote(texPngDataUrl, (error, texture) => {
if (error) {
reject(error);
}
resolve(texture);
});
});
const loadTexJsonData = new Promise((resolve, reject) => {
cc.assetManager.loadAny({ url: texJsonDataUrl }, (error, atlasJson) => {
if (error) {
reject(error);
}
resolve(atlasJson);
});
});
const loadSkeJsonData = new Promise((resolve, reject) => {
cc.assetManager.loadAny({ url: skeJsonDataUrl }, (error, dragonBonesJson) => {
if (error) {
reject(error);
}
resolve(dragonBonesJson);
});
});
Promise.all([loadTexture, loadTexJsonData, loadSkeJsonData]).then(([texture, atlasJson, dragonBonesJson]) => {
const atlas = new dragonBones.DragonBonesAtlasAsset();
atlas.atlasJson = JSON.stringify(atlasJson);
atlas.texture = texture;
const asset = new dragonBones.DragonBonesAsset();
asset.dragonBonesJson = JSON.stringify(dragonBonesJson);
dragonDisplay.dragonAtlasAsset = atlas;
dragonDisplay.dragonAsset = asset;
let armatureNames = dragonBonesJson.armature.map(data => data.name);
if (armatureNames.length > 0) {
dragonDisplay.armatureName = armatureNames[0];
}
resolve(animaNode);
});
});
}
export class FireworkSettings { export class FireworkSettings {
baseNode; // 父节点 baseNode; // 父节点
nodeList; // 火花节点的array nodeList; // 火花节点的array
...@@ -296,7 +366,7 @@ export async function asyncTweenTo(node, duration, obj, ease = undefined) { ...@@ -296,7 +366,7 @@ export async function asyncTweenTo(node, duration, obj, ease = undefined) {
cc.tween(node) cc.tween(node)
.to(duration, obj, ease) .to(duration, obj, ease)
.call(() => { .call(() => {
resolve(); resolve(null);
}) })
.start(); .start();
} catch (e) { } catch (e) {
...@@ -305,69 +375,13 @@ export async function asyncTweenTo(node, duration, obj, ease = undefined) { ...@@ -305,69 +375,13 @@ export async function asyncTweenTo(node, duration, obj, ease = undefined) {
}); });
} }
export function showBigStar(starJump, starBase, cb=null) {
const bigStarBg = cc.instantiate(starJump);
bigStarBg.scale = starJump.width / starBase.width / 1.2;
starBase.scale = 1;
// const star = bigStarBg.star;
starJump.active = true;
starJump.scaleX = 0.7 / bigStarBg.scale;
starJump.scaleY = 1 / bigStarBg.scale;
// starJump.angle = 90;
const canvas = cc.find('Canvas');
const startPos = exchangeNodePos(starJump.parent, canvas, cc.v2(0, -canvas.height / 2));
const middlePos = exchangeNodePos(starJump.parent, canvas, cc.v2(0, -canvas.height / 4));
starJump.x = startPos.x + Math.random() * 100 - 50;
starJump.y = startPos.y - starBase.height;
console.log('middlePos = ' + JSON.stringify(middlePos));
const time = 1;
cc.tween(starJump)
.to(0.3, { y: middlePos.y + 60 }, { easing: 'quadOut' })
.to(0.1, { y: middlePos.y + 30, scaleX: 1.2 / bigStarBg.scale, scaleY: 0.8 / bigStarBg.scale }, { easing: 'quadOut' })
.to(0.1, { y: middlePos.y, scaleX: 1 / bigStarBg.scale, scaleY: 1 / bigStarBg.scale }, { easing: 'quadOut' })
.delay(0.1)
.to(0.8, { angle: -720, scale: 1 })
.start();
cc.tween(starJump)
.delay(0.6)
.to(0.8, { x: starBase.x }, { easing: 'sineOut' })
.start();
cc.tween(starJump)
.delay(0.6)
.to(0.8, { y: starBase.y }, { easing: 'backIn' })
.start();
cc.tween(starJump)
.delay(0.6)
.to(0.8, { scale: starBase.width/starJump.width * 0.5 }, { easing: 'quadOut' })
.call(() => {
starJump.removeFromParent();
cb && cb()
})
.start();
cc.tween(starBase)
.delay(1.4)
.to(0.1, { scale: 1.2 }, { easing: 'sineInOut' })
.to(1.1, { scale: 1 }, { easing: 'elasticOut' })
.start();
}
export async function asyncTweenBy(node, duration, obj, ease = undefined) { export async function asyncTweenBy(node, duration, obj, ease = undefined) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
try { try {
cc.tween(node) cc.tween(node)
.by(duration, obj, ease) .by(duration, obj, ease)
.call(() => { .call(() => {
resolve(); resolve(null);
}) })
.start(); .start();
} catch (e) { } catch (e) {
...@@ -408,3 +422,119 @@ export function onHomeworkFinish() { ...@@ -408,3 +422,119 @@ export function onHomeworkFinish() {
console.log('onHomeworkFinish'); console.log('onHomeworkFinish');
} }
} }
export function asyncCallNetworkApiGet(apiName, data) {
return new Promise((resolve, reject) => {
callNetworkApiGet(apiName, data, (res => {
resolve(res);
}));
});
}
export function asyncCallNetworkApiPost(uri, data) {
return new Promise((resolve, reject) => {
callNetworkApiPost(uri, data, (res) => {
resolve(res);
});
});
}
export function callNetworkApiPost(uri, data, callBack) {
const middleLayer = cc.find('middleLayer')?.getComponent('middleLayer');
if (middleLayer) {
middleLayer.callNetworkApiPost(uri, data, callBack);
return;
}
const baseUrl = 'http://staging-openapi.iteachabc.com';
const xhr = new XMLHttpRequest();
const url = `${baseUrl}${uri}`;
xhr.open("POST", url, true);
xhr.setRequestHeader('content-type', 'application/json');
xhr.onreadystatechange = () => {
if (xhr.readyState == 4) {
callBack(JSON.parse(xhr.responseText));
}
}
xhr.send(JSON.stringify(data));
}
export function callNetworkApiGet(uri, data, callBack) {
const middleLayer = cc.find('middleLayer')?.getComponent('middleLayer');
if (middleLayer) {
middleLayer.callNetworkApiGet(uri, data, callBack);
return;
}
const baseUrl = 'http://staging-openapi.iteachabc.com';
let queryStr = '?';
const params = [];
for (const key in data) {
if (Object.hasOwnProperty.call(data, key)) {
params.push(`${key}=${data[key]}`);
}
}
queryStr += params.join("&");
const xhr = new XMLHttpRequest();
xhr.onreadystatechange = () => {
if (xhr.readyState == 4 && (xhr.status >= 200 && xhr.status < 400)) {
callBack(xhr.responseText);
}
};
const url = `${baseUrl}${uri}${queryStr}`;
console.log('url = ' + url);
xhr.open('GET', url, true);
xhr.send();
}
export function jumpToBundle(bundleName) {
const middleLayer = cc.find('middleLayer');
if (middleLayer) {
const middleLayerComponent = middleLayer.getComponent('middleLayer');
middleLayerComponent.loadOnlineBundle(bundleName);
} else {
console.log('jump to bundle: ' + bundleName);
}
}
export function jumpToCourseWare(courseWareId) {
const middleLayer = cc.find('middleLayer');
if (middleLayer) {
const middleLayerComponent = middleLayer.getComponent('middleLayer');
middleLayerComponent.loadOnlineCourseWare(courseWareId);
} else {
console.log('jump to CourseWare: ' + courseWareId);
}
}
export function buttonOnceClick(button, callback, scale = 1.1) {
button.once('click', () => {
if (button['cantClick']) {
return;
}
button['cantClick'] = true;
cc.tween(button)
.to(0.1, { scale: scale })
.to(0.1, { scale: 1.0 })
.call(() => {
button['cantClick'] = false;
callback && callback();
})
.start();
});
}
export function buttonOnClick(button, callback, scale = 1.0) {
button.on('click', () => {
if (button['cantClick']) {
return;
}
button['cantClick'] = true;
cc.tween(button)
.to(0.1, { scale: scale * 1.1 })
.to(0.1, { scale: scale })
.call(() => {
button['cantClick'] = false;
callback && callback();
})
.start();
});
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment