聊天相关fix

This commit is contained in:
2025-09-20 20:37:31 +08:00
parent 86282eec31
commit b8a417632a
22 changed files with 2423 additions and 398 deletions
@@ -15,6 +15,7 @@ import { DataId, DataManager } from "../../data/DataManager";
import { NavigationManager } from "../../manager/NavigationManager";
import ResManager from "../../../Main/Manager/ResManager";
import { EnvData } from "../../data/EnvData";
import Utils from "../../../Main/Common/Utils";
const { ccclass, property } = _decorator;
@ccclass("DialogBubble")
@@ -54,6 +55,24 @@ export class DialogBubble extends Component {
this.content.overflow = Overflow.NONE;
//设置头像
if (isPlayer) {
//获取玩家头像,等接入luffa
} else {
const girlData = DataManager.I.getDataById<GirlData>(DataId.Girl);
const path = girlData.getGrilAvatar(
NavigationManager.Instance.getSelectedCategoryId().toString(),
NavigationManager.Instance.getSelectedGirlId()
);
// 加载远程资源
const envData = DataManager.I.getDataById<EnvData>(DataId.Env);
let newPath = envData.cdn + "/" + "Girls/" + path + ".png";
ResManager.I.changeRemoteSpriteFrame(this.avatar, newPath, () => {
this.scaleToFillItem(this.avatar, new Size(90, 90));
});
}
// 如果是加载状态,使用固定的"..."
if (isLoading) {
this.content.string = "...";
@@ -121,23 +140,46 @@ export class DialogBubble extends Component {
// 返回预估的背景高度(用于同步计算)
const estimatedHeight = Math.max(lines.length * 35 + 20, 60); // 最小高度60
//设置头像
if (isPlayer) {
//获取玩家头像,等接入luffa
} else {
const girlData = DataManager.I.getDataById<GirlData>(DataId.Girl);
const path = girlData.getGrilAvatar(
NavigationManager.Instance.getSelectedCategoryId().toString(),
NavigationManager.Instance.getSelectedGirlId()
);
return estimatedHeight;
}
// 加载远程资源
const envData = DataManager.I.getDataById<EnvData>(DataId.Env);
let newPath = envData.cdn + "/" + "Girls/" + path + ".png";
ResManager.I.changeRemoteSpriteFrame(this.avatar, newPath, () => {});
scaleToFillItem(img: Sprite, size: Size) {
if (!img || !img.spriteFrame) return;
// 延迟一帧确保UI布局完成
this.doScaleToFill(img, size);
}
doScaleToFill(img: Sprite, size: Size) {
if (!img || !img.spriteFrame) return;
const itemSize = size;
const imageSize = img.spriteFrame.originalSize;
if (
itemSize.width === 0 ||
itemSize.height === 0 ||
imageSize.width === 0 ||
imageSize.height === 0
) {
return;
}
return estimatedHeight;
const scaleX = itemSize.width / imageSize.width;
const scaleY = itemSize.height / imageSize.height;
const scale = Math.max(scaleX, scaleY);
// 设置Sprite的sizeMode为CUSTOM,允许自定义大小
img.sizeMode = Sprite.SizeMode.CUSTOM;
// 获取图片节点的UITransform并设置大小
const imgTransform = img.node.getComponent(UITransform);
if (imgTransform) {
imgTransform.setContentSize(
imageSize.width * scale,
imageSize.height * scale
);
}
}
private stopLoadingAnimation() {
+14 -4
View File
@@ -73,7 +73,7 @@ export class ChatPanel extends li_BaseView implements IChatPanelCallback {
categoryId: string;
id: number;
private _nodeTab: any = {};
private waitingAI: Node;
nameKey: string;
private currentEmotion: VideoEmotion | null = null;
@@ -87,6 +87,7 @@ export class ChatPanel extends li_BaseView implements IChatPanelCallback {
onLoadCT() {
Utils.parseNode(this.node, this._nodeTab);
this.waitingAI = this._nodeTab.waitingAI;
// 获取 videoArea 的尺寸和位置
this.targetSize = this.videoArea.contentSize;
this.videoAreaPos = new Vec3(540, 1170, 0);
@@ -150,7 +151,7 @@ export class ChatPanel extends li_BaseView implements IChatPanelCallback {
async refresh() {
const newRoleId = NavigationManager.Instance.getSelectedGirlId();
const girlData = DataManager.I.getDataById<GirlData>(DataId.Girl);
this.waitingAI.active = false;
// 检查是否是切换角色
const isRoleSwitch = this.id && this.id !== newRoleId;
@@ -399,18 +400,27 @@ export class ChatPanel extends li_BaseView implements IChatPanelCallback {
this.refresh();
}
isWaiting: boolean = false;
public async OnClickSend() {
const str = this.editBox.string;
if (!str || str == "") {
TipsPanel.show("请输入内容");
TipsPanel.show(LanguageUtils.getText("chat_error_code_1002"));
return;
}
if (this.isWaiting) {
TipsPanel.show(LanguageUtils.getText("chat_error_code_1003"));
}
// 通过ChatController发送消息
this.isWaiting = true;
this.waitingAI.active = true;
const succeed = await this.chatController.sendMessage(str);
if (succeed)
if (succeed) {
// 清空输入框
this.editBox.string = "";
}
this.isWaiting = false;
this.waitingAI.active = false;
}
// === IChatPanelCallback 接口实现 ===