class Cphoto { constructor(root){ this.root = root; this.$cphoto = $(`
`); //this.hide(); //this.root.$ac_game.append(this.$cphoto); this.start(); } start(){ } hide(){ this.$cphoto.hide(); } show(){ this.$cphoto.show(); } } class AcGameMenu { constructor(root) { this.root = root; this.$menu = $(`
头像选择
单人模式

多人模式
天梯榜

退出
`); this.$menu.hide(); this.root.$ac_game.append(this.$menu); this.$single_mode = this.$menu.find('.ac-game-menu-field-item-single-mode'); this.$multi_mode = this.$menu.find('.ac-game-menu-field-item-multi-mode'); this.$settings = this.$menu.find('.ac-game-menu-field-item-settings'); this.$cphoto_button = this.$menu.find('.ac-game-menu-field-item-cphoto'); this.$ranklist_button = this.$menu.find('.ac-game-menu-field-item-ranklist') this.start(); } start() { this.add_listening_events(); } add_listening_events() { let outer = this; this.$single_mode.click(function () { outer.hide(); outer.root.playground.show("single mode"); }); this.$multi_mode.click(function () { outer.hide(); outer.root.playground.show("multi mode"); }); this.$settings.click(function () { outer.root.settings.logout_on_remote(); }); this.$cphoto_button.click(function () { window.location.href = '/photo'; console.log(outer.root.settings.photo); }); this.$ranklist_button.click(function () { $.ajax({ url: "https://app6641.acapp.acwing.com.cn/settings/ranklist/", type: "GET", headers: { 'Authorization': "Bearer " + outer.root.access, }, success: function (resp) { // 清空当前页面内容 document.body.innerHTML = `

用户排名

排名 头像 用户名 分数
`; // 获取表格主体的 DOM 元素 const ranklistBody = document.getElementById('ranklist-body'); // 遍历用户数据并生成 HTML 行 resp.forEach((user, index) => { const row = document.createElement('tr'); // 排名 const rankCell = document.createElement('td'); rankCell.textContent = index + 1; rankCell.setAttribute("style", "padding: 10px; border: 1px solid #ddd; text-align: center;"); row.appendChild(rankCell); // 头像 const photoCell = document.createElement('td'); const img = document.createElement('img'); img.src = user.photo; img.alt = user.username; img.setAttribute("style", "width: 50px; height: 50px; border-radius: 50%;"); photoCell.appendChild(img); photoCell.setAttribute("style", "padding: 10px; border: 1px solid #ddd; text-align: center;"); row.appendChild(photoCell); // 用户名 const usernameCell = document.createElement('td'); usernameCell.textContent = user.username; usernameCell.setAttribute("style", "padding: 10px; border: 1px solid #ddd; text-align: center;"); row.appendChild(usernameCell); // 分数 const scoreCell = document.createElement('td'); scoreCell.textContent = user.score; scoreCell.setAttribute("style", "padding: 10px; border: 1px solid #ddd; text-align: center;"); row.appendChild(scoreCell); // 将行添加到表格主体中 ranklistBody.appendChild(row); }); // 添加“退出”按钮点击事件 document.getElementById('logout-button').addEventListener('click', () => { window.location.href = "https://app6641.acapp.acwing.com.cn/"; // 将此路径替换为实际的注销页面路径 }); }, error: function (xhr, status, error) { console.error("请求失败:", error); alert("无法获取排名列表,请稍后重试。"); } }); }); } show() { this.$menu.show(); } hide() { this.$menu.hide(); } } let AC_GAME_OBJECTS = []; class AcGameObject { constructor() { AC_GAME_OBJECTS.push(this); this.has_called_start = false; // 是否执行过start函数 this.timedelta = 0; // 当前帧距离上一帧的时间间隔 this.uuid = this.create_uuid(); } create_uuid() { let res = ""; for(let i = 0;i < 8 ; i++){ let x = parseInt(Math.floor(Math.random()*10)); res += x; } return res; } start() { // 只会在第一帧执行一次 } update() { // 每一帧均会执行一次 } late_update(){ } on_destroy() { // 在被销毁前执行一次 } destroy() { // 删掉该物体 this.on_destroy(); for (let i = 0; i < AC_GAME_OBJECTS.length; i ++ ) { if (AC_GAME_OBJECTS[i] === this) { AC_GAME_OBJECTS.splice(i, 1); break; } } } } let last_timestamp; let AC_GAME_ANIMATION = function(timestamp) { for (let i = 0; i < AC_GAME_OBJECTS.length; i ++ ) { let obj = AC_GAME_OBJECTS[i]; if (!obj.has_called_start) { obj.start(); obj.has_called_start = true; } else { obj.timedelta = timestamp - last_timestamp; obj.update(); } } for(let i = 0;i< AC_GAME_OBJECTS.length;i++){ let obj = AC_GAME_OBJECTS[i]; obj.late_update(); } last_timestamp = timestamp; requestAnimationFrame(AC_GAME_ANIMATION); } requestAnimationFrame(AC_GAME_ANIMATION); class ChatField{ constructor(playground){ console.log("chat"); this.playground = playground; this.$history = $(`
`) this.$input = $(``) this.$history.hide(); this.$input.hide(); this.playground.$playground.append(this.$history); this.playground.$playground.append(this.$input); this.start(); this.function_id = null; } start(){ this.add_listening_events(); } add_listening_events(){ let outer =this; this.$input.keydown(function(e){ if(e.which === 27){ outer.hide_input(); return false; }else if (e.which === 13){ let username = outer.playground.root.settings.username; let text = outer.$input.val(); if(text){ outer.$input.val(""); outer.add_message(username,text); outer.playground.mps.send_message(text); } return false; } }); } show_history(){ let outer = this; this.$history.fadeIn(); if(this.function_id){ clearTimeout(this.function_id); } this.function_id = setTimeout(function(){ outer.$history.fadeOut(); outer.function_id = null; },3000); } show_input(){ this.show_history(); this.$input.show(); this.$input.focus(); } hide_input(){ this.$input.hide(); this.playground.game_map.$canvas.focus(); } add_message(username,text){ this.show_history(); let message = `[${username}]${text}` this.$history.append(this.render_message(message)); this.$history.scrollTop(this.$history[0].scrollHeight); } render_message(message){ return $(`
${message}
`); } } class GameMap extends AcGameObject{ constructor(playground){ super(); this.playground=playground; this.$canvas = $(``); this.ctx = this.$canvas[0].getContext('2d'); this.ctx.canvas.width = this.playground.width; this.ctx.canvas.height = this.playground.height; this.playground.$playground.append(this.$canvas); } start(){ this.$canvas.focus(); } resize(){ this.ctx.canvas.width = this.playground.width; this.ctx.canvas.height = this.playground.height; this.ctx.fillStyle = "rgba(0,0,0)"; this.ctx.fillRect(0,0,this.ctx.canvas.width,this.ctx.canvas.height); } update(){ this.render(); } render(){ this.ctx.fillStyle = "rgba(0,0,0,0.2)"; this.ctx.fillRect(0,0,this.ctx.canvas.width,this.ctx.canvas.height); } } class NoticeBoard extends AcGameObject { constructor(playground) { super(); this.playground = playground; this.ctx = this.playground.game_map.ctx; this.text = "已就绪:0人"; } start() { } write(text) { this.text = text; } update() { this.render(); } render() { this.ctx.font = "20px serif"; this.ctx.fillStyle = "white"; this.ctx.textAlign = "center"; this.ctx.fillText(this.text, this.playground.width / 2, 20); } } class Particle extends AcGameObject{ constructor(playground,x,y,radius,vx,vy,color,speed,move_length){ super(); this.playground = playground; this.x = x; this.y = y; this.radius = radius; this.vx= vx; this.vy = vy; this.color = color; this.speed = speed; this.ctx = this.playground.game_map.ctx; this.fraction = 0.9; this.eps = 0.01; this.move_length = move_length; } start(){ } update(){ if(this.move_length< this.eps||this.speed< this.eps){ this.destroy(); return false; } let moved = Math.min(this.move_length,this.speed*this.timedelta/1000); this.x += this.vx*moved; this.y += this.vy*moved; this.speed *= this.fraction; this.move_length -= moved; this.render(); } render(){ let scale = this.playground.scale; this.ctx.beginPath(); this.ctx.arc(this.x * scale,this.y * scale,this.radius * scale,0,Math.PI * 2,false); this.ctx.fillStyle = this.color; this.ctx.fill(); } } class Player extends AcGameObject { constructor(playground, x, y, radius, color, speed, character, username, photo) { super(); this.playground = playground; this.ctx = this.playground.game_map.ctx; this.x = x; this.y = y; this.vx = 0; this.vy = 0; this.damage_x = 0; this.damage_y = 0; this.damage_speed = 0; this.move_length = 0; this.radius = radius; this.color = color; this.speed = speed; this.character = character; this.username = username; this.photo = photo; this.eps = 0.01; this.friction = 0.9; this.spent_time = 0; this.fireballs = []; this.cur_skill = null; if (this.character !== "robot") { this.img = new Image(); this.img.src = this.photo; } if (this.character === "me") { this.fireball_coldtime = 3; // 单位:秒 this.fireball_img = new Image(); this.fireball_img.src = "https://cdn.acwing.com/media/article/image/2021/12/02/1_9340c86053-fireball.png"; this.blink_coldtime = 5; // 单位:秒 this.blink_img = new Image(); this.blink_img.src = "https://cdn.acwing.com/media/article/image/2021/12/02/1_daccabdc53-blink.png"; } } start() { this.playground.player_count ++ ; console.log(this.playground.player_count); this.playground.notice_board.write("匹配中"); if (this.playground.player_count >= 3) { this.playground.state = "fighting"; this.playground.notice_board.write("Fighting"); } if (this.character === "me") { this.add_listening_events(); } else if (this.character === "robot") { let tx = Math.random() * this.playground.width / this.playground.scale; let ty = Math.random() * this.playground.height / this.playground.scale; this.move_to(tx, ty); } } add_listening_events() { let outer = this; this.playground.game_map.$canvas.on("contextmenu", function() { return false; }); this.playground.game_map.$canvas.mousedown(function(e) { if (outer.playground.state !== "fighting") return true; const rect = outer.ctx.canvas.getBoundingClientRect(); if (e.which === 3) { let tx = (e.clientX - rect.left) / outer.playground.scale; let ty = (e.clientY - rect.top) / outer.playground.scale; outer.move_to(tx, ty); if (outer.playground.mode === "multi mode") { outer.playground.mps.send_move_to(tx, ty); } } else if (e.which === 1) { let tx = (e.clientX - rect.left) / outer.playground.scale; let ty = (e.clientY - rect.top) / outer.playground.scale; if (outer.cur_skill === "fireball") { if (outer.fireball_coldtime > outer.eps) return false; let fireball = outer.shoot_fireball(tx, ty); if (outer.playground.mode === "multi mode") { outer.playground.mps.send_shoot_fireball(tx, ty, fireball.uuid); } } else if (outer.cur_skill === "blink") { if (outer.blink_coldtime > outer.eps) return false; outer.blink(tx, ty); if (outer.playground.mode === "multi mode") { outer.playground.mps.send_blink(tx, ty); } } outer.cur_skill = null; } }); this.playground.game_map.$canvas.keydown(function(e) { console.log(e.which); if(e.which === 13){ if(outer.playground.mode === "multi mode") outer.playground.chat_field.show_input();//打开了聊天框 } else if (e.which === 27){ if(outer.playground.mode === "multi mode"){ outer.playground.chat_field.hide_input(); } } if (outer.playground.state !== "fighting") return true; if (e.which === 81) { // q if (outer.fireball_coldtime > outer.eps) return true; outer.cur_skill = "fireball"; return false; } else if (e.which === 70) { // f if (outer.blink_coldtime > outer.eps) return true; outer.cur_skill = "blink"; return false; } }); } shoot_fireball(tx, ty) { let x = this.x, y = this.y; let radius = 0.01; let angle = Math.atan2(ty - this.y, tx - this.x); let vx = Math.cos(angle), vy = Math.sin(angle); let color = "orange"; let speed = 0.5; let move_length = 1; let fireball = new FireBall(this.playground, this, x, y, radius, vx, vy, color, speed, move_length, 0.01); this.fireballs.push(fireball); this.fireball_coldtime = 3; return fireball; } destroy_fireball(uuid) { for (let i = 0; i < this.fireballs.length; i ++ ) { let fireball = this.fireballs[i]; if (fireball.uuid === uuid) { fireball.destroy(); break; } } } blink(tx, ty) { let d = this.get_dist(this.x, this.y, tx, ty); d = Math.min(d, 0.8); let angle = Math.atan2(ty - this.y, tx - this.x); this.x += d * Math.cos(angle); this.y += d * Math.sin(angle); this.blink_coldtime = 5; this.move_length = 0; // 闪现完停下来 } get_dist(x1, y1, x2, y2) { let dx = x1 - x2; let dy = y1 - y2; return Math.sqrt(dx * dx + dy * dy); } move_to(tx, ty) { this.move_length = this.get_dist(this.x, this.y, tx, ty); let angle = Math.atan2(ty - this.y, tx - this.x); this.vx = Math.cos(angle); this.vy = Math.sin(angle); } is_attacked(angle, damage) { for (let i = 0; i < 20 + Math.random() * 10; i ++ ) { let x = this.x, y = this.y; let radius = this.radius * Math.random() * 0.1; let angle = Math.PI * 2 * Math.random(); let vx = Math.cos(angle), vy = Math.sin(angle); let color = this.color; let speed = this.speed * 10; let move_length = this.radius * Math.random() * 5; new Particle(this.playground, x, y, radius, vx, vy, color, speed, move_length); } this.radius -= damage; if (this.radius < this.eps) { this.destroy(); return false; } this.damage_x = Math.cos(angle); this.damage_y = Math.sin(angle); this.damage_speed = damage * 100; this.speed *= 0.8; } receive_attack(x, y, angle, damage, ball_uuid, attacker) { attacker.destroy_fireball(ball_uuid); this.x = x; this.y = y; this.is_attacked(angle, damage); } update() { this.spent_time += this.timedelta / 1000; this.update_win(); if (this.character === "me" && this.playground.state === "fighting") { this.update_coldtime(); } this.update_move(); this.render(); } update_win(){ if(this.playground.state === "fighting" && this.character === "me" && this.playground.players.length === 1){ this.state = "over"; this.playground.score_board.win(); } } update_coldtime() { this.fireball_coldtime -= this.timedelta / 1000; this.fireball_coldtime = Math.max(this.fireball_coldtime, 0); this.blink_coldtime -= this.timedelta / 1000; this.blink_coldtime = Math.max(this.blink_coldtime, 0); } update_move() { // 更新玩家移动 if (this.character === "robot" && this.spent_time > 4 && Math.random() < 1 / 300.0) { let player = this.playground.players[Math.floor(Math.random() * this.playground.players.length)]; let tx = player.x + player.speed * this.vx * this.timedelta / 1000 * 0.3; let ty = player.y + player.speed * this.vy * this.timedelta / 1000 * 0.3; this.shoot_fireball(tx, ty); } if (this.damage_speed > this.eps) { this.vx = this.vy = 0; this.move_length = 0; this.x += this.damage_x * this.damage_speed * this.timedelta / 1000; this.y += this.damage_y * this.damage_speed * this.timedelta / 1000; this.damage_speed *= this.friction; } else { if (this.move_length < this.eps) { this.move_length = 0; this.vx = this.vy = 0; if (this.character === "robot") { let tx = Math.random() * this.playground.width / this.playground.scale; let ty = Math.random() * this.playground.height / this.playground.scale; this.move_to(tx, ty); } } else { let moved = Math.min(this.move_length, this.speed * this.timedelta / 1000); this.x += this.vx * moved; this.y += this.vy * moved; this.move_length -= moved; } } } render() { let scale = this.playground.scale; if (this.character !== "robot") { this.ctx.save(); this.ctx.beginPath(); this.ctx.arc(this.x * scale, this.y * scale, this.radius * scale, 0, Math.PI * 2, false); this.ctx.stroke(); this.ctx.clip(); this.ctx.drawImage(this.img, (this.x - this.radius) * scale, (this.y - this.radius) * scale, this.radius * 2 * scale, this.radius * 2 * scale); this.ctx.restore(); } else { this.ctx.beginPath(); this.ctx.arc(this.x * scale, this.y * scale, this.radius * scale, 0, Math.PI * 2, false); this.ctx.fillStyle = this.color; this.ctx.fill(); } if (this.character === "me" && this.playground.state === "fighting") { this.render_skill_coldtime(); } } render_skill_coldtime() { let scale = this.playground.scale; let x = 1.5, y = 0.9, r = 0.04; this.ctx.save(); this.ctx.beginPath(); this.ctx.arc(x * scale, y * scale, r * scale, 0, Math.PI * 2, false); this.ctx.stroke(); this.ctx.clip(); this.ctx.drawImage(this.fireball_img, (x - r) * scale, (y - r) * scale, r * 2 * scale, r * 2 * scale); this.ctx.restore(); if (this.fireball_coldtime > 0) { this.ctx.beginPath(); this.ctx.moveTo(x * scale, y * scale); this.ctx.arc(x * scale, y * scale, r * scale, 0 - Math.PI / 2, Math.PI * 2 * (1 - this.fireball_coldtime / 3) - Math.PI / 2, true); this.ctx.lineTo(x * scale, y * scale); this.ctx.fillStyle = "rgba(0, 0, 255, 0.6)"; this.ctx.fill(); } x = 1.62, y = 0.9, r = 0.04; this.ctx.save(); this.ctx.beginPath(); this.ctx.arc(x * scale, y * scale, r * scale, 0, Math.PI * 2, false); this.ctx.stroke(); this.ctx.clip(); this.ctx.drawImage(this.blink_img, (x - r) * scale, (y - r) * scale, r * 2 * scale, r * 2 * scale); this.ctx.restore(); if (this.blink_coldtime > 0) { this.ctx.beginPath(); this.ctx.moveTo(x * scale, y * scale); this.ctx.arc(x * scale, y * scale, r * scale, 0 - Math.PI / 2, Math.PI * 2 * (1 - this.blink_coldtime / 5) - Math.PI / 2, true); this.ctx.lineTo(x * scale, y * scale); this.ctx.fillStyle = "rgba(0, 0, 255, 0.6)"; this.ctx.fill(); } } on_destroy() { if (this.character === "me"){ if(this.playground.state === "fighting"){ this.playground.state = "over"; this.playground.score_board.lose(); } } for (let i = 0; i < this.playground.players.length; i ++ ) { if (this.playground.players[i] === this) { this.playground.players.splice(i, 1); break; } } } } class ScoreBoard extends AcGameObject { constructor(playground) { super(); this.playground = playground; this.ctx = this.playground.game_map.ctx; this.state = null; // win: 胜利,lose:失败 this.win_img = new Image(); this.win_img.src = "https://cdn.acwing.com/media/article/image/2021/12/17/1_8f58341a5e-win.png"; this.lose_img = new Image(); this.lose_img.src = "https://cdn.acwing.com/media/article/image/2021/12/17/1_9254b5f95e-lose.png"; } start() { } add_listening_events() { let outer = this; if(this.playground.game_map === null) return; let $canvas = this.playground.game_map.$canvas; $canvas.on('click', function() { outer.playground.hide(); outer.playground.root.menu.show(); }); } win() { this.state = "win"; let outer = this; setTimeout(function() { outer.add_listening_events(); }, 1000); } lose() { this.state = "lose"; let outer = this; setTimeout(function() { outer.add_listening_events(); }, 1000); } late_update() { this.render(); } render() { let len = this.playground.height / 2; if (this.state === "win") { this.ctx.drawImage(this.win_img, this.playground.width / 2 - len / 2, this.playground.height / 2 - len / 2, len, len); } else if (this.state === "lose") { this.ctx.drawImage(this.lose_img, this.playground.width / 2 - len / 2, this.playground.height / 2 - len / 2, len, len); } } } class FireBall extends AcGameObject { constructor(playground,player,x,y,radius,vx,vy,color,speed,move_length,damage){ super(); this.playground=playground; this.ctx = this.playground.game_map.ctx; this.player = player; this.x = x; this.y = y; this.radius = radius; this.vx = vx; this.vy = vy; this.color = color; this.speed = speed ; this.move_length = move_length; this.eps = 0.01; this.damage = damage; } start(){ } update(){ if(this.move_length < this.eps){ this.destroy(); return false; } this.update_move(); if(this.player.charactr !== "enemy"){ this.update_attack(); } this.render(); } update_move(){ let moved = Math.min(this.move_length,this.speed * this.timedelta / 1000); this.x += this.vx * moved; this.y += this.vy * moved; this.move_length -= moved; } update_attack(){ for ( let i=0;i`); this.hide(); this.root.$ac_game.append(this.$playground); this.start(); } get_random_color(){ let colors = ["blue","red","green","pink","grey"]; return colors[Math.floor(Math.random()*5)]; } start(){ let outer=this; let uuid = this.create_uuid(); $(window).on(`resize.${uuid}`,function(){ outer.resize(); }); if(this.root.AcWingOS){ this.root.AcWingOS.api.window.on_close(function(){ $(window).off(`resize.${uuid}`); }); } } create_uuid() { let res = ""; for(let i = 0;i < 8 ; i++){ let x = parseInt(Math.floor(Math.random()*10)); res += x; } return res; } resize(){ this.width = this.$playground.width(); this.height = this.$playground.height(); this.unit= Math.min(this.width/16,this.height/9); this.width = this.unit * 16; this.height = this.unit*9; this.scale = this.height; if(this.game_map)this.game_map.resize(); } update(){ } show(mode){ let outer = this; this.$playground.show(); this.$playground.resize(); this.width= this.$playground.width(); this.height = this.$playground.height(); this.game_map = new GameMap(this); this.resize(); this.players = []; this.players.push(new Player(this,this.width/2/this.scale,0.5,0.05,"white",0.15,"me",this.root.settings.username,this.root.settings.photo)); this.mode = mode; this.state = "waiting"; this.notice_board = new NoticeBoard(this); this.score_board = new ScoreBoard(this); this.player_count = 0; if(mode === "single mode") for (let i = 0; i < 5; i ++ ) { this.players.push(new Player(this, this.width / 2/this.scale, 0.5, 0.05, this.get_random_color(), 0.15, "robot")); } else if(mode === "multi mode"){ this.chat_field = new ChatField(this); this.mps = new MultiPlayerSocket(this); this.mps.uuid = this.players[0].uuid; this.mps.ws.onopen = function(){ outer.mps.send_create_player(outer.root.settings.username,outer.root.settings.photo); }; } } hide(){ while(this.players && this.players.length > 0){ this.players[0].destroy(); } if(this.game_map){ this.game_map.destroy(); this.game_map = null; } if(this.notice_board){ this.notice_board.destroy(); this.notice_board = null; } if(this.score_board){ this.score_board.destroy(); this.score_board = null; } this.$playground.empty(); this.$playground.hide(); } } class Settings{ constructor(root){ this.root = root; this.platform = "WEB"; if(this.root.AcWingOS) this.platform = "ACAPP"; this.username = ""; this.photo = "https://cdn.acwing.com/media/user/profile/photo/355448_sm_2015d90652.jpg"; this.$settings = $(`
注册


登录


AcWing一键登录
`); this.$login = this.$settings.find(".ac-game-settings-login"); this.$login_username = this.$login.find(".ac-game-settings-username input"); this.$login_password = this.$login.find(".ac-game-settings-password input"); this.$login_submit = this.$login.find(".ac-game-settings-submit button"); this.$login_error_message = this.$login.find(".ac-game-settings-error-message"); this.$login_register = this.$login.find(".ac-game-settings-option"); this.$login.hide(); this.$register = this.$settings.find(".ac-game-settings-register"); this.$register_username = this.$register.find(".ac-game-settings-username input"); this.$register_password = this.$register.find(".ac-game-settings-password-first input"); this.$register_password_confirm = this.$register.find(".ac-game-settings-password-second input"); this.$register_submit = this.$register.find(".ac-game-settings-submit button"); this.$register_error_message = this.$register.find(".ac-game-settings-error-message"); this.$register_login = this.$register.find(".ac-game-settings-option"); this.$register.hide(); this.$acwing_login = this.$settings.find(".ac-game-settings-acwing img"); this.root.$ac_game.append(this.$settings); this.start(); } start(){ if (this.platform === "ACAPP"){ this.getinfo_acapp(); }else{ if(this.root.access){ this.getinfo_web(); this.refresh_jwt_token(); } else { this.login(); } this.add_listening_events(); } } refresh_jwt_token(){ setInterval(() => { $.ajax({ url:"https://app6641.acapp.acwing.com.cn/settings/token/refresh/", type:"post", data:{ refresh:this.root.refresh, }, success: resp => { this.root.access = resp.access; } }); },4.5*60*1000); setTimeout(() => { $.ajax({ url:"https://app6641.acapp.acwing.com.cn/settings/ranklist/", type:"GET", headers:{ 'Authorization': "Bearer "+ this.root.access, }, success: resp => { console.log(resp); } }); },5000); } add_listening_events(){ let outer = this; this.add_listening_events_login(); this.add_listening_events_register(); this.$acwing_login.click(function(){ outer.acwing_login(); }); } add_listening_events_login(){ let outer =this; this.$login_register.click(function(){ outer.register(); }); this.$login_submit.click(function(){ outer.login_on_remote(); }); } add_listening_events_register(){ let outer = this; this.$register_login.click(function(){ outer.login(); }); this.$register_submit.click(function() { outer.register_on_remote(); }); } acwing_login() { $.ajax({ url: "https://app6641.acapp.acwing.com.cn/settings/acwing/web/apply_code/", type: "GET", success: function(resp) { if (resp.result === "success") { window.location.replace(resp.apply_code_url); } } }); } login_on_remote(username , password) { let outer = this; username = username || this.$login_username.val(); password = password || this.$login_password.val(); this.$login_error_message.empty(); $.ajax({ url: "https://app6641.acapp.acwing.com.cn/settings/token/", type: "post", data: { username: username, password: password, }, success: resp =>{ this.root.access = resp.access; this.root.refresh = resp.refresh; this.refresh_jwt_token(); this.getinfo_web(); }, error:() => { this.$login_error_message.html("用户名密码错误"); }, }); } register_on_remote(){ let outer = this; let username = this.$register_username.val(); let password = this.$register_password.val(); let password_confirm = this.$register_password_confirm.val(); this.$register_error_message.empty(); $.ajax({ url: "https://app6641.acapp.acwing.com.cn/settings/register/", type: "POST", data: { username: username, password: password, password_confirm:password_confirm, }, success: resp =>{ if(resp.result === "success"){ this.login_on_remote(username,password); } else { this.$register_error_message.html(resp.result); } } }); } logout_on_remote(){ if(this.platform === "ACAPP") { this.root.AcWingOS.api.window.close(); } else { this.root.access = ""; this.root.refresh = ""; location.href = "/"; } } login(){//打开登陆界面 this.$register.hide(); this.$login.show(); } register(){// 打开注册界面 this.$login.hide(); this.$register.show(); } acapp_login(appid, redirect_uri, scope, state) { let outer = this; this.root.AcWingOS.api.oauth2.authorize(appid, redirect_uri, scope, state, function(resp) { if (resp.result === "success") { outer.username = resp.username; outer.photo = resp.photo; outer.hide(); outer.root.menu.show(); outer.root.access = resp.access; outer.root.refresh = resp.refresh; outer.refresh_jwt_token(); } }); } getinfo_acapp(){ let outer = this; $.ajax({ url: "https://app6641.acapp.acwing.com.cn/settings/acwing/acapp/receive_code/", type:"GET", success: function(resp){ if(resp.result === "success"){ outer.acapp_login(resp.appid,resp.redirect_uri,resp.scope,resp.state); } } }); } getinfo_acapp() { let outer = this; $.ajax({ url: "https://app6641.acapp.acwing.com.cn/settings/acwing/acapp/apply_code/", type: "GET", success: function(resp) { if (resp.result === "success") { outer.acapp_login(resp.appid, resp.redirect_uri, resp.scope, resp.state); } } }); } getinfo_web(){ let outer = this; $.ajax({ url:"https://app6641.acapp.acwing.com.cn/settings/getinfo/", type:"get", data:{ platform:outer.platform, }, headers:{ 'authorization':"Bearer "+this.root.access, }, success:function(resp){ console.log(resp); if(resp.result === "success"){ outer.username = resp.username; outer.photo = resp.photo; outer.hide(); outer.root.menu.show(); } else { outer.login(); } }, }); } hide(){ this.$settings.hide(); } show(){ this.$settings.show(); } } export class AcGame { constructor(id, AcWingOS, access, refresh) { this.id = id; this.$ac_game = $('#' + id); this.AcWingOS = AcWingOS; this.access = access; this.refresh = refresh; this.settings = new Settings(this); this.menu = new AcGameMenu(this); this.playground = new AcGamePlayground(this); this.start(); } start() { } }