Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / GameApplication.cs
  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 DungeonManager DungeonManager { get; private set; }
  45. /// <summary>
  46. /// 房间配置
  47. /// </summary>
  48. public Dictionary<string, DungeonRoomGroup> RoomConfig { get; private set; }
  49. /// <summary>
  50. /// TileSet配置
  51. /// </summary>
  52. public Dictionary<string, TileSetSplit> TileSetConfig { get; private set; }
  53. // /// <summary>
  54. // /// 房间配置数据, key: 模板房间资源路径
  55. // /// </summary>
  56. // public Dictionary<string, DungeonRoomSplit> RoomConfigMap { get; private set; }
  57.  
  58. /// <summary>
  59. /// 游戏视图大小
  60. /// </summary>
  61. public Vector2 ViewportSize { get; private set; } = new Vector2(480, 270);
  62. /// <summary>
  63. /// 像素缩放
  64. /// </summary>
  65. public int PixelScale { get; private set; } = 4;
  66. /// <summary>
  67. /// 地牢配置信息
  68. /// </summary>
  69. public DungeonConfig DungeonConfig { get; private set; }
  70.  
  71. //开启的协程
  72. private List<CoroutineData> _coroutineList;
  73. public GameApplication()
  74. {
  75. Instance = this;
  76. //TargetFps = 20;
  77. TargetFps = Mathf.RoundToInt(DisplayServer.ScreenGetRefreshRate());
  78. Utils.InitRandom();
  79.  
  80. //初始化配置表
  81. ExcelConfig.Init();
  82. PreinstallMarkManager.Init();
  83. PropFragmentRegister.Init();
  84. //初始化房间配置数据
  85. InitRoomConfig();
  86. //初始化TileSet配置数据
  87. InitTileSetConfig();
  88. //初始化武器数据
  89. Weapon.InitWeaponAttribute();
  90. //初始化敌人数据
  91. Enemy.InitEnemyAttribute();
  92. //初始化buff数据
  93. BuffProp.InitBuffAttribute();
  94. //初始化主动道具数据
  95. ActiveProp.InitActiveAttribute();
  96. DungeonConfig = new DungeonConfig();
  97. DungeonConfig.GroupName = "Test1";
  98. DungeonConfig.RandomSeed = null;
  99. DungeonConfig.BattleRoomCount = 15;
  100. // DungeonConfig.BossRoomCount = 0;
  101. // DungeonConfig.RewardRoomCount = 0;
  102. // DungeonConfig.ShopRoomCount = 0;
  103. // DungeonConfig.OutRoomCount = 0;
  104. // DungeonConfig.RoomHorizontalMinDispersion = -1;
  105. // DungeonConfig.RoomHorizontalMaxDispersion = 1;
  106. // DungeonConfig.RoomVerticalMinDispersion = -1;
  107. // DungeonConfig.RoomVerticalMaxDispersion = 1;
  108. // DungeonConfig.EnableLimitRange = false;
  109. }
  110.  
  111. public override void _EnterTree()
  112. {
  113. SubViewport = GetNode<SubViewport>("ViewCanvas/SubViewportContainer/SubViewport");
  114. SubViewportContainer = GetNode<SubViewportContainer>("ViewCanvas/SubViewportContainer");
  115. SceneRoot = GetNode<Node2D>("ViewCanvas/SubViewportContainer/SubViewport/SceneRoot");
  116. GlobalNodeRoot = GetNode<Node2D>("GlobalNodeRoot");
  117. //背景颜色
  118. RenderingServer.SetDefaultClearColor(new Color(0, 0, 0, 1));
  119. //随机化种子
  120. //GD.Randomize();
  121. //固定帧率
  122. //Engine.MaxFps = TargetFps;
  123. //调试绘制开关
  124. ActivityObject.IsDebug = true;
  125. //Engine.TimeScale = 0.2f;
  126. //调整窗口分辨率
  127. OnWindowSizeChanged();
  128. //窗体大小改变
  129. GetWindow().SizeChanged += OnWindowSizeChanged;
  130.  
  131. ImageCanvas.Init(GetTree().CurrentScene);
  132. //初始化ui
  133. UiManager.Init();
  134. //调试Ui
  135. UiManager.Open_Debugger();
  136. // 初始化鼠标
  137. InitCursor();
  138. //地牢管理器
  139. DungeonManager = new DungeonManager();
  140. DungeonManager.Name = "DungeonManager";
  141. SceneRoot.AddChild(DungeonManager);
  142.  
  143. MapProjectManager.Init();
  144. EditorTileSetManager.Init();
  145. BottomTipsPanel.Init();
  146. //打开主菜单Ui
  147. UiManager.Open_Main();
  148. //UiManager.Open_MapEditorProject();
  149. }
  150.  
  151. public override void _Process(double delta)
  152. {
  153. var newDelta = (float)delta;
  154. InputManager.Update(newDelta);
  155. SoundManager.Update(newDelta);
  156. //协程更新
  157. ProxyCoroutineHandler.ProxyUpdateCoroutine(ref _coroutineList, newDelta);
  158. }
  159. /// <summary>
  160. /// 将 viewport 以外的全局坐标 转换成 viewport 内的全局坐标
  161. /// </summary>
  162. public Vector2 GlobalToViewPosition(Vector2 globalPos)
  163. {
  164. return globalPos / PixelScale - (ViewportSize / 2) + GameCamera.Main.GlobalPosition - GameCamera.Main.PixelOffset;
  165. }
  166.  
  167. /// <summary>
  168. /// 将 viewport 以内的全局坐标 转换成 viewport 外的全局坐标
  169. /// </summary>
  170. public Vector2 ViewToGlobalPosition(Vector2 viewPos)
  171. {
  172. return (viewPos + GameCamera.Main.PixelOffset - (GameCamera.Main.GlobalPosition + GameCamera.Main.Offset) + (ViewportSize / 2)) * PixelScale;
  173. }
  174. public long StartCoroutine(IEnumerator able)
  175. {
  176. return ProxyCoroutineHandler.ProxyStartCoroutine(ref _coroutineList, able);
  177. }
  178. public void StopCoroutine(long coroutineId)
  179. {
  180. ProxyCoroutineHandler.ProxyStopCoroutine(ref _coroutineList, coroutineId);
  181. }
  182.  
  183. public bool IsCoroutineOver(long coroutineId)
  184. {
  185. return ProxyCoroutineHandler.ProxyIsCoroutineOver(ref _coroutineList, coroutineId);
  186. }
  187.  
  188. public void StopAllCoroutine()
  189. {
  190. ProxyCoroutineHandler.ProxyStopAllCoroutine(ref _coroutineList);
  191. }
  192.  
  193. public void SetRoomConfig(Dictionary<string,DungeonRoomGroup> roomConfig)
  194. {
  195. RoomConfig = roomConfig;
  196. InitReadyRoom();
  197. }
  198.  
  199. //初始化房间配置
  200. private void InitRoomConfig()
  201. {
  202. //加载房间配置信息
  203. var asText = ResourceManager.LoadText("res://" + GameConfig.RoomTileDir + GameConfig.RoomGroupConfigFile);
  204. RoomConfig = JsonSerializer.Deserialize<Dictionary<string, DungeonRoomGroup>>(asText);
  205.  
  206. InitReadyRoom();
  207. }
  208. //初始化房间数据
  209. private void InitReadyRoom()
  210. {
  211. foreach (var dungeonRoomGroup in RoomConfig)
  212. {
  213. RemoveUnreadyRooms(dungeonRoomGroup.Value.BattleList);
  214. RemoveUnreadyRooms(dungeonRoomGroup.Value.InletList);
  215. RemoveUnreadyRooms(dungeonRoomGroup.Value.OutletList);
  216. RemoveUnreadyRooms(dungeonRoomGroup.Value.BossList);
  217. RemoveUnreadyRooms(dungeonRoomGroup.Value.ShopList);
  218. RemoveUnreadyRooms(dungeonRoomGroup.Value.RewardList);
  219. RemoveUnreadyRooms(dungeonRoomGroup.Value.EventList);
  220. }
  221. }
  222. //移除未准备好的房间
  223. private void RemoveUnreadyRooms(List<DungeonRoomSplit> roomInfos)
  224. {
  225. for (var i = 0; i < roomInfos.Count; i++)
  226. {
  227. if (roomInfos[i].ErrorType != RoomErrorType.None) //存在错误
  228. {
  229. roomInfos.RemoveAt(i);
  230. i--;
  231. }
  232. }
  233. }
  234.  
  235. //初始化TileSet配置
  236. private void InitTileSetConfig()
  237. {
  238. //加载房间配置信息
  239. var asText = ResourceManager.LoadText("res://" + GameConfig.RoomTileSetDir + GameConfig.TileSetConfigFile);
  240. TileSetConfig = JsonSerializer.Deserialize<Dictionary<string, TileSetSplit>>(asText);
  241. //加载所有数据
  242. foreach (var tileSetSplit in TileSetConfig)
  243. {
  244. tileSetSplit.Value.ReloadTileSetInfo();
  245. }
  246. }
  247.  
  248. //窗体大小改变
  249. private void OnWindowSizeChanged()
  250. {
  251. var size = GetWindow().Size;
  252. ViewportSize = size / PixelScale;
  253. RefreshSubViewportSize();
  254. }
  255. //刷新视窗大小
  256. private void RefreshSubViewportSize()
  257. {
  258. var s = new Vector2I((int)ViewportSize.X, (int)ViewportSize.Y);
  259. s.X = s.X / 2 * 2 + 2;
  260. s.Y = s.Y / 2 * 2 + 2;
  261. SubViewport.Size = s;
  262. SubViewportContainer.Scale = new Vector2(PixelScale, PixelScale);
  263. SubViewportContainer.Size = s;
  264. SubViewportContainer.Position = new Vector2(-PixelScale, -PixelScale);
  265. }
  266.  
  267. //初始化鼠标
  268. private void InitCursor()
  269. {
  270. Cursor = ResourceManager.LoadAndInstantiate<Cursor>(ResourcePath.prefab_Cursor_tscn);
  271. var cursorLayer = new CanvasLayer();
  272. cursorLayer.Name = "CursorLayer";
  273. cursorLayer.Layer = UiManager.GetUiLayer(UiLayer.Pop).Layer + 10;
  274. AddChild(cursorLayer);
  275. cursorLayer.AddChild(Cursor);
  276. }
  277. }