Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / GameApplication.cs
@小李xl 小李xl on 9 Jan 2024 8 KB 修复加载房间Tile错误的bug
  1.  
  2. using System;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Text.Json;
  7. using Config;
  8. using Godot;
  9. using UI.BottomTips;
  10.  
  11. public partial class GameApplication : Node2D, ICoroutine
  12. {
  13. public static GameApplication Instance { get; private set; }
  14. /// <summary>
  15. /// 游戏渲染视口
  16. /// </summary>
  17. [Export] public SubViewport SubViewport;
  18.  
  19. /// <summary>
  20. /// SubViewportContainer 组件
  21. /// </summary>
  22. [Export] public SubViewportContainer SubViewportContainer;
  23.  
  24. /// <summary>
  25. /// 场景根节点
  26. /// </summary>
  27. [Export] public Node2D SceneRoot;
  28. /// <summary>
  29. /// 全局根节点
  30. /// </summary>
  31. [Export] public Node2D GlobalNodeRoot;
  32. /// <summary>
  33. /// 游戏目标帧率
  34. /// </summary>
  35. public int TargetFps { get; private set; }
  36. /// <summary>
  37. /// 鼠标指针
  38. /// </summary>
  39. public Cursor Cursor { get; private set; }
  40.  
  41. /// <summary>
  42. /// 游戏世界
  43. /// </summary>
  44. public World World { get; private set; }
  45.  
  46. /// <summary>
  47. /// 地牢管理器
  48. /// </summary>
  49. public DungeonManager DungeonManager { get; private set; }
  50. /// <summary>
  51. /// 房间配置
  52. /// </summary>
  53. public Dictionary<string, DungeonRoomGroup> RoomConfig { get; private set; }
  54. /// <summary>
  55. /// TileSet配置
  56. /// </summary>
  57. public Dictionary<string, TileSetSplit> TileSetConfig { get; private set; }
  58. // /// <summary>
  59. // /// 房间配置数据, key: 模板房间资源路径
  60. // /// </summary>
  61. // public Dictionary<string, DungeonRoomSplit> RoomConfigMap { get; private set; }
  62.  
  63. /// <summary>
  64. /// 游戏视图大小
  65. /// </summary>
  66. public Vector2 ViewportSize { get; private set; } = new Vector2(480, 270);
  67. /// <summary>
  68. /// 像素缩放
  69. /// </summary>
  70. public int PixelScale { get; private set; } = 4;
  71. /// <summary>
  72. /// 地牢配置信息
  73. /// </summary>
  74. public DungeonConfig DungeonConfig { get; private set; }
  75.  
  76. //开启的协程
  77. private List<CoroutineData> _coroutineList;
  78. public GameApplication()
  79. {
  80. Instance = this;
  81. TargetFps = (int)DisplayServer.ScreenGetRefreshRate();
  82. Utils.InitRandom();
  83.  
  84. //初始化配置表
  85. ExcelConfig.Init();
  86. //初始化房间配置数据
  87. InitRoomConfig();
  88. //初始化TileSet配置数据
  89. InitTileSetConfig();
  90. //初始化武器数据
  91. Weapon.InitWeaponAttribute();
  92. //初始化敌人数据
  93. Enemy.InitEnemyAttribute();
  94. DungeonConfig = new DungeonConfig();
  95. DungeonConfig.GroupName = "Test1";
  96. DungeonConfig.RoomCount = 20;
  97. }
  98. public override void _EnterTree()
  99. {
  100. //背景颜色
  101. RenderingServer.SetDefaultClearColor(new Color(0, 0, 0, 1));
  102. //随机化种子
  103. //GD.Randomize();
  104. //固定帧率
  105. Engine.MaxFps = TargetFps;
  106. //调试绘制开关
  107. ActivityObject.IsDebug = false;
  108. //Engine.TimeScale = 0.2f;
  109. //调整窗口分辨率
  110. OnWindowSizeChanged();
  111. //窗体大小改变
  112. GetWindow().SizeChanged += OnWindowSizeChanged;
  113.  
  114. ImageCanvas.Init(GetTree().CurrentScene);
  115. //初始化ui
  116. UiManager.Init();
  117. //调试Ui
  118. UiManager.Open_Debugger();
  119. // 初始化鼠标
  120. InitCursor();
  121. //地牢管理器
  122. DungeonManager = new DungeonManager();
  123. DungeonManager.Name = "DungeonManager";
  124. SceneRoot.AddChild(DungeonManager);
  125.  
  126. MapProjectManager.Init();
  127. EditorTileSetManager.Init();
  128. BottomTipsPanel.Init();
  129. //打开主菜单Ui
  130. UiManager.Open_Main();
  131. //UiManager.Open_MapEditorProject();
  132. }
  133.  
  134. public override void _Process(double delta)
  135. {
  136. var newDelta = (float)delta;
  137. InputManager.Update(newDelta);
  138. SoundManager.Update(newDelta);
  139. //协程更新
  140. ProxyCoroutineHandler.ProxyUpdateCoroutine(ref _coroutineList, newDelta);
  141. }
  142.  
  143. /// <summary>
  144. /// 创建新的 World 对象, 相当于清理房间
  145. /// </summary>
  146. public World CreateNewWorld()
  147. {
  148. if (World != null)
  149. {
  150. ClearWorld();
  151. World.QueueFree();
  152. }
  153. World = ResourceManager.LoadAndInstantiate<World>(ResourcePath.scene_World_tscn);
  154. SceneRoot.AddChild(World);
  155. return World;
  156. }
  157.  
  158. /// <summary>
  159. /// 销毁 World 对象, 相当于清理房间
  160. /// </summary>
  161. public void DestroyWorld()
  162. {
  163. //销毁所有物体
  164. if (World != null)
  165. {
  166. ClearWorld();
  167. World.QueueFree();
  168. }
  169. //销毁池中所有物体
  170. ObjectPool.DisposeAllItem();
  171.  
  172. World = null;
  173. }
  174. /// <summary>
  175. /// 将 viewport 以外的全局坐标 转换成 viewport 内的全局坐标
  176. /// </summary>
  177. public Vector2 GlobalToViewPosition(Vector2 globalPos)
  178. {
  179. return globalPos / PixelScale - (ViewportSize / 2) + GameCamera.Main.GlobalPosition - GameCamera.Main.PixelOffset;
  180. }
  181.  
  182. /// <summary>
  183. /// 将 viewport 以内的全局坐标 转换成 viewport 外的全局坐标
  184. /// </summary>
  185. public Vector2 ViewToGlobalPosition(Vector2 viewPos)
  186. {
  187. return (viewPos + GameCamera.Main.PixelOffset - (GameCamera.Main.GlobalPosition + GameCamera.Main.Offset) + (ViewportSize / 2)) * PixelScale;
  188. }
  189. public long StartCoroutine(IEnumerator able)
  190. {
  191. return ProxyCoroutineHandler.ProxyStartCoroutine(ref _coroutineList, able);
  192. }
  193. public void StopCoroutine(long coroutineId)
  194. {
  195. ProxyCoroutineHandler.ProxyStopCoroutine(ref _coroutineList, coroutineId);
  196. }
  197.  
  198. public bool IsCoroutineOver(long coroutineId)
  199. {
  200. return ProxyCoroutineHandler.ProxyIsCoroutineOver(ref _coroutineList, coroutineId);
  201. }
  202.  
  203. public void StopAllCoroutine()
  204. {
  205. ProxyCoroutineHandler.ProxyStopAllCoroutine(ref _coroutineList);
  206. }
  207.  
  208. public void SetRoomConfig(Dictionary<string,DungeonRoomGroup> roomConfig)
  209. {
  210. RoomConfig = roomConfig;
  211. InitReadyRoom();
  212. }
  213.  
  214. //初始化房间配置
  215. private void InitRoomConfig()
  216. {
  217. //加载房间配置信息
  218. var asText = ResourceManager.LoadText("res://" + GameConfig.RoomTileDir + GameConfig.RoomGroupConfigFile);
  219. RoomConfig = JsonSerializer.Deserialize<Dictionary<string, DungeonRoomGroup>>(asText);
  220.  
  221. InitReadyRoom();
  222. }
  223. //初始化房间数据
  224. private void InitReadyRoom()
  225. {
  226. foreach (var dungeonRoomGroup in RoomConfig)
  227. {
  228. RemoveUnreadyRooms(dungeonRoomGroup.Value.BattleList);
  229. RemoveUnreadyRooms(dungeonRoomGroup.Value.InletList);
  230. RemoveUnreadyRooms(dungeonRoomGroup.Value.OutletList);
  231. RemoveUnreadyRooms(dungeonRoomGroup.Value.BossList);
  232. RemoveUnreadyRooms(dungeonRoomGroup.Value.ShopList);
  233. RemoveUnreadyRooms(dungeonRoomGroup.Value.RewardList);
  234. RemoveUnreadyRooms(dungeonRoomGroup.Value.EventList);
  235. }
  236. }
  237. //移除未准备好的房间
  238. private void RemoveUnreadyRooms(List<DungeonRoomSplit> roomInfos)
  239. {
  240. for (var i = 0; i < roomInfos.Count; i++)
  241. {
  242. if (roomInfos[i].ErrorType != RoomErrorType.None) //存在错误
  243. {
  244. roomInfos.RemoveAt(i);
  245. i--;
  246. }
  247. }
  248. }
  249.  
  250. //初始化TileSet配置
  251. private void InitTileSetConfig()
  252. {
  253. //加载房间配置信息
  254. var asText = ResourceManager.LoadText("res://" + GameConfig.RoomTileSetDir + GameConfig.TileSetConfigFile);
  255. TileSetConfig = JsonSerializer.Deserialize<Dictionary<string, TileSetSplit>>(asText);
  256. //加载所有数据
  257. foreach (var tileSetSplit in TileSetConfig)
  258. {
  259. tileSetSplit.Value.ReloadTileSetInfo();
  260. }
  261. }
  262.  
  263. //窗体大小改变
  264. private void OnWindowSizeChanged()
  265. {
  266. var size = GetWindow().Size;
  267. ViewportSize = size / PixelScale;
  268. RefreshSubViewportSize();
  269. }
  270. //刷新视窗大小
  271. private void RefreshSubViewportSize()
  272. {
  273. var s = new Vector2I((int)ViewportSize.X, (int)ViewportSize.Y);
  274. s.X = s.X / 2 * 2 + 2;
  275. s.Y = s.Y / 2 * 2 + 2;
  276. SubViewport.Size = s;
  277. SubViewportContainer.Scale = new Vector2(PixelScale, PixelScale);
  278. SubViewportContainer.Size = s;
  279. SubViewportContainer.Position = new Vector2(-PixelScale, -PixelScale);
  280. }
  281.  
  282. //初始化鼠标
  283. private void InitCursor()
  284. {
  285. Cursor = ResourceManager.LoadAndInstantiate<Cursor>(ResourcePath.prefab_Cursor_tscn);
  286. var cursorLayer = new CanvasLayer();
  287. cursorLayer.Name = "CursorLayer";
  288. cursorLayer.Layer = UiManager.GetUiLayer(UiLayer.Pop).Layer + 10;
  289. AddChild(cursorLayer);
  290. cursorLayer.AddChild(Cursor);
  291. }
  292.  
  293. //清理世界
  294. private void ClearWorld()
  295. {
  296. var childCount = World.NormalLayer.GetChildCount();
  297. for (var i = 0; i < childCount; i++)
  298. {
  299. var c = World.NormalLayer.GetChild(i);
  300. if (c is IDestroy destroy)
  301. {
  302. destroy.Destroy();
  303. }
  304. }
  305. childCount = World.YSortLayer.GetChildCount();
  306. for (var i = 0; i < childCount; i++)
  307. {
  308. var c = World.YSortLayer.GetChild(i);
  309. if (c is IDestroy destroy)
  310. {
  311. destroy.Destroy();
  312. }
  313. }
  314. }
  315. }