浏览代码

解决个人资料的显示问题

181404010226 1 周之前
父节点
当前提交
4c06f6aa1b
共有 4 个文件被更改,包括 124 次插入141 次删除
  1. 4 8
      assets/Scenes/MainScene.scene
  2. 39 27
      assets/scripts/GameFlowManager.ts
  3. 80 105
      assets/scripts/PersonalInfoManager.ts
  4. 1 1
      assets/scripts/RosterManager.ts

+ 4 - 8
assets/Scenes/MainScene.scene

@@ -97,6 +97,9 @@
       {
         "__id__": 141
       },
+      {
+        "__id__": 339
+      },
       {
         "__id__": 193
       },
@@ -106,9 +109,6 @@
       {
         "__id__": 84
       },
-      {
-        "__id__": 339
-      },
       {
         "__id__": 380
       },
@@ -3239,11 +3239,9 @@
     "closeButton": {
       "__id__": 91
     },
-    "rosterAnimation": null,
     "avatarContainer": {
       "__id__": 95
     },
-    "avatarResourcePath": "avatars/",
     "animDuration": 0.5,
     "useCustomAnimation": true,
     "avatarItemPrefab": {
@@ -7088,6 +7086,7 @@
     },
     "animDuration": 0.5,
     "cardShadow": null,
+    "dataManager": null,
     "_id": "79lbHz96dAnq/TLzTrjQto"
   },
   {
@@ -13453,9 +13452,6 @@
     "nameInfoLabel": {
       "__id__": 355
     },
-    "dataManager": {
-      "__id__": 358
-    },
     "animDuration": 0.5,
     "_id": "823nias1FJPaLFZnkVnyqF"
   },

+ 39 - 27
assets/scripts/GameFlowManager.ts

@@ -135,9 +135,6 @@ export class GameFlowManager extends Component {
         // 检查个人资料管理器是否被正确引用
         if (!this.personalInfoManager) {
             console.error('个人资料管理器未设置');
-        } else if (this.dataManager) {
-            // 设置DataManager引用
-            this.personalInfoManager.dataManager = this.dataManager;
         }
         
         // 检查测谎仪管理器是否被正确引用
@@ -162,20 +159,12 @@ export class GameFlowManager extends Component {
                 const npcData = this.dataManager.getNPCById(characterId);
                 if (!npcData) return;
                 
-                // 确保PersonalInfoManager有DataManager引用
-                if (this.personalInfoManager && this.dataManager) {
-                    this.personalInfoManager.dataManager = this.dataManager;
-                    
-                    console.log(`在SummaryManager中显示角色详情: ID=${characterId}, 名称=${npcData.characterName}`);
-                    
-                    this.personalInfoManager.displayCharacterInfo({
-                        characterId: npcData.characterId,
-                        info: npcData.personal?.info || "无个人资料",
-                        avatarPath: `avatars/${npcData.characterId}/avatar_${npcData.characterId}_5`
-                    });
-                    
-                    this.personalInfoManager.showPersonalInfoPanel();
-                }
+                console.log(`在SummaryManager中显示角色详情: ID=${characterId}, 名称=${npcData.characterName}`);
+                
+                // 构建完整的角色数据对象
+                const characterData = this.buildCharacterInfoData(npcData);
+                
+                this.personalInfoManager.displayCharacterInfo(characterData);
             };
         }
     }
@@ -552,7 +541,11 @@ export class GameFlowManager extends Component {
     public showRosterPanel(): void {
         if (this.rosterManager) {
             // 获取今日名单数据并传递给RosterManager
+            // 确保名单数据符合TodayListItem接口 (包含name和avatarPath属性)
             const todayList = this.dataManager.getTodayList();
+            console.log(`获取到今日名单数据,共${todayList.length}条记录`);
+            
+            // 设置名单数据并显示
             this.rosterManager.setTodayList(todayList);
             this.rosterManager.showRosterPanel();
         } else {
@@ -582,21 +575,40 @@ export class GameFlowManager extends Component {
         
         console.log(`显示当前NPC资料: ID=${npcData.characterId}, 名称=${npcData.characterName}`);
         
-        // 确保PersonalInfoManager已设置DataManager引用
-        if (this.personalInfoManager && this.dataManager) {
-            // 设置DataManager引用
-            this.personalInfoManager.dataManager = this.dataManager;
+        // 确保PersonalInfoManager已设置
+        if (this.personalInfoManager) {
+            // 构建完整的角色数据对象
+            const characterData = this.buildCharacterInfoData(npcData);
             
             // 显示个人资料
-            this.personalInfoManager.displayCharacterInfo({
-                characterId: npcData.characterId,
-                info: npcData.personal?.info || "无个人资料",
-                avatarPath: `avatars/${npcData.characterId}/avatar_${npcData.characterId}_5`
-            });
+            this.personalInfoManager.displayCharacterInfo(characterData);
         } else {
-            console.error('个人资料管理器或数据管理器未设置');
+            console.error('个人资料管理器未设置');
         }
     }
+    
+    /**
+     * 构建完整的角色信息数据对象
+     * @param npcData 原始NPC数据
+     * @returns 格式化后的角色信息对象
+     */
+    private buildCharacterInfoData(npcData: any): any {
+        const passInfo = npcData.pass || {};
+        const personalInfo = npcData.personal || {};
+        
+        // 构建角色数据对象
+        return {
+            characterId: npcData.characterId,
+            characterName: npcData.characterName,
+            info: personalInfo.info || "无个人资料",
+            avatarPath: personalInfo.avatarPath || `avatars/${npcData.characterId}/avatar_${npcData.characterId}_5`,
+            room: passInfo.room || "",
+            identityId: passInfo.identityId || personalInfo.id || "",
+            hasRoommate: personalInfo.hasRoommate || false,
+            roommateInfo: personalInfo.hasRoommate && personalInfo.roommate ? 
+                (personalInfo.roommate.id || '未知') : null
+        };
+    }
 
     /**
      * 显示测谎仪面板

+ 80 - 105
assets/scripts/PersonalInfoManager.ts

@@ -1,5 +1,4 @@
 import { _decorator, Component, Node, Label, Sprite, Button, resources, SpriteFrame, tween, Vec3, UIOpacity, UITransform, Color } from 'cc';
-import { DataManager } from './DataManager';
 const { ccclass, property } = _decorator;
 
 @ccclass('PersonalInfoManager')
@@ -34,12 +33,6 @@ export class PersonalInfoManager extends Component {
     })
     nameInfoLabel: Label = null;
     
-    @property({
-        type: DataManager,
-        tooltip: '数据管理器引用'
-    })
-    dataManager: DataManager = null;
-    
     @property({
         tooltip: '动画时间(秒)',
         range: [0.1, 2.0, 0.1]
@@ -178,7 +171,16 @@ export class PersonalInfoManager extends Component {
     
     /**
      * 显示角色资料
-     * @param data 角色资料数据
+     * @param data 包含角色资料的完整数据对象,由GameFlowManager提供
+     * 所需字段:
+     * - characterId: 角色ID
+     * - characterName: 角色名称
+     * - info: 个人资料文本
+     * - avatarPath: 头像路径
+     * - room: 房间号
+     * - identityId: 身份ID
+     * - hasRoommate: 是否有室友
+     * - roommateInfo: 室友信息(可选)
      */
     public displayCharacterInfo(data: any) {
         if (!data) {
@@ -186,7 +188,7 @@ export class PersonalInfoManager extends Component {
             return;
         }
         
-        console.log(`PersonalInfoManager.displayCharacterInfo: ID=${data.characterId}, 头像路径=${data.avatarPath}`);
+        console.log(`PersonalInfoManager.displayCharacterInfo: ID=${data.characterId}, 名称=${data.characterName}`);
         
         // 保存当前显示的角色ID
         this.currentCharacterId = data.characterId;
@@ -198,135 +200,108 @@ export class PersonalInfoManager extends Component {
         
         // 加载并设置头像
         if (this.characterAvatar && data.avatarPath) {
-            const characterId = data.characterId;
-            
-            // 列出所有可能尝试的路径格式
-            const pathsToTry = [
-                `${data.avatarPath}/spriteFrame`,
-                data.avatarPath,
-                `avatars/${characterId}/avatar_${characterId}_5/spriteFrame`,
-                `avatars/${characterId}/avatar_${characterId}_5`,
-                `avatars/${characterId}/spriteFrame`,
-                `avatars/${characterId}`
-            ];
-            
-            // 递归尝试加载所有可能的路径
-            this.tryLoadSpriteFrameWithPaths(this.characterAvatar, pathsToTry, 0);
+            this.loadAvatar(data.avatarPath);
         }
         
-        // 获取更详细的NPC信息显示
-        this.updateDetailedNPCInfo(data.characterId);
+        // 更新详细信息显示
+        this.updateDetailedInfo(data);
         
         // 显示面板
         this.showPersonalInfoPanel();
     }
     
     /**
-     * 递归尝试加载所有可能的路径
-     * @param sprite 要设置的精灵组件
-     * @param paths 尝试的路径数组
-     * @param index 当前尝试的路径索引
+     * 更新详细信息显示
+     * @param data 角色详细数据
+     */
+    private updateDetailedInfo(data: any) {
+        if (!this.nameInfoLabel) return;
+        
+        // 构建详细信息文本
+        let detailedInfo = '';
+        
+        // 添加姓名
+        if (data.characterName) {
+            detailedInfo += `姓名: ${data.characterName}\n`;
+        }
+        
+        // 添加房间号
+        if (data.room) {
+            detailedInfo += `房间号: ${data.room}\n`;
+        }
+        
+        // 添加ID
+        if (data.identityId) {
+            detailedInfo += `ID: ${data.identityId}\n`;
+        }
+        
+        // 添加同住人信息
+        if (data.hasRoommate && data.roommateInfo) {
+            detailedInfo += `同住人: ${data.roommateInfo}\n`;
+        } else if (data.hasRoommate) {
+            detailedInfo += `同住人: 有(未详)\n`;
+        } else {
+            detailedInfo += `同住人: 无\n`;
+        }
+        
+        // 设置详细信息文本
+        this.nameInfoLabel.string = detailedInfo;
+    }
+    
+    /**
+     * 加载头像
+     * @param avatarPath 头像路径,PersonalInfo中的avatarPath
      */
-    private tryLoadSpriteFrameWithPaths(sprite: Sprite, paths: string[], index: number): void {
-        if (index >= paths.length) {
-            console.error('所有可能的路径都尝试失败,使用默认图像');
-            // 所有路径都失败,创建一个默认的灰色方形作为备用
-            this.createDefaultSpriteFrame(sprite);
+    private loadAvatar(avatarPath: string): void {
+        if (!avatarPath) {
+            console.error('头像路径为空');
+            this.loadDefaultAvatar();
             return;
         }
         
-        const currentPath = paths[index];
-        console.log(`PersonalInfoManager - 尝试加载路径(${index+1}/${paths.length}): ${currentPath}`);
+        // 移除可能存在的.png后缀
+        const pathWithoutExtension = avatarPath.replace(/\.png$/, '');
+        
+        // 构建正确的路径,确保以/spriteFrame结尾
+        const finalPath = pathWithoutExtension.endsWith('/spriteFrame') 
+            ? pathWithoutExtension 
+            : `${pathWithoutExtension}/spriteFrame`;
+        
+        console.log(`加载头像: ${finalPath}`);
         
-        resources.load(currentPath, SpriteFrame, (err, spriteFrame) => {
+        // 加载头像
+        resources.load(finalPath, SpriteFrame, (err, spriteFrame) => {
             if (err) {
-                console.warn(`路径加载失败: ${currentPath}`, err);
-                // 尝试下一个路径
-                this.tryLoadSpriteFrameWithPaths(sprite, paths, index + 1);
+                console.error(`加载头像失败: ${finalPath}`, err);
+                this.loadDefaultAvatar();
                 return;
             }
             
-            // 成功加载,设置spriteFrame
-            sprite.spriteFrame = spriteFrame;
-            console.log(`成功加载头像: ${currentPath}`);
+            // 设置精灵帧
+            this.characterAvatar.spriteFrame = spriteFrame;
+            console.log(`成功加载头像: ${finalPath}`);
         });
     }
     
     /**
-     * 创建一个默认的SpriteFrame用于显示
-     * @param sprite 要设置的精灵组件
+     * 加载默认头像
      */
-    private createDefaultSpriteFrame(sprite: Sprite): void {
-        console.log('创建默认图像');
+    private loadDefaultAvatar(): void {
+        console.log('加载默认头像');
         
         // 使用内置资源或默认资源
         const defaultIcon = "default_sprite";
         resources.load(defaultIcon, SpriteFrame, (err, spriteFrame) => {
             if (err) {
-                console.warn(`无法加载默认像 ${defaultIcon}`, err);
+                console.warn(`无法加载默认像 ${defaultIcon}`, err);
                 return;
             }
             
-            sprite.spriteFrame = spriteFrame;
-            console.log('已设置默认像');
+            this.characterAvatar.spriteFrame = spriteFrame;
+            console.log('已设置默认像');
         });
     }
     
-    /**
-     * 更新详细的NPC信息
-     * @param characterId 角色ID
-     */
-    private updateDetailedNPCInfo(characterId: number) {
-        if (!this.nameInfoLabel) return;
-        if (!this.dataManager) {
-            console.error('未设置DataManager引用');
-            return;
-        }
-        
-        // 获取NPC数据
-        const npcData = this.dataManager.getNPCById(characterId);
-        if (!npcData) {
-            console.error(`无法找到ID为${characterId}的NPC数据`);
-            return;
-        }
-        
-        // 获取通行证信息
-        const passInfo = npcData.pass;
-        
-        // 获取个人信息
-        const personalInfo = npcData.personal;
-        
-        // 构建详细信息文本
-        let detailedInfo = '';
-        
-        // 添加姓名
-        detailedInfo += `姓名: ${npcData.characterName}\n`;
-        
-        // 添加房间号
-        if (passInfo && passInfo.room) {
-            detailedInfo += `房间号: ${passInfo.room}\n`;
-        }
-        
-        // 添加ID
-        if (passInfo && passInfo.identityId) {
-            detailedInfo += `ID: ${passInfo.identityId}\n`;
-        } else if (personalInfo && personalInfo.id) {
-            detailedInfo += `ID: ${personalInfo.id}\n`;
-        }
-        
-        // 添加同住人信息
-        if (personalInfo && personalInfo.hasRoommate && personalInfo.roommate) {
-            detailedInfo += `同住人: ${personalInfo.roommate.id || '未知'}\n`;
-        } else if (personalInfo && personalInfo.hasRoommate) {
-            detailedInfo += `同住人: 有(未详)\n`;
-        } else if (personalInfo) {
-            detailedInfo += `同住人: 无\n`;
-        }
-        
-        // 设置详细信息文本
-        this.nameInfoLabel.string = detailedInfo;
-    }
-    
     onDestroy() {
         if (this.closeButton) {
             this.closeButton.node.off('click');

+ 1 - 1
assets/scripts/RosterManager.ts

@@ -205,7 +205,7 @@ export class RosterManager extends Component {
     
     /**
      * 设置并显示今日名单
-     * @param todayListItems 由GameFlowManager提供的今日名单数据
+     * @param todayListItems 由GameFlowManager提供的今日名单数据,必须符合TodayListItem接口
      */
     public setTodayList(todayListItems: TodayListItem[]): void {
         console.log("设置今日名单数据");