This repository has been archived on 2026-01-07. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
Game/Client/web/utils.js

214 lines
6.1 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 工具类
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;
}