Commit 03ad8bbf authored by liujiangnan's avatar liujiangnan

feat: 书本跳转到下一页

parent 34343ce8
{
"ver": "2.0.1",
"uuid": "90f94989-cb3e-49e2-9452-757d066f2144",
"downloadMode": 0,
"duration": 19.435102,
"subMetas": {}
}
\ No newline at end of file
import { asyncDelay, onHomeworkFinish } from "../script/util"; import { asyncDelay, onHomeworkFinish, asyncCallNetworkApiGet, asyncCallNetworkApiPost, buttonOnClick, jumpToCourseWare } from "../script/util";
import { MyCocosSceneComponent } from "../script/MyCocosSceneComponent"; import { MyCocosSceneComponent } from "../script/MyCocosSceneComponent";
const { ccclass, property } = cc._decorator; const { ccclass, property } = cc._decorator;
...@@ -6,48 +6,135 @@ const { ccclass, property } = cc._decorator; ...@@ -6,48 +6,135 @@ const { ccclass, property } = cc._decorator;
@ccclass @ccclass
export default class SceneComponent extends MyCocosSceneComponent { export default class SceneComponent extends MyCocosSceneComponent {
@property(cc.AudioClip)
bgMusic1: cc.AudioClip = null;
async getKidInfo() {
const kidDataStr = await asyncCallNetworkApiGet('/api/oxford/v1/kid/info', {
token: cc.sys.localStorage.getItem('token')
});
if (kidDataStr) {
return JSON.parse(kidDataStr).data;
}
return null;
}
addPreloadImage() { addPreloadImage() {
// TODO 根据自己的配置预加载图片资源
} }
addPreloadAudio() { addPreloadAudio() {
// TODO 根据自己的配置预加载音频资源
} }
addPreloadAnima() { addPreloadAnima() {
} }
_cantouch = null;
onLoadEnd() { async onLoadEnd() {
// TODO 加载完成后的逻辑写在这里, 下面的代码仅供参考 this._cantouch = true;
this.initData();
this.initView();
this.initListener(); this.initListener();
// 浏览记录
this.currentIndex = this.getStoreCurrentIndex();
const node = cc.find(`Canvas/bg/L${this.currentIndex + 1}`);
node.x = 0;
const middleLayer = cc.find('middleLayer');
if (!middleLayer) {
cc.sys.localStorage.setItem('token', 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwicGhvbmUiOiIxNTUwMDAwMDAwMSIsInNpZ24iOiI0OTliYjg5Yy1lYjI5LTQ2M2EtYjk5ZS0zNDg2NDUwMGEyOTkiLCJpYXQiOjE2NTQ2NzY4MzMsImV4cCI6MTY1NzI2ODgzM30.MacCd_XUhvpNrMukYu8YNRVSbc-hju_WBN_FeiRACuc');
}
const kidDataStr = await asyncCallNetworkApiGet('/api/oxford/v1/kid/info', {
token: cc.sys.localStorage.getItem('token')
});
const kidData = JSON.parse(kidDataStr);
if (!kidData.data || !kidData.data.id) {
middleLayer.getComponent('middleLayer').showTips("用户登录失效,请重新登录");
middleLayer.getComponent('middleLayer').loadOnlineBundle("NJ_login");
return;
} }
_cantouch = null; const btnReturn = cc.find('Canvas/bg/btn_return');
initData() { buttonOnClick(btnReturn, () => {
// 所有全局变量 默认都是null const middleLayer = cc.find('middleLayer');
this._cantouch = true; if (middleLayer) {
middleLayer.getComponent('middleLayer').loadOnlineBundle('NJ_YouLeChang');
} }
});
const pid = middleLayer.getComponent('middleLayer').getData('NJ_YueDuJiaYouZhan');
const classDataStr = await asyncCallNetworkApiGet('/api/syllabus/v1/tree', {
pid: pid, deep: 2
});
const ballData = JSON.parse(classDataStr);
initView() { ballData.forEach((data, idx) => {
this.initBg(); if (idx >= 5) {
this.initBtn(); console.warn('idx >= 5');
return;
}
const level = cc.find(`Canvas/bg/L${idx+1}`);
data.children.forEach((book, i) => {
if (i >= 3) {
console.warn('book >= 3');
return;
} }
const bookNode = cc.find(`book${i+1}`, level);
bookNode.attr({syllabus_id: book.id, pid: book.pid});
initBg() { buttonOnClick(bookNode, async () => {
const kidInfo = await this.getKidInfo();
const activeLevels = kidInfo ? kidInfo.active_levels : [];
const activeItem = activeLevels.find(item => item.syllabus_id == data.id);
if (middleLayer && !activeItem) {
// 弹出激活码
middleLayer.getComponent('middleLayer').showActiveWindow();
return;
} }
if (middleLayer) {
const middleLayerComponent = middleLayer.getComponent('middleLayer');
const row = book.children.find(row => row.name == '索引页');
if (!row) {
middleLayerComponent.showTips("未配置‘索引页’");
return;
}
middleLayerComponent.setData('NJ_BookTable', {
folderId: book.id,
courseId: row.id,
});
jumpToCourseWare(row.id);
}
});
});
});
// 播放背景音乐
cc.audioEngine.stopMusic();
cc.audioEngine.playMusic(this.bgMusic1, true);
}
initBtn() { storeCurrentIndex() {
const middleLayer = cc.find('middleLayer');
if (!middleLayer) {
return;
}
const middleLayerComponent = middleLayer.getComponent('middleLayer');
middleLayerComponent.setData('NJ_YueDuJiaYouZhan_select_idx', this.currentIndex);
}
getStoreCurrentIndex() {
const middleLayer = cc.find('middleLayer');
if (!middleLayer) {
return 0;
} }
const middleLayerComponent = middleLayer.getComponent('middleLayer');
const index = middleLayerComponent.getData('NJ_YueDuJiaYouZhan_select_idx');
return index || 0;
}
currentIndex = 0; currentIndex = 0;
leftMove() { leftMove() {
const node = cc.find(`Canvas/bg/L${this.currentIndex+1}`); const node = cc.find(`Canvas/bg/L${this.currentIndex + 1}`);
const nextNode = cc.find(`Canvas/bg/L${this.currentIndex+2}`); const nextNode = cc.find(`Canvas/bg/L${this.currentIndex + 2}`);
this._cantouch = false; this._cantouch = false;
cc.tween(node) cc.tween(node)
.to(.3, { x: -4000 }, { easing: 'cubicInOut' }) .to(.3, { x: -4000 }, { easing: 'cubicInOut' })
...@@ -55,9 +142,10 @@ export default class SceneComponent extends MyCocosSceneComponent { ...@@ -55,9 +142,10 @@ export default class SceneComponent extends MyCocosSceneComponent {
cc.tween(nextNode) cc.tween(nextNode)
.to(.3, { x: 0 }, { easing: 'cubicInOut' }) .to(.3, { x: 0 }, { easing: 'cubicInOut' })
.call(() => { .call(() => {
this.currentIndex ++; this.currentIndex++;
cc.find(`Canvas/bg/right`).active = this.currentIndex<4; this.storeCurrentIndex();
cc.find(`Canvas/bg/left`).active = this.currentIndex>0; cc.find(`Canvas/bg/right`).active = this.currentIndex < 4;
cc.find(`Canvas/bg/left`).active = this.currentIndex > 0;
this._cantouch = true; this._cantouch = true;
}) })
.start(); .start();
...@@ -66,7 +154,7 @@ export default class SceneComponent extends MyCocosSceneComponent { ...@@ -66,7 +154,7 @@ export default class SceneComponent extends MyCocosSceneComponent {
} }
rightMove() { rightMove() {
const node = cc.find(`Canvas/bg/L${this.currentIndex+1}`); const node = cc.find(`Canvas/bg/L${this.currentIndex + 1}`);
const beforeNode = cc.find(`Canvas/bg/L${this.currentIndex}`); const beforeNode = cc.find(`Canvas/bg/L${this.currentIndex}`);
this._cantouch = false; this._cantouch = false;
cc.tween(node) cc.tween(node)
...@@ -75,9 +163,10 @@ export default class SceneComponent extends MyCocosSceneComponent { ...@@ -75,9 +163,10 @@ export default class SceneComponent extends MyCocosSceneComponent {
cc.tween(beforeNode) cc.tween(beforeNode)
.to(.3, { x: 0 }, { easing: 'cubicInOut' }) .to(.3, { x: 0 }, { easing: 'cubicInOut' })
.call(() => { .call(() => {
this.currentIndex --; this.currentIndex--;
cc.find(`Canvas/bg/right`).active = this.currentIndex<4; this.storeCurrentIndex();
cc.find(`Canvas/bg/left`).active = this.currentIndex>0; cc.find(`Canvas/bg/right`).active = this.currentIndex < 4;
cc.find(`Canvas/bg/left`).active = this.currentIndex > 0;
this._cantouch = true; this._cantouch = true;
}) })
.start(); .start();
...@@ -101,7 +190,7 @@ export default class SceneComponent extends MyCocosSceneComponent { ...@@ -101,7 +190,7 @@ export default class SceneComponent extends MyCocosSceneComponent {
const worldPoint = event.getLocation(); const worldPoint = event.getLocation();
const x = worldPoint.x; const x = worldPoint.x;
if (x > this.touchX + 100) { if (x > this.touchX + 100) {
if (this.currentIndex<=0) { if (this.currentIndex <= 0) {
// 已经是第一个了 // 已经是第一个了
return; return;
} }
...@@ -110,7 +199,7 @@ export default class SceneComponent extends MyCocosSceneComponent { ...@@ -110,7 +199,7 @@ export default class SceneComponent extends MyCocosSceneComponent {
} }
if (x < this.touchX - 100) { if (x < this.touchX - 100) {
if (this.currentIndex>=4) { if (this.currentIndex >= 4) {
// 已经是最后一个了 // 已经是最后一个了
return; return;
} }
......
...@@ -87,7 +87,7 @@ export class MyCocosSceneComponent extends cc.Component { ...@@ -87,7 +87,7 @@ export class MyCocosSceneComponent extends cc.Component {
preload() { preload() {
const preloadArr = this._imageResList.concat(this._audioResList).concat(this._animaResList); const preloadArr = this._imageResList.concat(this._audioResList).concat(this._animaResList);
cc.assetManager.loadAny(preloadArr, null, null, (err, data) => { cc.assetManager.loadAny(preloadArr, null, null, async (err, data) => {
if (window && window["air"]) { if (window && window["air"]) {
// window["air"].onCourseInScreen = (next) => { // window["air"].onCourseInScreen = (next) => {
...@@ -95,7 +95,7 @@ export class MyCocosSceneComponent extends cc.Component { ...@@ -95,7 +95,7 @@ export class MyCocosSceneComponent extends cc.Component {
// this.onLoadEnd(); // this.onLoadEnd();
// next(); // next();
// }; // };
this.onLoadEnd(); await this.onLoadEnd();
window["air"].hideAirClassLoading(); window["air"].hideAirClassLoading();
} else { } else {
this.onLoadEnd(); this.onLoadEnd();
......
...@@ -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()
}) })
} }
...@@ -179,7 +179,7 @@ export async function asyncDelay(time) { ...@@ -179,7 +179,7 @@ export async function asyncDelay(time) {
try { try {
cc.tween(cc.find('Canvas')) cc.tween(cc.find('Canvas'))
.delay(time) .delay(time)
.call(()=>{ .call(() => {
resolve(null); resolve(null);
}) })
.start(); .start();
...@@ -236,7 +236,7 @@ export async function asyncLoadDragonBoneAnime(node, { skeJsonData: { url: skeJs ...@@ -236,7 +236,7 @@ export async function asyncLoadDragonBoneAnime(node, { skeJsonData: { url: skeJs
}); });
Promise.all([loadTexture, loadTexJsonData, loadSkeJsonData]).then(([texture, atlasJson, dragonBonesJson]) => { Promise.all([loadTexture, loadTexJsonData, loadSkeJsonData]).then(([texture, atlasJson, dragonBonesJson]) => {
const atlas = new dragonBones.DragonBonesAtlasAsset(); const atlas: any = new dragonBones.DragonBonesAtlasAsset();
atlas.atlasJson = JSON.stringify(atlasJson); atlas.atlasJson = JSON.stringify(atlasJson);
atlas.texture = texture; atlas.texture = texture;
...@@ -246,7 +246,7 @@ export async function asyncLoadDragonBoneAnime(node, { skeJsonData: { url: skeJs ...@@ -246,7 +246,7 @@ export async function asyncLoadDragonBoneAnime(node, { skeJsonData: { url: skeJs
dragonDisplay.dragonAtlasAsset = atlas; dragonDisplay.dragonAtlasAsset = atlas;
dragonDisplay.dragonAsset = asset; dragonDisplay.dragonAsset = asset;
let armatureNames = dragonBonesJson.armature.map(data => data.name); let armatureNames = (<any>dragonBonesJson).armature.map(data => data.name);
if (armatureNames.length > 0) { if (armatureNames.length > 0) {
dragonDisplay.armatureName = armatureNames[0]; dragonDisplay.armatureName = armatureNames[0];
...@@ -411,56 +411,112 @@ export function showTrebleFirework(baseNode, rabbonList) { ...@@ -411,56 +411,112 @@ export function showTrebleFirework(baseNode, rabbonList) {
showFireworks(right); showFireworks(right);
} }
export function httpHeadCall(requsetUrl: string, callback) { export function onHomeworkFinish() {
let xhr = new XMLHttpRequest(); const middleLayer = cc.find('middleLayer');
console.log("Status: Send Post Request to " + requsetUrl); if (middleLayer) {
try { const middleLayerComponent = middleLayer.getComponent('middleLayer');
if (middleLayerComponent.role == 'student') {
middleLayerComponent.onHomeworkFinish(() => { });
}
} else {
console.log('onHomeworkFinish');
}
}
export function asyncCallNetworkApiGet(apiName, data): Promise<any> {
return new Promise((resolve, reject) => {
callNetworkApiGet(apiName, data, (res => {
resolve(res);
}));
});
}
export function asyncCallNetworkApiPost(uri, data): Promise<any> {
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 = () => { xhr.onreadystatechange = () => {
try {
console.log('xhr.readyState: ', xhr.readyState);
if (xhr.readyState == 4) { if (xhr.readyState == 4) {
if ((xhr.status >= 200 && xhr.status < 400)) { callBack(JSON.parse(xhr.responseText));
callback(true);
} else {
callback(false);
} }
} }
xhr.send(JSON.stringify(data));
}
} catch (e) { export function callNetworkApiGet(uri, data, callBack) {
console.log(e) 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);
} }
}; };
xhr.open("HEAD", requsetUrl, true); const url = `${baseUrl}${uri}${queryStr}`;
console.log('url = ' + url);
xhr.open('GET', url, true);
xhr.send(); xhr.send();
xhr.timeout = 15000;
xhr.onerror = (e) => {
callback(false);
};
xhr.ontimeout = (e) => {
callback(false);
};
} catch (e) {
console.log("Send Get Request error: ", e);
}
} }
export function onHomeworkFinish(data = "", callback = ()=>{}) { export function jumpToBundle(bundleName: string) {
const middleLayer = cc.find('middleLayer'); const middleLayer = cc.find('middleLayer');
if (middleLayer) { if (middleLayer) {
const middleLayerComponent = middleLayer.getComponent('middleLayer'); const middleLayerComponent = middleLayer.getComponent('middleLayer');
middleLayerComponent.onHomeworkFinish(callback, data); middleLayerComponent.loadOnlineBundle(bundleName);
} else { } else {
console.log('onHomeworkFinish', JSON.stringify(data)); console.log('jump to bundle: ' + bundleName);
} }
} }
export function callMiddleLayerFunction(apiName: string, data: any, callback: Function) { export function jumpToCourseWare(courseWareId: number) {
const middleLayer = cc.find('middleLayer'); const middleLayer = cc.find('middleLayer');
if (middleLayer) { if (middleLayer) {
const middleLayerComponent = middleLayer.getComponent('middleLayer'); const middleLayerComponent = middleLayer.getComponent('middleLayer');
middleLayerComponent.callMiddleLayerFunction(apiName, data, callback); middleLayerComponent.loadOnlineCourseWare(courseWareId);
} else { } else {
console.log('callMiddleLayerFunction: ' + apiName); console.log('jump to CourseWare: ' + courseWareId);
} }
} }
export function buttonOnClick(button: cc.Node, callback: Function, 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();
});
}
{
"ver": "2.3.5",
"uuid": "71877d61-effa-4495-acaa-306fe0f14a4a",
"type": "sprite",
"wrapMode": "clamp",
"filterMode": "bilinear",
"premultiplyAlpha": false,
"genMipmaps": false,
"packable": true,
"width": 107,
"height": 112,
"platformSettings": {},
"subMetas": {
"btn_return": {
"ver": "1.0.4",
"uuid": "55438c5a-174d-4da0-96b2-e11ea29bd18f",
"rawTextureUuid": "71877d61-effa-4495-acaa-306fe0f14a4a",
"trimType": "auto",
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": 0,
"trimX": 0,
"trimY": 0,
"width": 107,
"height": 112,
"rawWidth": 107,
"rawHeight": 112,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"subMetas": {}
}
}
}
\ No newline at end of file
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