Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / room / World.cs
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using Godot;
  4. using NnormalState;
  5.  
  6. /// <summary>
  7. /// 游戏世界
  8. /// </summary>
  9. public partial class World : CanvasModulate, ICoroutine
  10. {
  11. /// <summary>
  12. /// 当前的游戏世界对象
  13. /// </summary>
  14. public static World Current => GameApplication.Instance.World;
  15. /// <summary>
  16. /// //对象根节点
  17. /// </summary>
  18. [Export] public Node2D NormalLayer;
  19. /// <summary>
  20. /// 对象根节点, 带y轴排序功能
  21. /// </summary>
  22. [Export] public Node2D YSortLayer;
  23. /// <summary>
  24. /// 地图根节点
  25. /// </summary>
  26. [Export] public TileMap TileRoot;
  27.  
  28. [Export] public Node2D StaticSpriteRoot;
  29. [Export] public Node2D AffiliationAreaRoot;
  30. [Export] public Node2D FogMaskRoot;
  31. /// <summary>
  32. /// 是否暂停
  33. /// </summary>
  34. public bool Pause
  35. {
  36. get => _pause;
  37. set
  38. {
  39. if (_pause != value)
  40. {
  41. _pause = value;
  42. if (value)
  43. {
  44. ProcessMode = ProcessModeEnum.WhenPaused;
  45. }
  46. else
  47. {
  48. ProcessMode = ProcessModeEnum.Inherit;
  49. }
  50. }
  51. }
  52. }
  53. /// <summary>
  54. /// 所有被扔在地上的武器
  55. /// </summary>
  56. public HashSet<Weapon> Weapon_UnclaimedWeapons { get; } = new HashSet<Weapon>();
  57. /// <summary>
  58. /// 记录所有存活的敌人
  59. /// </summary>
  60. public List<Role> Enemy_InstanceList { get; } = new List<Role>();
  61. private bool _pause = false;
  62. private List<CoroutineData> _coroutineList;
  63.  
  64. public override void _Ready()
  65. {
  66. Color = Colors.Black;
  67. //临时处理, 加载TileSet
  68. var tileSet = ResourceManager.Load<TileSet>(ResourcePath.resource_map_tileSet_map1_TileSet1_tres);
  69. var tileSetAtlasSource = (TileSetAtlasSource)tileSet.GetSource(0);
  70. tileSetAtlasSource.Texture = ImageTexture.CreateFromImage(Image.LoadFromFile("resource/map/tileSprite/map1/16x16 dungeon ii wall reconfig v04 spritesheet.png"));
  71. TileRoot.TileSet = tileSet;
  72. TileRoot.YSortEnabled = false;
  73. }
  74.  
  75. public override void _Process(double delta)
  76. {
  77. //协程更新
  78. ProxyCoroutineHandler.ProxyUpdateCoroutine(ref _coroutineList, (float)delta);
  79. }
  80.  
  81. /// <summary>
  82. /// 获取指定层级根节点
  83. /// </summary>
  84. public Node2D GetRoomLayer(RoomLayerEnum layerEnum)
  85. {
  86. switch (layerEnum)
  87. {
  88. case RoomLayerEnum.NormalLayer:
  89. return NormalLayer;
  90. case RoomLayerEnum.YSortLayer:
  91. return YSortLayer;
  92. }
  93.  
  94. return null;
  95. }
  96.  
  97. /// <summary>
  98. /// 通知其他敌人发现目标了
  99. /// </summary>
  100. /// <param name="self">发送通知的角色</param>
  101. /// <param name="target">目标</param>
  102. public void NotifyEnemyTarget(Role self, ActivityObject target)
  103. {
  104. foreach (var role in Enemy_InstanceList)
  105. {
  106. if (role != self && !role.IsDestroyed && role.AffiliationArea == self.AffiliationArea)
  107. {
  108. if (role is AdvancedEnemy advancedEnemy)
  109. {
  110. //将未发现目标的敌人状态置为惊讶状态
  111. var controller = advancedEnemy.StateController;
  112. if (controller.CurrState == AIAdvancedStateEnum.AiNormal)
  113. {
  114. controller.ChangeState(AIAdvancedStateEnum.AiAstonished, AIAdvancedStateEnum.AiLeaveFor, target);
  115. }
  116. }
  117. }
  118. }
  119. }
  120. public long StartCoroutine(IEnumerator able)
  121. {
  122. return ProxyCoroutineHandler.ProxyStartCoroutine(ref _coroutineList, able);
  123. }
  124. public void StopCoroutine(long coroutineId)
  125. {
  126. ProxyCoroutineHandler.ProxyStopCoroutine(ref _coroutineList, coroutineId);
  127. }
  128.  
  129. public bool IsCoroutineOver(long coroutineId)
  130. {
  131. return ProxyCoroutineHandler.ProxyIsCoroutineOver(ref _coroutineList, coroutineId);
  132. }
  133.  
  134. public void StopAllCoroutine()
  135. {
  136. ProxyCoroutineHandler.ProxyStopAllCoroutine(ref _coroutineList);
  137. }
  138. }