EnemyProjectile.ts 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import { _decorator, Component, Node, Vec3, RigidBody2D, Collider2D, Contact2DType, IPhysics2DContact, Sprite, find, Prefab, instantiate } from 'cc';
  2. import { BundleLoader } from '../../Core/BundleLoader';
  3. import { Audio } from '../../AudioManager/AudioManager';
  4. import EventBus, { GameEvents } from '../../Core/EventBus';
  5. import { EnemyProjectileInstance } from './EnemyProjectileInstance';
  6. const { ccclass, property } = _decorator;
  7. /**
  8. * 敌人抛掷物管理器
  9. * 负责管理敌人发射的抛掷物的创建和配置
  10. * 挂载到Canvas/GameLevelUI/EnemyController上使用
  11. */
  12. @ccclass('EnemyProjectile')
  13. export class EnemyProjectile extends Component {
  14. @property(Prefab)
  15. public projectilePrefab: Prefab = null;
  16. onLoad() {
  17. console.log('[EnemyProjectile] 敌人抛掷物管理器已加载');
  18. }
  19. /**
  20. * 创建抛掷物
  21. * @param config 抛掷物配置
  22. */
  23. public createProjectile(config: {
  24. damage: number;
  25. speed: number;
  26. direction: Vec3;
  27. projectileType: string;
  28. startPosition: Vec3;
  29. }): Node | null {
  30. console.log('[EnemyProjectile] 开始创建抛掷物,配置:', config);
  31. if (!this.projectilePrefab) {
  32. console.error('[EnemyProjectile] 抛掷物预制体未设置');
  33. return null;
  34. }
  35. console.log('[EnemyProjectile] 预制体已设置,开始实例化');
  36. // 实例化预制体
  37. const projectileNode = instantiate(this.projectilePrefab);
  38. if (!projectileNode) {
  39. console.error('[EnemyProjectile] 创建抛掷物节点失败');
  40. return null;
  41. }
  42. console.log('[EnemyProjectile] 抛掷物节点创建成功,节点名称:', projectileNode.name);
  43. // 获取抛掷物组件
  44. const projectileComponent = projectileNode.getComponent(EnemyProjectileInstance);
  45. if (!projectileComponent) {
  46. console.error('[EnemyProjectile] 预制体中未找到EnemyProjectileInstance组件');
  47. projectileNode.destroy();
  48. return null;
  49. }
  50. console.log('[EnemyProjectile] 准备添加到Canvas并设置位置');
  51. // 添加到Canvas
  52. const canvas = find('Canvas');
  53. if (canvas) {
  54. // 先添加到Canvas,然后设置世界坐标
  55. canvas.addChild(projectileNode);
  56. // 确保在Canvas坐标系下正确设置位置
  57. projectileNode.setWorldPosition(config.startPosition);
  58. console.log('[EnemyProjectile] 已添加到Canvas并设置位置,开始初始化');
  59. // 初始化抛掷物(此时位置已正确,避免弧线弹道朝错方向)
  60. projectileComponent.init(config);
  61. console.log(`[EnemyProjectile] 创建抛掷物成功: 类型=${config.projectileType}, 伤害=${config.damage}, 速度=${config.speed}`);
  62. console.log('[EnemyProjectile] 抛掷物世界坐标:', projectileNode.worldPosition);
  63. console.log('[EnemyProjectile] 抛掷物本地坐标:', projectileNode.position);
  64. } else {
  65. console.error('[EnemyProjectile] 未找到Canvas节点');
  66. projectileNode.destroy();
  67. return null;
  68. }
  69. return projectileNode;
  70. }
  71. }