PersonalInfoManager.ts 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. import { _decorator, Component, Node, Button, Sprite, Label, SpriteFrame, resources } from 'cc';
  2. import { DataManager } from './DataManager';
  3. const { ccclass, property } = _decorator;
  4. @ccclass('PersonalInfoManager')
  5. export class PersonalInfoManager extends Component {
  6. @property({
  7. type: Node,
  8. tooltip: '个人资料UI面板'
  9. })
  10. personalInfoPanel: Node = null;
  11. @property({
  12. type: Button,
  13. tooltip: '关闭按钮'
  14. })
  15. closeButton: Button = null;
  16. @property({
  17. type: Sprite,
  18. tooltip: '角色头像显示'
  19. })
  20. characterAvatar: Sprite = null;
  21. @property({
  22. type: Label,
  23. tooltip: '角色信息文本'
  24. })
  25. infoText: Label = null;
  26. @property({
  27. type: Label,
  28. tooltip: '角色姓名、房间号、ID等信息标签'
  29. })
  30. nameInfoLabel: Label = null;
  31. @property({
  32. type: DataManager,
  33. tooltip: '数据管理器引用'
  34. })
  35. dataManager: DataManager = null;
  36. // 当前显示的角色ID
  37. private currentCharacterId: number = -1;
  38. start() {
  39. // 初始化隐藏面板
  40. if (this.personalInfoPanel) {
  41. this.personalInfoPanel.active = false;
  42. }
  43. // 注册关闭按钮事件
  44. this.setupCloseButton();
  45. }
  46. private setupCloseButton() {
  47. if (this.closeButton) {
  48. this.closeButton.node.off('click');
  49. this.closeButton.node.on('click', () => {
  50. this.hidePersonalInfoPanel();
  51. }, this);
  52. }
  53. }
  54. /**
  55. * 显示个人资料面板
  56. */
  57. public showPersonalInfoPanel() {
  58. if (this.personalInfoPanel) {
  59. this.personalInfoPanel.active = true;
  60. this.personalInfoPanel.setSiblingIndex(999);
  61. }
  62. }
  63. /**
  64. * 隐藏个人资料面板
  65. */
  66. public hidePersonalInfoPanel() {
  67. if (this.personalInfoPanel) {
  68. this.personalInfoPanel.active = false;
  69. }
  70. }
  71. /**
  72. * 显示角色资料
  73. * @param data 角色资料数据
  74. */
  75. public displayCharacterInfo(data: any) {
  76. if (!data) {
  77. console.error('角色资料数据为空');
  78. return;
  79. }
  80. console.log(`PersonalInfoManager.displayCharacterInfo: ID=${data.characterId}, 头像路径=${data.avatarPath}`);
  81. // 保存当前显示的角色ID
  82. this.currentCharacterId = data.characterId;
  83. // 设置文本信息
  84. if (this.infoText && data.info) {
  85. this.infoText.string = data.info;
  86. }
  87. // 加载并设置头像
  88. if (this.characterAvatar && data.avatarPath) {
  89. const characterId = data.characterId;
  90. // 列出所有可能尝试的路径格式
  91. const pathsToTry = [
  92. `${data.avatarPath}/spriteFrame`,
  93. data.avatarPath,
  94. `avatars/${characterId}/avatar_${characterId}_5/spriteFrame`,
  95. `avatars/${characterId}/avatar_${characterId}_5`,
  96. `avatars/${characterId}/spriteFrame`,
  97. `avatars/${characterId}`
  98. ];
  99. // 递归尝试加载所有可能的路径
  100. this.tryLoadSpriteFrameWithPaths(this.characterAvatar, pathsToTry, 0);
  101. }
  102. // 获取更详细的NPC信息并显示
  103. this.updateDetailedNPCInfo(data.characterId);
  104. // 显示面板
  105. this.showPersonalInfoPanel();
  106. }
  107. /**
  108. * 递归尝试加载所有可能的路径
  109. * @param sprite 要设置的精灵组件
  110. * @param paths 尝试的路径数组
  111. * @param index 当前尝试的路径索引
  112. */
  113. private tryLoadSpriteFrameWithPaths(sprite: Sprite, paths: string[], index: number): void {
  114. if (index >= paths.length) {
  115. console.error('所有可能的路径都尝试失败,使用默认图像');
  116. // 所有路径都失败,创建一个默认的灰色方形作为备用
  117. this.createDefaultSpriteFrame(sprite);
  118. return;
  119. }
  120. const currentPath = paths[index];
  121. console.log(`PersonalInfoManager - 尝试加载路径(${index+1}/${paths.length}): ${currentPath}`);
  122. resources.load(currentPath, SpriteFrame, (err, spriteFrame) => {
  123. if (err) {
  124. console.warn(`路径加载失败: ${currentPath}`, err);
  125. // 尝试下一个路径
  126. this.tryLoadSpriteFrameWithPaths(sprite, paths, index + 1);
  127. return;
  128. }
  129. // 成功加载,设置spriteFrame
  130. sprite.spriteFrame = spriteFrame;
  131. console.log(`成功加载头像: ${currentPath}`);
  132. });
  133. }
  134. /**
  135. * 创建一个默认的SpriteFrame用于显示
  136. * @param sprite 要设置的精灵组件
  137. */
  138. private createDefaultSpriteFrame(sprite: Sprite): void {
  139. console.log('创建默认图像');
  140. // 使用内置资源或默认资源
  141. const defaultIcon = "default_sprite";
  142. resources.load(defaultIcon, SpriteFrame, (err, spriteFrame) => {
  143. if (err) {
  144. console.warn(`无法加载默认图像 ${defaultIcon}`, err);
  145. return;
  146. }
  147. sprite.spriteFrame = spriteFrame;
  148. console.log('已设置默认图像');
  149. });
  150. }
  151. /**
  152. * 更新详细的NPC信息
  153. * @param characterId 角色ID
  154. */
  155. private updateDetailedNPCInfo(characterId: number) {
  156. if (!this.nameInfoLabel) return;
  157. if (!this.dataManager) {
  158. console.error('未设置DataManager引用');
  159. return;
  160. }
  161. // 获取NPC数据
  162. const npcData = this.dataManager.getNPCById(characterId);
  163. if (!npcData) {
  164. console.error(`无法找到ID为${characterId}的NPC数据`);
  165. return;
  166. }
  167. // 获取通行证信息
  168. const passInfo = npcData.pass;
  169. // 获取个人信息
  170. const personalInfo = npcData.personal;
  171. // 构建详细信息文本
  172. let detailedInfo = '';
  173. // 添加姓名
  174. detailedInfo += `姓名: ${npcData.characterName}\n`;
  175. // 添加房间号
  176. if (passInfo && passInfo.room) {
  177. detailedInfo += `房间号: ${passInfo.room}\n`;
  178. }
  179. // 添加ID
  180. if (passInfo && passInfo.identityId) {
  181. detailedInfo += `ID: ${passInfo.identityId}\n`;
  182. } else if (personalInfo && personalInfo.id) {
  183. detailedInfo += `ID: ${personalInfo.id}\n`;
  184. }
  185. // 添加同住人信息
  186. if (personalInfo && personalInfo.hasRoommate && personalInfo.roommate) {
  187. detailedInfo += `同住人: ${personalInfo.roommate.id || '未知'}\n`;
  188. } else if (personalInfo && personalInfo.hasRoommate) {
  189. detailedInfo += `同住人: 有(未详)\n`;
  190. } else if (personalInfo) {
  191. detailedInfo += `同住人: 无\n`;
  192. }
  193. // 设置详细信息文本
  194. this.nameInfoLabel.string = detailedInfo;
  195. }
  196. onDestroy() {
  197. if (this.closeButton) {
  198. this.closeButton.node.off('click');
  199. }
  200. }
  201. }