// 工具类 class Utils { constructor() { this.logLevels = { debug: 0, info: 1, warn: 2, error: 3 }; this.currentLogLevel = this.logLevels[GameConfig.debug.logLevel]; } // 日志记录 log(level, message, ...args) { if (!GameConfig.debug.enableLogging) return; const levelNum = this.logLevels[level]; if (levelNum >= this.currentLogLevel) { const timestamp = new Date().toISOString(); const prefix = `[${timestamp}] [${level.toUpperCase()}]`; switch (level) { case 'debug': console.debug(prefix, message, ...args); break; case 'info': console.info(prefix, message, ...args); break; case 'warn': console.warn(prefix, message, ...args); break; case 'error': console.error(prefix, message, ...args); break; } } } debug(message, ...args) { this.log('debug', message, ...args); } info(message, ...args) { this.log('info', message, ...args); } warn(message, ...args) { this.log('warn', message, ...args); } error(message, ...args) { this.log('error', message, ...args); } // 性能监控 measurePerformance(name, fn) { const start = performance.now(); const result = fn(); const end = performance.now(); const duration = end - start; this.debug(`Performance [${name}]: ${duration.toFixed(2)}ms`); return { result, duration }; } // 防抖函数 debounce(func, wait) { let timeout; return function executedFunction(...args) { const later = () => { clearTimeout(timeout); func(...args); }; clearTimeout(timeout); timeout = setTimeout(later, wait); }; } // 节流函数 throttle(func, limit) { let inThrottle; return function() { const args = arguments; const context = this; if (!inThrottle) { func.apply(context, args); inThrottle = true; setTimeout(() => inThrottle = false, limit); } }; } // 坐标验证 validateCoordinates(x, y, maxX = 400, maxY = 400) { // 坐标系以左下角为原点,x轴从左到右,y轴从下到上 return x >= 0 && x <= maxX && y >= 0 && y <= maxY; } // 随机颜色生成 generateRandomColor() { const colors = [ '#ff6b6b', '#4ecdc4', '#45b7d1', '#96ceb4', '#feca57', '#ff9ff3', '#54a0ff', '#5f27cd' ]; return colors[Math.floor(Math.random() * colors.length)]; } // 格式化时间 formatTime(ms) { if (ms < 1000) return `${ms}ms`; if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`; return `${(ms / 60000).toFixed(1)}m`; } // 格式化字节大小 formatBytes(bytes) { if (bytes === 0) return '0 Bytes'; const k = 1024; const sizes = ['Bytes', 'KB', 'MB', 'GB']; const i = Math.floor(Math.log(bytes) / Math.log(k)); return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]; } // 深拷贝 deepClone(obj) { if (obj === null || typeof obj !== 'object') return obj; if (obj instanceof Date) return new Date(obj.getTime()); if (obj instanceof Array) return obj.map(item => this.deepClone(item)); if (typeof obj === 'object') { const clonedObj = {}; for (const key in obj) { if (obj.hasOwnProperty(key)) { clonedObj[key] = this.deepClone(obj[key]); } } return clonedObj; } } // 本地存储工具 storage = { set(key, value) { try { localStorage.setItem(key, JSON.stringify(value)); } catch (error) { console.error('Failed to save to localStorage:', error); } }, get(key, defaultValue = null) { try { const item = localStorage.getItem(key); return item ? JSON.parse(item) : defaultValue; } catch (error) { console.error('Failed to read from localStorage:', error); return defaultValue; } }, remove(key) { try { localStorage.removeItem(key); } catch (error) { console.error('Failed to remove from localStorage:', error); } } }; // 网络状态检测 checkNetworkStatus() { return navigator.onLine; } // 设备信息 getDeviceInfo() { return { userAgent: navigator.userAgent, platform: navigator.platform, language: navigator.language, cookieEnabled: navigator.cookieEnabled, onLine: navigator.onLine, screenWidth: screen.width, screenHeight: screen.height, windowWidth: window.innerWidth, windowHeight: window.innerHeight }; } // 错误处理 handleError(error, context = '') { this.error(`Error in ${context}:`, error); // 可以在这里添加错误上报逻辑 if (GameConfig.debug.showConnectionDetails) { console.group('Error Details'); console.error('Error:', error); console.error('Context:', context); console.error('Stack:', error.stack); console.error('Device Info:', this.getDeviceInfo()); console.groupEnd(); } } } // 创建全局工具实例 const utils = new Utils(); // 导出工具类 if (typeof module !== 'undefined' && module.exports) { module.exports = Utils; } else { window.Utils = Utils; window.utils = utils; }