244 lines
6.3 KiB
JavaScript
244 lines
6.3 KiB
JavaScript
/**
|
||
* 星域故事汇 - 主逻辑控制器
|
||
*/
|
||
import SceneManager from './scenes/SceneManager';
|
||
import UserManager from './data/UserManager';
|
||
import StoryManager from './data/StoryManager';
|
||
import AudioManager from './data/AudioManager';
|
||
|
||
export default class Main {
|
||
constructor() {
|
||
// 获取画布和上下文
|
||
this.canvas = GameGlobal.canvas;
|
||
this.ctx = this.canvas.getContext('2d');
|
||
this.screenWidth = GameGlobal.screenWidth;
|
||
this.screenHeight = GameGlobal.screenHeight;
|
||
this.dpr = GameGlobal.devicePixelRatio;
|
||
|
||
// 缩放上下文以适配设备像素比
|
||
this.ctx.scale(this.dpr, this.dpr);
|
||
|
||
// 初始化管理器
|
||
this.userManager = new UserManager();
|
||
this.storyManager = new StoryManager();
|
||
this.audioManager = new AudioManager();
|
||
this.sceneManager = new SceneManager(this);
|
||
|
||
// 初始化游戏
|
||
this.init();
|
||
}
|
||
|
||
async init() {
|
||
// 先启动游戏循环,确保能渲染加载界面
|
||
this.bindEvents();
|
||
this.loop();
|
||
|
||
try {
|
||
// 显示加载界面
|
||
this.showLoading('正在加载...');
|
||
console.log('[Main] 开始初始化...');
|
||
|
||
// 用户初始化(失败不阻塞)
|
||
console.log('[Main] 初始化用户...');
|
||
await this.userManager.init().catch(e => {
|
||
console.warn('[Main] 用户初始化失败,使用游客模式:', e);
|
||
});
|
||
console.log('[Main] 用户初始化完成');
|
||
|
||
// 加载故事列表
|
||
console.log('[Main] 加载故事列表...');
|
||
await this.storyManager.loadStoryList();
|
||
console.log('[Main] 故事列表加载完成,共', this.storyManager.storyList.length, '个故事');
|
||
|
||
// 隐藏加载界面
|
||
this.hideLoading();
|
||
|
||
// 进入首页
|
||
this.sceneManager.switchScene('home');
|
||
console.log('[Main] 初始化完成,进入首页');
|
||
|
||
// 设置分享
|
||
this.setupShare();
|
||
|
||
// 启动草稿检查(仅登录用户)
|
||
if (this.userManager.isLoggedIn) {
|
||
this.startDraftChecker();
|
||
}
|
||
} catch (error) {
|
||
console.error('[Main] 初始化失败:', error);
|
||
this.hideLoading();
|
||
this.showError('初始化失败,请重试');
|
||
}
|
||
}
|
||
|
||
// 显示加载
|
||
showLoading(text) {
|
||
this.isLoading = true;
|
||
this.loadingText = text;
|
||
this.render();
|
||
}
|
||
|
||
// 隐藏加载
|
||
hideLoading() {
|
||
this.isLoading = false;
|
||
}
|
||
|
||
// 显示错误
|
||
showError(text) {
|
||
wx.showToast({
|
||
title: text,
|
||
icon: 'none',
|
||
duration: 2000
|
||
});
|
||
}
|
||
|
||
// 绑定事件
|
||
bindEvents() {
|
||
// 触摸开始
|
||
wx.onTouchStart((e) => {
|
||
if (this.sceneManager.currentScene) {
|
||
this.sceneManager.currentScene.onTouchStart(e);
|
||
}
|
||
});
|
||
|
||
// 触摸移动
|
||
wx.onTouchMove((e) => {
|
||
if (this.sceneManager.currentScene) {
|
||
this.sceneManager.currentScene.onTouchMove(e);
|
||
}
|
||
});
|
||
|
||
// 触摸结束
|
||
wx.onTouchEnd((e) => {
|
||
if (this.sceneManager.currentScene) {
|
||
this.sceneManager.currentScene.onTouchEnd(e);
|
||
}
|
||
});
|
||
}
|
||
|
||
// 启动草稿检查定时器
|
||
startDraftChecker() {
|
||
// 避免重复启动
|
||
if (this.draftCheckTimer) return;
|
||
|
||
console.log('[Main] 启动草稿检查定时器');
|
||
|
||
// 每30秒检查一次
|
||
this.draftCheckTimer = setInterval(async () => {
|
||
try {
|
||
if (!this.userManager.isLoggedIn) return;
|
||
|
||
const result = await this.storyManager.checkNewDrafts(this.userManager.userId);
|
||
|
||
if (result && result.hasNew && result.count > 0) {
|
||
console.log('[Main] 检测到新草稿:', result.count);
|
||
|
||
// 先标记为已读,避免重复弹窗
|
||
await this.storyManager.markAllDraftsRead(this.userManager.userId);
|
||
|
||
// 弹窗通知
|
||
wx.showModal({
|
||
title: 'AI改写完成',
|
||
content: `您有 ${result.count} 个新的AI改写已完成,是否前往查看?`,
|
||
confirmText: '查看',
|
||
cancelText: '稍后',
|
||
success: (res) => {
|
||
if (res.confirm) {
|
||
// 跳转到个人中心的草稿箱 tab
|
||
this.sceneManager.switchScene('profile', { tab: 1 });
|
||
} else {
|
||
// 点击稍后,如果当前在个人中心页面则刷新草稿列表
|
||
const currentScene = this.sceneManager.currentScene;
|
||
if (currentScene && currentScene.refreshDrafts) {
|
||
currentScene.refreshDrafts();
|
||
}
|
||
}
|
||
}
|
||
});
|
||
}
|
||
} catch (e) {
|
||
console.warn('[Main] 草稿检查失败:', e);
|
||
}
|
||
}, 30000);
|
||
}
|
||
|
||
// 停止草稿检查定时器
|
||
stopDraftChecker() {
|
||
if (this.draftCheckTimer) {
|
||
clearInterval(this.draftCheckTimer);
|
||
this.draftCheckTimer = null;
|
||
console.log('[Main] 停止草稿检查定时器');
|
||
}
|
||
}
|
||
|
||
// 设置分享
|
||
setupShare() {
|
||
wx.showShareMenu({
|
||
withShareTicket: true,
|
||
menus: ['shareAppMessage', 'shareTimeline']
|
||
});
|
||
|
||
wx.onShareAppMessage(() => {
|
||
return {
|
||
title: '星域故事汇 - 每个选择都是一个新世界',
|
||
imageUrl: '',
|
||
query: ''
|
||
};
|
||
});
|
||
|
||
wx.onShareTimeline(() => {
|
||
return {
|
||
title: '星域故事汇 - 沉浸式互动故事体验',
|
||
query: ''
|
||
};
|
||
});
|
||
}
|
||
|
||
// 游戏循环
|
||
loop() {
|
||
this.update();
|
||
this.render();
|
||
requestAnimationFrame(() => this.loop());
|
||
}
|
||
|
||
// 更新逻辑
|
||
update() {
|
||
if (this.sceneManager.currentScene) {
|
||
this.sceneManager.currentScene.update();
|
||
}
|
||
}
|
||
|
||
// 渲染
|
||
render() {
|
||
// 清屏
|
||
this.ctx.clearRect(0, 0, this.screenWidth, this.screenHeight);
|
||
|
||
// 绘制背景
|
||
this.ctx.fillStyle = '#1a1a2e';
|
||
this.ctx.fillRect(0, 0, this.screenWidth, this.screenHeight);
|
||
|
||
// 渲染当前场景
|
||
if (this.sceneManager.currentScene) {
|
||
this.sceneManager.currentScene.render(this.ctx);
|
||
}
|
||
|
||
// 渲染加载界面
|
||
if (this.isLoading) {
|
||
this.renderLoading();
|
||
}
|
||
}
|
||
|
||
// 渲染加载界面
|
||
renderLoading() {
|
||
// 半透明遮罩
|
||
this.ctx.fillStyle = 'rgba(0, 0, 0, 0.7)';
|
||
this.ctx.fillRect(0, 0, this.screenWidth, this.screenHeight);
|
||
|
||
// 加载文字
|
||
this.ctx.fillStyle = '#ffffff';
|
||
this.ctx.font = '18px sans-serif';
|
||
this.ctx.textAlign = 'center';
|
||
this.ctx.fillText(this.loadingText || '加载中...', this.screenWidth / 2, this.screenHeight / 2);
|
||
}
|
||
}
|