123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209 |
- import { _decorator, Component, Node, Button, Label } from 'cc';
- import { DialogueManager } from './DialogueManager';
- const { ccclass, property } = _decorator;
- /**
- * 问答对接口
- */
- interface QuestionAnswer {
- question: string; // 问题文本
- answer: string; // 回答文本
- }
- @ccclass('QuestionAnswerManager')
- export class QuestionAnswerManager extends Component {
- @property({
- type: DialogueManager,
- tooltip: '对话管理器引用'
- })
- dialogueManager: DialogueManager = null;
- @property({
- type: [Button],
- tooltip: '问题按钮数组',
- readonly: true
- })
- questionButtons: Button[] = [];
- @property({
- type: [Node],
- tooltip: '问题文本节点数组(Label组件所在的节点)',
- readonly: true
- })
- questionLabels: Node[] = [];
- // 问答对数组
- private questionAnswerPairs: QuestionAnswer[] = [];
-
- // 当前显示的问题索引
- private currentQuestionIndices: number[] = [0, 1, 2];
- start() {
- // 初始化默认问答对
- this.initDefaultQuestionAnswers();
-
- // 注册按钮事件
- this.registerButtons();
-
- // 更新问题按钮文本
- this.updateQuestionButtonTexts();
- }
- /**
- * 初始化默认问答对
- */
- private initDefaultQuestionAnswers(): void {
- // 添加一些默认的问答对
- this.questionAnswerPairs = [
- {
- question: "询问为何不在名单内?",
- answer: "我没见过你的资料。你确定你应该在这个区域吗?"
- },
- {
- question: "询问通行证?",
- answer: "你需要有效的通行证才能进入这个区域。没有通行证是不允许的。"
- },
- {
- question: "询问外貌?",
- answer: "我对你的外貌没有任何评价。我只负责确认身份。"
- },
- {
- question: "你是谁?",
- answer: "我是这个区域的安全管理员,负责身份验证和访问控制。"
- },
- {
- question: "这是什么地方?",
- answer: "这是一个受限制的区域,需要特殊许可才能进入。"
- },
- {
- question: "我可以离开吗?",
- answer: "如果你没有通行证,建议你尽快离开,否则可能会有麻烦。"
- }
- ];
- }
- /**
- * 注册所有问题按钮
- */
- private registerButtons(): void {
- // 注册每个按钮的点击事件
- for (let i = 0; i < this.questionButtons.length; i++) {
- const buttonIndex = i;
- if (this.questionButtons[i]) {
- this.questionButtons[i].node.on(Button.EventType.CLICK, () => {
- this.onQuestionButtonClicked(buttonIndex);
- }, this);
- }
- }
- }
- /**
- * 更新问题按钮文本
- */
- private updateQuestionButtonTexts(): void {
- // 为每个按钮设置对应的问题文本
- for (let i = 0; i < Math.min(this.questionLabels.length, this.currentQuestionIndices.length); i++) {
- const questionIndex = this.currentQuestionIndices[i];
- const labelNode = this.questionLabels[i];
-
- if (labelNode && questionIndex >= 0 && questionIndex < this.questionAnswerPairs.length) {
- // 获取Label组件并设置文本
- const label = labelNode.getComponent(Label);
- if (label) {
- label.string = this.questionAnswerPairs[questionIndex].question;
- }
- }
- }
- }
- /**
- * 问题按钮点击回调
- * @param buttonIndex 按钮索引
- */
- private onQuestionButtonClicked(buttonIndex: number): void {
- if (buttonIndex < 0 || buttonIndex >= this.currentQuestionIndices.length) {
- return;
- }
- const questionIndex = this.currentQuestionIndices[buttonIndex];
- if (questionIndex < 0 || questionIndex >= this.questionAnswerPairs.length) {
- return;
- }
- // 获取问答对
- const qa = this.questionAnswerPairs[questionIndex];
-
- // 使用对话管理器显示回答
- if (this.dialogueManager && qa) {
- this.dialogueManager.showDialogue(qa.answer);
- }
- }
- /**
- * 添加新的问答对
- * @param questionAnswers 要添加的问答对数组
- */
- public addQuestionAnswers(questionAnswers: QuestionAnswer[]): void {
- if (!questionAnswers || questionAnswers.length === 0) {
- return;
- }
- // 添加新的问答对
- this.questionAnswerPairs = [...this.questionAnswerPairs, ...questionAnswers];
-
- // 更新按钮文本(如果需要)
- this.updateQuestionButtonTexts();
- }
- /**
- * 设置问题按钮显示的问题索引
- * @param indices 问题索引数组,长度应与按钮数量相同
- */
- public setQuestionIndices(indices: number[]): void {
- // 验证索引有效性
- const validIndices = indices.filter(index =>
- index >= 0 && index < this.questionAnswerPairs.length
- );
- // 更新当前显示的问题索引
- this.currentQuestionIndices = validIndices.slice(0, this.questionButtons.length);
-
- // 如果索引数量少于按钮数量,使用默认索引填充
- while (this.currentQuestionIndices.length < this.questionButtons.length) {
- const defaultIndex = this.currentQuestionIndices.length % this.questionAnswerPairs.length;
- this.currentQuestionIndices.push(defaultIndex);
- }
-
- // 更新按钮文本
- this.updateQuestionButtonTexts();
- }
- /**
- * 获取当前所有问答对
- * @returns 所有问答对数组
- */
- public getAllQuestionAnswers(): QuestionAnswer[] {
- return [...this.questionAnswerPairs];
- }
- /**
- * 清除所有问答对并重置为默认值
- */
- public resetToDefault(): void {
- this.initDefaultQuestionAnswers();
- this.currentQuestionIndices = [0, 1, 2];
- this.updateQuestionButtonTexts();
- }
- /**
- * 更新特定索引的问答对
- * @param index 要更新的问答对索引
- * @param newQA 新的问答对
- */
- public updateQuestionAnswer(index: number, newQA: QuestionAnswer): void {
- if (index >= 0 && index < this.questionAnswerPairs.length && newQA) {
- this.questionAnswerPairs[index] = newQA;
- this.updateQuestionButtonTexts();
- }
- }
- }
|