Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / GameApplication.cs
@小李xl 小李xl on 23 Jan 2024 8 KB 调整TileMap层级初始化代码
  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. public SubViewport SubViewport;
  18.  
  19. /// <summary>
  20. /// SubViewportContainer 组件
  21. /// </summary>
  22. public SubViewportContainer SubViewportContainer;
  23.  
  24. /// <summary>
  25. /// 场景根节点
  26. /// </summary>
  27. public Node2D SceneRoot;
  28. /// <summary>
  29. /// 全局根节点
  30. /// </summary>
  31. 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. PreinstallMarkManager.Init();
  87. //初始化房间配置数据
  88. InitRoomConfig();
  89. //初始化TileSet配置数据
  90. InitTileSetConfig();
  91. //初始化武器数据
  92. Weapon.InitWeaponAttribute();
  93. //初始化敌人数据
  94. Enemy.InitEnemyAttribute();
  95. DungeonConfig = new DungeonConfig();
  96. DungeonConfig.GroupName = "Test1";
  97. DungeonConfig.RoomCount = 20;
  98. }
  99.  
  100. public override void _EnterTree()
  101. {
  102. SubViewport = GetNode<SubViewport>("ViewCanvas/SubViewportContainer/SubViewport");
  103. SubViewportContainer = GetNode<SubViewportContainer>("ViewCanvas/SubViewportContainer");
  104. SceneRoot = GetNode<Node2D>("ViewCanvas/SubViewportContainer/SubViewport/SceneRoot");
  105. GlobalNodeRoot = GetNode<Node2D>("GlobalNodeRoot");
  106. //背景颜色
  107. RenderingServer.SetDefaultClearColor(new Color(0, 0, 0, 1));
  108. //随机化种子
  109. //GD.Randomize();
  110. //固定帧率
  111. Engine.MaxFps = TargetFps;
  112. //调试绘制开关
  113. ActivityObject.IsDebug = false;
  114. //Engine.TimeScale = 0.2f;
  115. //调整窗口分辨率
  116. OnWindowSizeChanged();
  117. //窗体大小改变
  118. GetWindow().SizeChanged += OnWindowSizeChanged;
  119.  
  120. ImageCanvas.Init(GetTree().CurrentScene);
  121. //初始化ui
  122. UiManager.Init();
  123. //调试Ui
  124. UiManager.Open_Debugger();
  125. // 初始化鼠标
  126. InitCursor();
  127. //地牢管理器
  128. DungeonManager = new DungeonManager();
  129. DungeonManager.Name = "DungeonManager";
  130. SceneRoot.AddChild(DungeonManager);
  131.  
  132. MapProjectManager.Init();
  133. EditorTileSetManager.Init();
  134. BottomTipsPanel.Init();
  135. //打开主菜单Ui
  136. UiManager.Open_Main();
  137. //UiManager.Open_MapEditorProject();
  138. }
  139.  
  140. public override void _Process(double delta)
  141. {
  142. var newDelta = (float)delta;
  143. InputManager.Update(newDelta);
  144. SoundManager.Update(newDelta);
  145. //协程更新
  146. ProxyCoroutineHandler.ProxyUpdateCoroutine(ref _coroutineList, newDelta);
  147. }
  148.  
  149. /// <summary>
  150. /// 创建新的 World 对象, 相当于清理房间
  151. /// </summary>
  152. public World CreateNewWorld(SeedRandom random)
  153. {
  154. if (World != null)
  155. {
  156. ClearWorld();
  157. World.QueueFree();
  158. }
  159. World = ResourceManager.LoadAndInstantiate<World>(ResourcePath.scene_World_tscn);
  160. SceneRoot.AddChild(World);
  161. World.InitLayer();
  162. World.InitRandomPool(random);
  163. return World;
  164. }
  165.  
  166. /// <summary>
  167. /// 销毁 World 对象, 相当于清理房间
  168. /// </summary>
  169. public void DestroyWorld()
  170. {
  171. //销毁所有物体
  172. if (World != null)
  173. {
  174. ClearWorld();
  175. World.QueueFree();
  176. }
  177. //销毁池中所有物体
  178. ObjectPool.DisposeAllItem();
  179.  
  180. World = null;
  181. }
  182. /// <summary>
  183. /// 将 viewport 以外的全局坐标 转换成 viewport 内的全局坐标
  184. /// </summary>
  185. public Vector2 GlobalToViewPosition(Vector2 globalPos)
  186. {
  187. return globalPos / PixelScale - (ViewportSize / 2) + GameCamera.Main.GlobalPosition - GameCamera.Main.PixelOffset;
  188. }
  189.  
  190. /// <summary>
  191. /// 将 viewport 以内的全局坐标 转换成 viewport 外的全局坐标
  192. /// </summary>
  193. public Vector2 ViewToGlobalPosition(Vector2 viewPos)
  194. {
  195. return (viewPos + GameCamera.Main.PixelOffset - (GameCamera.Main.GlobalPosition + GameCamera.Main.Offset) + (ViewportSize / 2)) * PixelScale;
  196. }
  197. public long StartCoroutine(IEnumerator able)
  198. {
  199. return ProxyCoroutineHandler.ProxyStartCoroutine(ref _coroutineList, able);
  200. }
  201. public void StopCoroutine(long coroutineId)
  202. {
  203. ProxyCoroutineHandler.ProxyStopCoroutine(ref _coroutineList, coroutineId);
  204. }
  205.  
  206. public bool IsCoroutineOver(long coroutineId)
  207. {
  208. return ProxyCoroutineHandler.ProxyIsCoroutineOver(ref _coroutineList, coroutineId);
  209. }
  210.  
  211. public void StopAllCoroutine()
  212. {
  213. ProxyCoroutineHandler.ProxyStopAllCoroutine(ref _coroutineList);
  214. }
  215.  
  216. public void SetRoomConfig(Dictionary<string,DungeonRoomGroup> roomConfig)
  217. {
  218. RoomConfig = roomConfig;
  219. InitReadyRoom();
  220. }
  221.  
  222. //初始化房间配置
  223. private void InitRoomConfig()
  224. {
  225. //加载房间配置信息
  226. var asText = ResourceManager.LoadText("res://" + GameConfig.RoomTileDir + GameConfig.RoomGroupConfigFile);
  227. RoomConfig = JsonSerializer.Deserialize<Dictionary<string, DungeonRoomGroup>>(asText);
  228.  
  229. InitReadyRoom();
  230. }
  231. //初始化房间数据
  232. private void InitReadyRoom()
  233. {
  234. foreach (var dungeonRoomGroup in RoomConfig)
  235. {
  236. RemoveUnreadyRooms(dungeonRoomGroup.Value.BattleList);
  237. RemoveUnreadyRooms(dungeonRoomGroup.Value.InletList);
  238. RemoveUnreadyRooms(dungeonRoomGroup.Value.OutletList);
  239. RemoveUnreadyRooms(dungeonRoomGroup.Value.BossList);
  240. RemoveUnreadyRooms(dungeonRoomGroup.Value.ShopList);
  241. RemoveUnreadyRooms(dungeonRoomGroup.Value.RewardList);
  242. RemoveUnreadyRooms(dungeonRoomGroup.Value.EventList);
  243. }
  244. }
  245. //移除未准备好的房间
  246. private void RemoveUnreadyRooms(List<DungeonRoomSplit> roomInfos)
  247. {
  248. for (var i = 0; i < roomInfos.Count; i++)
  249. {
  250. if (roomInfos[i].ErrorType != RoomErrorType.None) //存在错误
  251. {
  252. roomInfos.RemoveAt(i);
  253. i--;
  254. }
  255. }
  256. }
  257.  
  258. //初始化TileSet配置
  259. private void InitTileSetConfig()
  260. {
  261. //加载房间配置信息
  262. var asText = ResourceManager.LoadText("res://" + GameConfig.RoomTileSetDir + GameConfig.TileSetConfigFile);
  263. TileSetConfig = JsonSerializer.Deserialize<Dictionary<string, TileSetSplit>>(asText);
  264. //加载所有数据
  265. foreach (var tileSetSplit in TileSetConfig)
  266. {
  267. tileSetSplit.Value.ReloadTileSetInfo();
  268. }
  269. }
  270.  
  271. //窗体大小改变
  272. private void OnWindowSizeChanged()
  273. {
  274. var size = GetWindow().Size;
  275. ViewportSize = size / PixelScale;
  276. RefreshSubViewportSize();
  277. }
  278. //刷新视窗大小
  279. private void RefreshSubViewportSize()
  280. {
  281. var s = new Vector2I((int)ViewportSize.X, (int)ViewportSize.Y);
  282. s.X = s.X / 2 * 2 + 2;
  283. s.Y = s.Y / 2 * 2 + 2;
  284. SubViewport.Size = s;
  285. SubViewportContainer.Scale = new Vector2(PixelScale, PixelScale);
  286. SubViewportContainer.Size = s;
  287. SubViewportContainer.Position = new Vector2(-PixelScale, -PixelScale);
  288. }
  289.  
  290. //初始化鼠标
  291. private void InitCursor()
  292. {
  293. Cursor = ResourceManager.LoadAndInstantiate<Cursor>(ResourcePath.prefab_Cursor_tscn);
  294. var cursorLayer = new CanvasLayer();
  295. cursorLayer.Name = "CursorLayer";
  296. cursorLayer.Layer = UiManager.GetUiLayer(UiLayer.Pop).Layer + 10;
  297. AddChild(cursorLayer);
  298. cursorLayer.AddChild(Cursor);
  299. }
  300.  
  301. //清理世界
  302. private void ClearWorld()
  303. {
  304. var childCount = World.NormalLayer.GetChildCount();
  305. for (var i = 0; i < childCount; i++)
  306. {
  307. var c = World.NormalLayer.GetChild(i);
  308. if (c is IDestroy destroy)
  309. {
  310. destroy.Destroy();
  311. }
  312. }
  313. childCount = World.YSortLayer.GetChildCount();
  314. for (var i = 0; i < childCount; i++)
  315. {
  316. var c = World.YSortLayer.GetChild(i);
  317. if (c is IDestroy destroy)
  318. {
  319. destroy.Destroy();
  320. }
  321. }
  322. }
  323. }