322 lines
12 KiB
TypeScript
322 lines
12 KiB
TypeScript
import { Scene } from '@esengine/ecs-framework';
|
||
import { Color, Node } from 'cc';
|
||
import { MovementSystem, HealthSystem, RandomMovementSystem, AISystem, NetworkSystem, NodeRenderSystem } from '../systems';
|
||
import { Transform, Health, Velocity, Renderer, NodeComponent, AIComponent, NetworkComponent } from '../components';
|
||
|
||
/**
|
||
* 游戏场景
|
||
*
|
||
* 这是您的主游戏场景。在这里可以:
|
||
* - 添加游戏系统
|
||
* - 创建初始实体
|
||
* - 设置场景参数
|
||
*/
|
||
export class GameScene extends Scene {
|
||
|
||
/**
|
||
* 场景初始化
|
||
* 在场景创建时调用,用于设置基础配置
|
||
*/
|
||
public initialize(): void {
|
||
super.initialize();
|
||
|
||
// 设置场景名称
|
||
this.name = "MainGameScene";
|
||
|
||
console.log('🎯 游戏场景已创建');
|
||
|
||
// 添加游戏系统
|
||
this.addEntityProcessor(new MovementSystem());
|
||
this.addEntityProcessor(new HealthSystem());
|
||
this.addEntityProcessor(new RandomMovementSystem());
|
||
// this.addEntityProcessor(new AISystem());
|
||
// this.addEntityProcessor(new NetworkSystem());
|
||
// this.addEntityProcessor(new NodeRenderSystem());
|
||
|
||
// 创建大量复杂的测试实体
|
||
this.createComplexTestEntities();
|
||
}
|
||
|
||
/**
|
||
* 创建复杂的测试实体(1000+个)
|
||
*/
|
||
private createComplexTestEntities(): void {
|
||
console.log('🚀 开始创建大量复杂测试实体...');
|
||
|
||
// 存储创建的AI和网络组件用于建立循环引用
|
||
const aiComponents: AIComponent[] = [];
|
||
const networkComponents: NetworkComponent[] = [];
|
||
const nodeComponents: NodeComponent[] = [];
|
||
|
||
// 1. 创建玩家实体(具有所有组件类型)
|
||
console.log('创建玩家实体...');
|
||
const player = this.createComplexEntity("Player", "player", new Color(0, 255, 0, 255), 0, 0, true, true, true);
|
||
if (player) {
|
||
const playerAI = player.getComponent(AIComponent);
|
||
const playerNetwork = player.getComponent(NetworkComponent);
|
||
const playerNode = player.getComponent(NodeComponent);
|
||
|
||
if (playerAI) aiComponents.push(playerAI);
|
||
if (playerNetwork) networkComponents.push(playerNetwork);
|
||
if (playerNode) nodeComponents.push(playerNode);
|
||
}
|
||
|
||
// 2. 创建AI智能体(500个)
|
||
console.log('创建AI智能体...');
|
||
for (let i = 0; i < 500; i++) {
|
||
const entityName = `AI_Agent_${i}`;
|
||
const x = (Math.random() - 0.5) * 2000;
|
||
const y = (Math.random() - 0.5) * 2000;
|
||
const color = new Color(
|
||
Math.floor(Math.random() * 255),
|
||
Math.floor(Math.random() * 255),
|
||
Math.floor(Math.random() * 255),
|
||
255
|
||
);
|
||
|
||
const entity = this.createComplexEntity(entityName, "ai_agent", color, x, y, true, true, Math.random() > 0.5);
|
||
|
||
if (entity) {
|
||
const ai = entity.getComponent(AIComponent);
|
||
const network = entity.getComponent(NetworkComponent);
|
||
const node = entity.getComponent(NodeComponent);
|
||
|
||
if (ai) {
|
||
aiComponents.push(ai);
|
||
// 设置随机AI个性
|
||
ai.config.personality.aggression = Math.random();
|
||
ai.config.personality.curiosity = Math.random();
|
||
ai.config.personality.loyalty = Math.random();
|
||
ai.config.personality.intelligence = Math.random();
|
||
}
|
||
|
||
if (network) {
|
||
networkComponents.push(network);
|
||
// 随机设置网络状态
|
||
if (Math.random() > 0.2) {
|
||
network.connectionState = 'connected';
|
||
}
|
||
}
|
||
|
||
if (node) {
|
||
nodeComponents.push(node);
|
||
// 设置随机节点属性
|
||
node.nodeConfig.layer = Math.floor(Math.random() * 10);
|
||
node.nodeConfig.tag = `layer_${node.nodeConfig.layer}`;
|
||
}
|
||
}
|
||
}
|
||
|
||
// 3. 创建网络节点(300个)
|
||
console.log('创建网络节点...');
|
||
for (let i = 0; i < 300; i++) {
|
||
const entityName = `Network_Node_${i}`;
|
||
const x = (Math.random() - 0.5) * 1500;
|
||
const y = (Math.random() - 0.5) * 1500;
|
||
const color = new Color(0, 150, 255, 200);
|
||
|
||
const entity = this.createComplexEntity(entityName, "network_node", color, x, y, false, true, true);
|
||
|
||
if (entity) {
|
||
const network = entity.getComponent(NetworkComponent);
|
||
const node = entity.getComponent(NodeComponent);
|
||
|
||
if (network) {
|
||
networkComponents.push(network);
|
||
network.connectionState = 'connected';
|
||
network.config.syncFrequency = 30 + Math.random() * 30; // 30-60Hz
|
||
}
|
||
|
||
if (node) {
|
||
nodeComponents.push(node);
|
||
// 创建复杂的层次结构
|
||
node.nodeConfig.layer = Math.floor(i / 10); // 每10个一层
|
||
}
|
||
}
|
||
}
|
||
|
||
// 4. 创建简单移动实体(200个)
|
||
console.log('创建简单移动实体...');
|
||
for (let i = 0; i < 200; i++) {
|
||
const entityName = `Simple_Mover_${i}`;
|
||
const x = (Math.random() - 0.5) * 1000;
|
||
const y = (Math.random() - 0.5) * 1000;
|
||
const color = new Color(255, 255, 255, 150);
|
||
|
||
this.createComplexEntity(entityName, "simple_mover", color, x, y, false, false, false);
|
||
}
|
||
|
||
// 5. 建立循环引用和复杂关系
|
||
console.log('建立实体间的复杂关系...');
|
||
this.establishComplexRelationships(aiComponents, networkComponents, nodeComponents);
|
||
|
||
const totalEntities = this.entities.count;
|
||
console.log(`✅ 创建完成!总共创建了 ${totalEntities} 个实体`);
|
||
console.log(` - AI组件: ${aiComponents.length} 个`);
|
||
console.log(` - 网络组件: ${networkComponents.length} 个`);
|
||
console.log(` - 节点组件: ${nodeComponents.length} 个`);
|
||
}
|
||
|
||
/**
|
||
* 创建复杂实体的辅助方法
|
||
*/
|
||
private createComplexEntity(
|
||
name: string,
|
||
type: string,
|
||
color: Color,
|
||
x: number,
|
||
y: number,
|
||
hasAI: boolean,
|
||
hasNetwork: boolean,
|
||
hasNode: boolean
|
||
): any {
|
||
const entity = this.createEntity(name);
|
||
|
||
// 基础组件
|
||
const transform = new Transform();
|
||
transform.setPosition(x, y);
|
||
transform.speed = 50 + Math.random() * 100;
|
||
entity.addComponent(transform);
|
||
|
||
const health = new Health(50 + Math.random() * 100);
|
||
health.regenRate = Math.random() * 10;
|
||
entity.addComponent(health);
|
||
|
||
const velocity = new Velocity();
|
||
velocity.maxSpeed = 80 + Math.random() * 120;
|
||
velocity.friction = 0.95 + Math.random() * 0.04;
|
||
entity.addComponent(velocity);
|
||
|
||
const renderer = new Renderer(type, color.clone());
|
||
renderer.alpha = 0.5 + Math.random() * 0.5;
|
||
renderer.layer = Math.floor(Math.random() * 5);
|
||
entity.addComponent(renderer);
|
||
|
||
// 复杂组件
|
||
if (hasAI) {
|
||
const ai = new AIComponent();
|
||
entity.addComponent(ai);
|
||
}
|
||
|
||
if (hasNetwork) {
|
||
const network = new NetworkComponent(`${type}_${name}`);
|
||
entity.addComponent(network);
|
||
}
|
||
|
||
if (hasNode) {
|
||
const node = new NodeComponent(name);
|
||
entity.addComponent(node);
|
||
}
|
||
|
||
return entity;
|
||
}
|
||
|
||
/**
|
||
* 建立实体间的复杂关系
|
||
*/
|
||
private establishComplexRelationships(
|
||
aiComponents: AIComponent[],
|
||
networkComponents: NetworkComponent[],
|
||
nodeComponents: NodeComponent[]
|
||
): void {
|
||
// 建立AI之间的盟友/敌人关系(避免循环引用)
|
||
for (let i = 0; i < Math.min(aiComponents.length, 100); i++) {
|
||
const ai = aiComponents[i];
|
||
|
||
// 随机添加盟友(使用实体ID)
|
||
const allyCount = Math.floor(Math.random() * 5);
|
||
for (let j = 0; j < allyCount; j++) {
|
||
const randomIndex = Math.floor(Math.random() * aiComponents.length);
|
||
const ally = aiComponents[randomIndex];
|
||
if (ally !== ai && !ai.allyIds.includes(ally.entity.id)) {
|
||
ai.addAlly(ally.entity.id);
|
||
}
|
||
}
|
||
|
||
// 随机设置目标(使用实体ID)
|
||
if (Math.random() > 0.7) {
|
||
const randomIndex = Math.floor(Math.random() * aiComponents.length);
|
||
const target = aiComponents[randomIndex];
|
||
if (target !== ai) {
|
||
ai.setTarget(target.entity.id);
|
||
}
|
||
}
|
||
}
|
||
|
||
// 建立网络连接(避免循环引用)
|
||
for (let i = 0; i < Math.min(networkComponents.length, 50); i++) {
|
||
const network = networkComponents[i];
|
||
|
||
// 连接到其他网络组件(使用网络ID)
|
||
const connectionCount = Math.floor(Math.random() * 8);
|
||
for (let j = 0; j < connectionCount; j++) {
|
||
const randomIndex = Math.floor(Math.random() * networkComponents.length);
|
||
const other = networkComponents[randomIndex];
|
||
if (other !== network) {
|
||
network.connectToPlayer(other.networkId);
|
||
}
|
||
}
|
||
|
||
// 创建群组(使用网络ID)
|
||
if (Math.random() > 0.8) {
|
||
const groupSize = Math.floor(Math.random() * 10) + 2;
|
||
const groupMemberIds: string[] = [network.networkId];
|
||
|
||
for (let k = 0; k < groupSize - 1; k++) {
|
||
const randomIndex = Math.floor(Math.random() * networkComponents.length);
|
||
const member = networkComponents[randomIndex];
|
||
if (!groupMemberIds.includes(member.networkId)) {
|
||
groupMemberIds.push(member.networkId);
|
||
}
|
||
}
|
||
|
||
network.joinGroup(groupMemberIds, network.networkId);
|
||
}
|
||
}
|
||
|
||
// 建立节点层次结构(避免循环引用)
|
||
for (let i = 0; i < Math.min(nodeComponents.length, 30); i++) {
|
||
const parent = nodeComponents[i];
|
||
|
||
// 添加一些子节点(使用实体ID)
|
||
const childCount = Math.floor(Math.random() * 5);
|
||
for (let j = 0; j < childCount; j++) {
|
||
const childIndex = Math.floor(Math.random() * nodeComponents.length);
|
||
const child = nodeComponents[childIndex];
|
||
|
||
if (child !== parent && !parent.nodeConfig.childIds.includes(child.entity.id)) {
|
||
parent.addChild(child.entity.id);
|
||
}
|
||
}
|
||
}
|
||
|
||
console.log('🔗 复杂关系建立完成!');
|
||
}
|
||
|
||
/**
|
||
* 场景开始运行
|
||
* 在场景开始时调用,用于执行启动逻辑
|
||
*/
|
||
public onStart(): void {
|
||
super.onStart();
|
||
|
||
console.log('🚀 游戏场景已启动');
|
||
|
||
// TODO: 在这里添加场景启动逻辑
|
||
// 例如:创建UI、播放音乐、初始化游戏状态等
|
||
}
|
||
|
||
/**
|
||
* 场景卸载
|
||
* 在场景结束时调用,用于清理资源
|
||
*/
|
||
public unload(): void {
|
||
console.log('🛑 游戏场景已结束');
|
||
|
||
// TODO: 在这里添加清理逻辑
|
||
// 例如:清理缓存、释放资源等
|
||
|
||
super.unload();
|
||
}
|
||
}
|