| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335 |
- import { _decorator, Component, Node, director, assetManager, ProgressBar, Label, Sprite, SpriteFrame, resources } from 'cc';
- import { Analytics } from './Utils/AnalyticsManager';
- import { MPLifecycle } from './Utils/MPLifecycleManager';
- import './Utils/BlockMergeTrackingTest';
- const { ccclass, property } = _decorator;
- // 微信小游戏API类型声明
- declare global {
- interface Window {
- wx?: {
- loadSubpackage?: (options: {
- name: string;
- success?: () => void;
- fail?: (err: any) => void;
- }) => any;
- getLaunchOptionsSync?: () => any;
- onShow?: (callback: (options: any) => void) => void;
- onHide?: (callback: () => void) => void;
- };
- }
- const wx: {
- loadSubpackage?: (options: {
- name: string;
- success?: () => void;
- fail?: (err: any) => void;
- }) => any;
- getLaunchOptionsSync?: () => any;
- onShow?: (callback: (options: any) => void) => void;
- onHide?: (callback: () => void) => void;
- } | undefined;
- }
- @ccclass('LaunchScreen')
- export class LaunchScreen extends Component {
- @property(ProgressBar)
- progressBar: ProgressBar = null;
- @property(Label)
- progressLabel: Label = null;
- @property(Sprite)
- backgroundSprite: Sprite = null;
- @property(SpriteFrame)
- launchBackground: SpriteFrame = null;
- private totalAssets = 0;
- private loadedAssets = 0;
- private sceneLoadStartTime = 0;
- private launchOptions: any = {};
- start() {
- console.log('[LaunchScreen] 启动页开始初始化');
-
- // 初始化埋点管理器
- Analytics.init();
-
- // 初始化小程序生命周期管理器
- MPLifecycle.init();
-
- // 注册与登录埋点
- this.setupAuthTracking();
- // 追踪小程序启动事件
- this.trackMPLaunch();
-
- // 设置启动页背景
- this.setupBackground();
-
- // 开始预加载游戏资源
- this.preloadGameAssets();
- }
- /**
- * 设置启动页背景
- */
- private setupBackground() {
- if (this.backgroundSprite && this.launchBackground) {
- this.backgroundSprite.spriteFrame = this.launchBackground;
- console.log('[LaunchScreen] 启动页背景设置完成');
- }
- }
- /**
- * 预加载游戏资源
- */
- private async preloadGameAssets() {
- try {
- console.log('[LaunchScreen] 开始预加载游戏资源');
-
- // 更新进度显示
- this.updateProgress(0, '正在加载游戏资源...');
- // 直接预加载GameLevel场景(不使用分包)
- await this.preloadGameLevelScene();
-
- // 预加载完成,跳转到游戏场景
- this.loadGameScene();
-
- } catch (error) {
- console.error('[LaunchScreen] 资源预加载失败:', error);
- this.updateProgress(0, '资源加载失败,请重试');
- }
- }
- /**
- * 直接预加载GameLevel场景
- */
- private preloadGameLevelScene(): Promise<void> {
- return new Promise<void>((resolve, reject) => {
- console.log('[LaunchScreen] 开始预加载GameLevel场景');
-
- // 追踪场景加载开始事件
- this.sceneLoadStartTime = Date.now();
- Analytics.trackSceneLoadStart('GameLevel');
-
- // 直接预加载场景
- director.preloadScene('GameLevel', (finished: number, total: number) => {
- const progress = finished / total;
- this.updateProgress(progress * 100, `正在加载游戏场景... ${Math.floor(progress * 100)}%`);
- }, (err) => {
- const loadTime = Date.now() - this.sceneLoadStartTime;
-
- if (err) {
- console.error('[LaunchScreen] GameLevel场景预加载失败:', err);
-
- // 追踪场景加载失败事件
- Analytics.trackSceneLoaded({
- scene_name: 'GameLevel',
- load_time: loadTime,
- success: false,
- error_msg: err.toString()
- });
-
- // 预加载失败时,仍然尝试直接跳转(可能场景存在但预加载失败)
- console.log('[LaunchScreen] 预加载失败,但仍将尝试直接加载场景');
- this.updateProgress(100, '准备进入游戏...');
- resolve();
- return;
- }
-
- console.log('[LaunchScreen] GameLevel场景预加载完成');
-
- // 追踪场景加载成功事件
- Analytics.trackSceneLoaded({
- scene_name: 'GameLevel',
- load_time: loadTime,
- success: true
- });
-
- this.updateProgress(100, '加载完成!');
- resolve();
- });
- });
- }
-
- /**
- * 更新加载进度
- */
- private updateProgress(progress: number, message: string) {
- if (this.progressBar) {
- this.progressBar.progress = progress / 100;
- }
-
- if (this.progressLabel) {
- this.progressLabel.string = message;
- }
-
- console.log(`[LaunchScreen] ${message} (${progress.toFixed(1)}%)`);
- }
- /**
- * 跳转到游戏场景
- */
- private loadGameScene() {
- console.log('[LaunchScreen] 准备跳转到GameLevel场景');
-
- // 延迟一秒后跳转,让用户看到加载完成的提示
- this.scheduleOnce(() => {
- // 直接加载GameLevel场景
- director.loadScene('GameLevel', (err) => {
- if (err) {
- console.error('[LaunchScreen] GameLevel场景加载失败:', err);
- console.log('[LaunchScreen] 尝试降级方案:停留在启动页面');
- this.updateProgress(0, 'GameLevel场景不存在,请检查场景配置');
-
- // 提供重试按钮或其他交互方式
- this.scheduleOnce(() => {
- this.updateProgress(0, '点击屏幕重试或检查场景配置');
- }, 2.0);
- return;
- }
-
- console.log('[LaunchScreen] 成功切换到GameLevel场景');
- });
- }, 1.0);
- }
- // ==================== 埋点相关方法 ====================
- /**
- * 追踪小程序启动事件
- */
- private trackMPLaunch(): void {
- // 使用已获取的启动参数
- const opts = this.launchOptions || {};
- Analytics.trackMPLaunch({
- scene: opts.scene || 0,
- query: JSON.stringify(opts.query || {}),
- shareTicket: opts.shareTicket || '',
- referrerInfo: opts.referrerInfo || {}
- });
- // 检测是否通过分享启动,如果是则追踪分享事件
- if (opts.shareTicket) {
- this.trackMPShareFromLaunch(opts);
- }
- }
- /**
- * 追踪通过分享启动的事件
- */
- private trackMPShareFromLaunch(launchOptions: any): void {
- try {
- Analytics.trackMPShare({
- share_type: 'launch_from_share', // 分享类型:从分享启动
- share_target: 'unknown', // 分享目标:未知(启动时无法确定)
- share_content: launchOptions.shareTicket || '', // 分享内容:shareTicket
- share_time: Date.now(), // 分享时间戳
- scene: launchOptions.scene || 0, // 启动场景
- query: JSON.stringify(launchOptions.query || {}) // 启动参数
- });
- console.log('[LaunchScreen] $MPShare 事件已上报(从分享启动):', launchOptions);
- } catch (error) {
- console.error('[LaunchScreen] 追踪分享启动事件时出错:', error);
- }
- }
- /**
- * 设置注册/登录/登出/创建角色埋点
- */
- private setupAuthTracking(): void {
- // 获取并缓存启动参数(微信小游戏环境)
- if (typeof wx !== 'undefined' && wx.getLaunchOptionsSync) {
- try {
- this.launchOptions = wx.getLaunchOptionsSync() || {};
- } catch (error) {
- console.warn('[LaunchScreen] 获取启动参数失败:', error);
- this.launchOptions = {};
- }
- }
- const sceneVal = this.launchOptions?.scene || 0;
- const queryStr = JSON.stringify(this.launchOptions?.query || {});
- // 首次注册(本地标记判断)
- try {
- const firstFlag = localStorage.getItem('first_register_tracked');
- if (!firstFlag) {
- Analytics.trackUserFirstRegister({
- register_time: Date.now(),
- channel: typeof wx !== 'undefined' ? 'wechat_game' : 'web',
- scene: sceneVal,
- query: queryStr
- });
- // 小程序注册事件(首次)
- Analytics.trackMPRegister({
- register_time: Date.now(),
- scene: sceneVal,
- query: queryStr
- });
- // 创建角色(首次运行时认为创建默认角色)
- this.trackInitialRoleCreate();
- localStorage.setItem('first_register_tracked', '1');
- }
- } catch (e) {
- console.warn('[LaunchScreen] 处理首次注册标记失败:', e);
- }
- // 小程序登录事件(每次启动)
- Analytics.trackMPLogin({
- login_time: Date.now(),
- scene: sceneVal,
- query: queryStr
- });
- // 小程序登出事件(监听 onHide)
- if (typeof wx !== 'undefined' && wx.onHide) {
- try {
- wx.onHide(() => {
- Analytics.trackMPLogout({
- logout_time: Date.now(),
- scene: sceneVal
- });
- });
- } catch (error) {
- console.warn('[LaunchScreen] 注册 onHide 失败:', error);
- }
- }
- }
- /**
- * 首次运行时创建默认角色并上报
- */
- private trackInitialRoleCreate(): void {
- try {
- const roleFlag = localStorage.getItem('default_role_created');
- if (!roleFlag) {
- Analytics.trackCreateRole({
- role_id: 'default_player',
- role_name: 'Player',
- role_class: 'starter',
- create_time: Date.now(),
- user_level: 1
- });
- localStorage.setItem('default_role_created', '1');
- console.log('[LaunchScreen] $CreateRole 事件已上报(默认角色创建)');
- }
- } catch (e) {
- console.warn('[LaunchScreen] 创建默认角色标记失败:', e);
- }
- }
- /**
- * 组件销毁时的清理工作
- */
- onDestroy(): void {
- // 追踪场景卸载事件
- Analytics.trackSceneUnloaded('LaunchScreen');
- }
- }
|