202 lines
8.0 KiB
TypeScript
202 lines
8.0 KiB
TypeScript
import { _decorator, Component, Node, Label, Button, Canvas, UITransform, Widget, Layout, Sprite, Color } from 'cc';
|
|
import { BehaviorTreeExample } from './BehaviorTreeExample';
|
|
|
|
const { ccclass, property } = _decorator;
|
|
|
|
/**
|
|
* 行为树测试场景
|
|
* 自动创建UI界面用于测试行为树
|
|
*/
|
|
@ccclass('BehaviorTreeTestScene')
|
|
export class BehaviorTreeTestScene extends Component {
|
|
|
|
onLoad() {
|
|
this.createTestUI();
|
|
}
|
|
|
|
private createTestUI() {
|
|
// 创建Canvas
|
|
const canvasNode = new Node('BehaviorTreeTestCanvas');
|
|
canvasNode.addComponent(Canvas);
|
|
canvasNode.addComponent(UITransform);
|
|
canvasNode.parent = this.node;
|
|
|
|
// 创建背景
|
|
const backgroundNode = new Node('Background');
|
|
const backgroundTransform = backgroundNode.addComponent(UITransform);
|
|
backgroundTransform.setContentSize(1920, 1080);
|
|
const backgroundSprite = backgroundNode.addComponent(Sprite);
|
|
backgroundSprite.color = new Color(40, 40, 40, 255);
|
|
backgroundNode.parent = canvasNode;
|
|
|
|
// 设置Widget组件使背景充满整个画布
|
|
const backgroundWidget = backgroundNode.addComponent(Widget);
|
|
backgroundWidget.isAlignTop = true;
|
|
backgroundWidget.isAlignBottom = true;
|
|
backgroundWidget.isAlignLeft = true;
|
|
backgroundWidget.isAlignRight = true;
|
|
|
|
// 创建主容器
|
|
const mainContainer = new Node('MainContainer');
|
|
const mainTransform = mainContainer.addComponent(UITransform);
|
|
mainTransform.setContentSize(1600, 900);
|
|
mainContainer.parent = canvasNode;
|
|
|
|
// 设置主容器居中
|
|
const mainWidget = mainContainer.addComponent(Widget);
|
|
mainWidget.isAlignHorizontalCenter = true;
|
|
mainWidget.isAlignVerticalCenter = true;
|
|
|
|
// 设置主容器的Layout
|
|
const mainLayout = mainContainer.addComponent(Layout);
|
|
mainLayout.type = Layout.Type.VERTICAL;
|
|
mainLayout.spacingY = 20;
|
|
mainLayout.paddingTop = 50;
|
|
mainLayout.paddingBottom = 50;
|
|
mainLayout.paddingLeft = 50;
|
|
mainLayout.paddingRight = 50;
|
|
|
|
// 创建标题
|
|
const titleNode = this.createText('简化API行为树测试器', 48, Color.WHITE);
|
|
titleNode.parent = mainContainer;
|
|
|
|
// 创建状态显示区域
|
|
const statusContainer = new Node('StatusContainer');
|
|
const statusTransform = statusContainer.addComponent(UITransform);
|
|
statusTransform.setContentSize(1500, 80);
|
|
statusContainer.parent = mainContainer;
|
|
|
|
const statusLayout = statusContainer.addComponent(Layout);
|
|
statusLayout.type = Layout.Type.HORIZONTAL;
|
|
statusLayout.spacingX = 20;
|
|
|
|
// 状态标签
|
|
const statusLabelNode = this.createText('状态: 初始化中...', 24, Color.YELLOW);
|
|
statusLabelNode.parent = statusContainer;
|
|
|
|
// 创建控制按钮区域
|
|
const buttonContainer = new Node('ButtonContainer');
|
|
const buttonTransform = buttonContainer.addComponent(UITransform);
|
|
buttonTransform.setContentSize(1500, 80);
|
|
buttonContainer.parent = mainContainer;
|
|
|
|
const buttonLayout = buttonContainer.addComponent(Layout);
|
|
buttonLayout.type = Layout.Type.HORIZONTAL;
|
|
buttonLayout.spacingX = 20;
|
|
|
|
// 创建控制按钮
|
|
const startButton = this.createButton('开始执行', Color.GREEN);
|
|
const stopButton = this.createButton('停止', Color.RED);
|
|
const pauseButton = this.createButton('暂停', Color.YELLOW);
|
|
const resumeButton = this.createButton('恢复', Color.BLUE);
|
|
|
|
startButton.parent = buttonContainer;
|
|
stopButton.parent = buttonContainer;
|
|
pauseButton.parent = buttonContainer;
|
|
resumeButton.parent = buttonContainer;
|
|
|
|
// 创建说明区域
|
|
const infoContainer = new Node('InfoContainer');
|
|
const infoTransform = infoContainer.addComponent(UITransform);
|
|
infoTransform.setContentSize(1500, 60);
|
|
infoContainer.parent = mainContainer;
|
|
|
|
const infoNode = this.createText('使用新的简化API - 一行代码完成所有初始化!', 18, Color.CYAN);
|
|
infoNode.parent = infoContainer;
|
|
|
|
// 创建日志显示区域
|
|
const logContainer = new Node('LogContainer');
|
|
const logTransform = logContainer.addComponent(UITransform);
|
|
logTransform.setContentSize(1500, 600);
|
|
logContainer.parent = mainContainer;
|
|
|
|
// 日志背景
|
|
const logBackground = new Node('LogBackground');
|
|
const logBgTransform = logBackground.addComponent(UITransform);
|
|
logBgTransform.setContentSize(1500, 600);
|
|
const logBgSprite = logBackground.addComponent(Sprite);
|
|
logBgSprite.color = new Color(20, 20, 20, 255);
|
|
logBackground.parent = logContainer;
|
|
|
|
// 日志文本
|
|
const logLabelNode = this.createText('等待行为树配置加载...', 16, Color.CYAN);
|
|
const logLabel = logLabelNode.getComponent(Label);
|
|
logLabel.overflow = Label.Overflow.RESIZE_HEIGHT;
|
|
logLabel.verticalAlign = Label.VerticalAlign.TOP;
|
|
logLabel.horizontalAlign = Label.HorizontalAlign.LEFT;
|
|
const logTransformComp = logLabelNode.getComponent(UITransform);
|
|
logTransformComp.setContentSize(1450, 550);
|
|
logLabelNode.parent = logContainer;
|
|
|
|
// 设置日志文本位置
|
|
const logWidget = logLabelNode.addComponent(Widget);
|
|
logWidget.isAlignTop = true;
|
|
logWidget.isAlignLeft = true;
|
|
logWidget.top = 25;
|
|
logWidget.left = 25;
|
|
|
|
// 添加BehaviorTreeExample组件
|
|
const behaviorTreeExample = this.node.addComponent(BehaviorTreeExample);
|
|
behaviorTreeExample.statusLabel = statusLabelNode.getComponent(Label);
|
|
behaviorTreeExample.logLabel = logLabel;
|
|
behaviorTreeExample.startButton = startButton.getComponent(Button);
|
|
behaviorTreeExample.stopButton = stopButton.getComponent(Button);
|
|
behaviorTreeExample.pauseButton = pauseButton.getComponent(Button);
|
|
behaviorTreeExample.resumeButton = resumeButton.getComponent(Button);
|
|
|
|
// 初始化按钮状态
|
|
stopButton.getComponent(Button).interactable = false;
|
|
pauseButton.getComponent(Button).interactable = false;
|
|
resumeButton.getComponent(Button).interactable = false;
|
|
startButton.getComponent(Button).interactable = false; // 等待行为树配置加载完成
|
|
|
|
console.log('行为树测试UI创建完成');
|
|
}
|
|
|
|
private createText(text: string, fontSize: number, color: Color): Node {
|
|
const textNode = new Node('Text');
|
|
const textTransform = textNode.addComponent(UITransform);
|
|
|
|
const label = textNode.addComponent(Label);
|
|
label.string = text;
|
|
label.fontSize = fontSize;
|
|
label.color = color;
|
|
label.lineHeight = fontSize + 4;
|
|
|
|
// 根据文本内容调整大小
|
|
const estimatedWidth = Math.max(200, text.length * fontSize * 0.6);
|
|
textTransform.setContentSize(estimatedWidth, fontSize + 10);
|
|
|
|
return textNode;
|
|
}
|
|
|
|
private createButton(text: string, color: Color): Node {
|
|
const buttonNode = new Node('Button');
|
|
const buttonTransform = buttonNode.addComponent(UITransform);
|
|
buttonTransform.setContentSize(180, 60);
|
|
|
|
// 按钮背景
|
|
const buttonSprite = buttonNode.addComponent(Sprite);
|
|
buttonSprite.color = color;
|
|
|
|
// 按钮组件
|
|
const button = buttonNode.addComponent(Button);
|
|
button.target = buttonNode;
|
|
|
|
// 按钮文本
|
|
const labelNode = new Node('Label');
|
|
const labelTransform = labelNode.addComponent(UITransform);
|
|
labelTransform.setContentSize(170, 50);
|
|
|
|
const label = labelNode.addComponent(Label);
|
|
label.string = text;
|
|
label.fontSize = 20;
|
|
label.color = Color.WHITE;
|
|
label.horizontalAlign = Label.HorizontalAlign.CENTER;
|
|
label.verticalAlign = Label.VerticalAlign.CENTER;
|
|
|
|
labelNode.parent = buttonNode;
|
|
|
|
return buttonNode;
|
|
}
|
|
}
|