Files
shooter-demo/PINBALL_BOOTSTRAP_GUIDE.md
2025-11-28 18:11:30 +08:00

355 lines
9.5 KiB
Markdown
Raw 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.

# Pinball Bootstrap 使用指南
## 概览
Pinball Bootstrap 系统提供了一个统一的、配置驱动的方式来启动不同模式的 Pinball 游戏。通过简单的配置对象,你可以启动 Standalone、Client Multiplayer 或 Server Multiplayer 模式。
## 核心组件
### 1. PinballBootstrap
主要的启动器类,使用单例模式,负责根据配置启动对应的游戏模式。
### 2. PinballBootUtils
提供常用的便捷启动方法和配置生成器。
### 3. 配置类型
- `PinballBootConfig`: 启动配置接口
- `PinballBootResult`: 启动结果接口
- `PinballBootMode`: 启动模式枚举
## 使用方法
### 基础用法
#### 方式一:使用 ClientRunner推荐
```typescript
// ClientRunner 已经集成了 Bootstrap 系统
// 只需要设置相应的属性即可
@ccclass('MyGameManager')
export class MyGameManager extends Component {
@property(ClientRunner)
clientRunner: ClientRunner = null;
start() {
// ClientRunner 会自动使用 Bootstrap 启动
// 无需额外代码
}
async switchToMultiplayer() {
// 动态切换到多人模式
await this.clientRunner.switchMode(RunMode.CLIENT_MULTIPLAYER);
}
}
```
#### 方式二:直接使用 Bootstrap
```typescript
import { PinballBootstrap, PinballBootMode, PinballBootUtils } from 'path/to/Boot';
@ccclass('MyBootManager')
export class MyBootManager extends Component {
async start() {
// 快速启动 Standalone 模式
const result = await PinballBootUtils.quickStartStandalone(
this,
this.cameraNode,
this.renderContainer
);
if (result.success) {
console.log('游戏启动成功!');
} else {
console.error('启动失败:', result.error);
}
}
}
```
### 高级配置
#### 自定义配置启动
```typescript
async customBoot() {
const config: PinballBootConfig = {
mode: PinballBootMode.STANDALONE,
cameraNode: this.mainCamera,
renderContainer: this.gameContainer,
debugMode: true,
autoStart: true,
// 自定义物理配置
physicsConfig: {
gravity: { x: 0, y: -15 }, // 更强的重力
timeStep: 1/120 // 更高精度
},
// 自定义渲染配置
renderConfig: {
enableEffects: true,
maxParticles: 800
},
// 自定义 WASM 路径
wasmPath: 'custom/path/physics.wasm'
};
const bootstrap = PinballBootstrap.getInstance();
const result = await bootstrap.boot(this, config);
return result;
}
```
#### 平台特定配置
```typescript
async bootForPlatform() {
let config: PinballBootConfig;
// 根据平台选择不同配置
if (this.isMobilePlatform()) {
config = PinballBootUtils.createMobileConfig(PinballBootMode.STANDALONE);
} else {
config = PinballBootUtils.createDesktopConfig(PinballBootMode.STANDALONE);
}
// 设置节点引用
config.cameraNode = this.cameraNode;
config.renderContainer = this.renderContainer;
const bootstrap = PinballBootstrap.getInstance();
return await bootstrap.boot(this, config);
}
private isMobilePlatform(): boolean {
// 检测平台逻辑
return cc.sys.isMobile;
}
```
### 多人模式配置
#### 客户端多人模式
```typescript
async bootClientMultiplayer() {
const config: PinballBootConfig = {
mode: PinballBootMode.CLIENT_MULTIPLAYER,
cameraNode: this.cameraNode,
renderContainer: this.renderContainer,
multiplayerConfig: {
serverAddress: 'wss://your-server.com:3000',
playerName: 'Player123',
roomId: 'room_abc'
}
};
const bootstrap = PinballBootstrap.getInstance();
return await bootstrap.boot(this, config);
}
```
#### 服务器多人模式
```typescript
async bootServerMultiplayer() {
const config: PinballBootConfig = {
mode: PinballBootMode.SERVER_MULTIPLAYER,
cameraNode: this.cameraNode,
renderContainer: this.renderContainer,
multiplayerConfig: {
serverAddress: 'localhost:3000',
playerName: 'Host',
roomId: 'main_room'
},
// 服务器模式可能需要更高性能配置
physicsConfig: {
gravity: { x: 0, y: -9.81 },
timeStep: 1/60
}
};
const bootstrap = PinballBootstrap.getInstance();
return await bootstrap.boot(this, config);
}
```
### 工具方法使用
#### 批量测试启动
```typescript
async testAllModes() {
const configs = [
PinballBootUtils.createDebugConfig(PinballBootMode.STANDALONE),
PinballBootUtils.createDebugConfig(PinballBootMode.CLIENT_MULTIPLAYER),
PinballBootUtils.createDebugConfig(PinballBootMode.SERVER_MULTIPLAYER)
];
// 为每个配置设置必需的节点引用
configs.forEach(config => {
config.cameraNode = this.cameraNode;
config.renderContainer = this.renderContainer;
});
const results = await PinballBootUtils.batchBoot(this, configs);
// 生成报告
const report = PinballBootUtils.generateBootReport(results);
console.log(report);
return results;
}
```
#### 性能基准测试
```typescript
async benchmarkPerformance() {
const config = PinballBootUtils.createMobileConfig(PinballBootMode.STANDALONE);
config.cameraNode = this.cameraNode;
config.renderContainer = this.renderContainer;
const benchmark = await PinballBootUtils.benchmarkBoot(this, config, 10);
console.log(`平均启动时间: ${benchmark.averageTime.toFixed(2)}ms`);
return benchmark;
}
```
#### 验证启动结果
```typescript
async bootWithValidation() {
const config = PinballBootstrap.createDefaultConfig(PinballBootMode.STANDALONE);
config.cameraNode = this.cameraNode;
config.renderContainer = this.renderContainer;
const bootstrap = PinballBootstrap.getInstance();
const result = await bootstrap.boot(this, config);
// 验证结果
const validation = PinballBootUtils.validateBootResult(result);
if (!validation.isValid) {
console.error('启动验证失败:', validation.issues.join(', '));
return null;
}
console.log('启动验证成功!');
return result;
}
```
## 错误处理
### 常见错误和解决方案
#### 1. 配置验证错误
```typescript
// 错误: 模式不支持
// 解决: 检查 PinballBootMode 枚举值
// 错误: 多人模式缺少服务器配置
// 解决: 添加 multiplayerConfig
config.multiplayerConfig = {
serverAddress: 'your-server-address',
playerName: 'player-name'
};
```
#### 2. 节点引用错误
```typescript
// 错误: 相机节点未设置
// 解决: 确保设置正确的相机节点
if (!config.cameraNode) {
console.warn('相机节点未设置,使用默认查找');
}
```
#### 3. 启动失败处理
```typescript
async bootWithFallback() {
try {
// 尝试启动首选模式
let result = await this.bootClientMultiplayer();
if (!result.success) {
console.warn('多人模式启动失败,回退到单机模式');
result = await PinballBootUtils.quickStartStandalone(this, this.cameraNode);
}
return result;
} catch (error) {
console.error('所有启动方式都失败:', error);
throw error;
}
}
```
## 最佳实践
### 1. 配置管理
```typescript
// 将配置存储在单独的配置文件中
export const PINBALL_CONFIGS = {
MOBILE_STANDALONE: PinballBootUtils.createMobileConfig(PinballBootMode.STANDALONE),
DESKTOP_STANDALONE: PinballBootUtils.createDesktopConfig(PinballBootMode.STANDALONE),
PRODUCTION: PinballBootUtils.createProductionConfig(PinballBootMode.STANDALONE),
DEBUG: PinballBootUtils.createDebugConfig(PinballBootMode.STANDALONE)
};
```
### 2. 启动生命周期管理
```typescript
class GameLifecycleManager {
private bootResult: PinballBootResult = null;
async initialize() {
this.bootResult = await this.boot();
}
async shutdown() {
if (this.bootResult?.pinballManager) {
await this.bootResult.pinballManager.stopCurrentGame();
}
}
async restart() {
await this.shutdown();
await this.initialize();
}
}
```
### 3. 错误监控
```typescript
async bootWithMonitoring() {
const config = this.createConfig();
try {
const result = await bootstrap.boot(this, config);
// 记录成功启动
this.analytics.trackEvent('pinball_boot_success', {
mode: result.mode,
timestamp: result.timestamp
});
return result;
} catch (error) {
// 记录启动失败
this.analytics.trackEvent('pinball_boot_failure', {
mode: config.mode,
error: error.message
});
throw error;
}
}
```
这个 Bootstrap 系统让 Pinball 游戏的启动变得更加灵活、可配置和可维护,同时保持了简单易用的接口。