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.Text.Json;
  6. using Godot;
  7.  
  8. public partial class GameApplication : Node2D
  9. {
  10. public static GameApplication Instance { get; private set; }
  11. /// <summary>
  12. /// 游戏渲染视口
  13. /// </summary>
  14. [Export] public SubViewport SubViewport;
  15.  
  16. /// <summary>
  17. /// SubViewportContainer 组件
  18. /// </summary>
  19. [Export] public SubViewportContainer SubViewportContainer;
  20.  
  21. /// <summary>
  22. /// 场景根节点
  23. /// </summary>
  24. [Export] public Node2D SceneRoot;
  25. /// <summary>
  26. /// 全局根节点
  27. /// </summary>
  28. [Export] public Node2D GlobalNodeRoot;
  29.  
  30. /// <summary>
  31. /// 是否开启调试
  32. /// </summary>
  33. [ExportGroup("Debug")]
  34. [Export] public bool Debug = false;
  35.  
  36. /// <summary>
  37. /// 测试用, 指定生成的房间
  38. /// </summary>
  39. [Export]
  40. public PackedScene[] DesignatedRoom;
  41.  
  42. /// <summary>
  43. /// 鼠标指针
  44. /// </summary>
  45. public Cursor Cursor { get; private set; }
  46. /// <summary>
  47. /// 游戏房间
  48. /// </summary>
  49. public RoomManager RoomManager { get; private set; }
  50.  
  51. /// <summary>
  52. /// 房间配置
  53. /// </summary>
  54. public Dictionary<string, DungeonRoomGroup> RoomConfig { get; private set; }
  55. /// <summary>
  56. /// 房间配置数据, key: 模板房间资源路径
  57. /// </summary>
  58. public Dictionary<string, DungeonRoomSplit> RoomConfigMap { get; private set; }
  59.  
  60. /// <summary>
  61. /// 游戏视图大小
  62. /// </summary>
  63. public Vector2 ViewportSize { get; private set; } = new Vector2(480, 270);
  64. /// <summary>
  65. /// 像素缩放
  66. /// </summary>
  67. public int PixelScale { get; private set; } = 4;
  68.  
  69. //开启的协程
  70. private List<CoroutineData> _coroutineList;
  71. public GameApplication()
  72. {
  73. Instance = this;
  74. InitRoomConfig();
  75.  
  76. //初始化 ActivityObject
  77. ActivityObject.InitActivity();
  78. }
  79. public override void _EnterTree()
  80. {
  81. //随机化种子
  82. //GD.Randomize();
  83. //固定帧率
  84. Engine.MaxFps = 60;
  85. //调试绘制开关
  86. ActivityObject.IsDebug = Debug;
  87. //Engine.TimeScale = 0.2f;
  88.  
  89. //窗体大小改变
  90. GetWindow().SizeChanged += OnWindowSizeChanged;
  91. RefreshSubViewportSize();
  92.  
  93. #if TOOLS
  94. InitDesignatedRoom();
  95. #endif
  96. //初始化ui
  97. UiManager.Init();
  98. // 初始化鼠标
  99. Input.MouseMode = Input.MouseModeEnum.Hidden;
  100. Cursor = ResourceManager.Load<PackedScene>(ResourcePath.prefab_Cursor_tscn).Instantiate<Cursor>();
  101. var cursorLayer = new CanvasLayer();
  102. cursorLayer.Name = "CursorLayer";
  103. cursorLayer.Layer = UiManager.GetUiLayer(UiLayer.Pop).Layer + 10;
  104. AddChild(cursorLayer);
  105. cursorLayer.AddChild(Cursor);
  106.  
  107. //打开ui
  108. UiManager.Open_RoomUI();
  109. RoomManager = ResourceManager.Load<PackedScene>(ResourcePath.scene_Room_tscn).Instantiate<RoomManager>();
  110. SceneRoot.AddChild(RoomManager);
  111. }
  112.  
  113. public override void _Process(double delta)
  114. {
  115. var newDelta = (float)delta;
  116. InputManager.Update(newDelta);
  117. //协程更新
  118. if (_coroutineList != null)
  119. {
  120. ProxyCoroutineHandler.ProxyUpdateCoroutine(ref _coroutineList, newDelta);
  121. }
  122. }
  123.  
  124. /// <summary>
  125. /// 将 viewport 以外的全局坐标 转换成 viewport 内的全局坐标
  126. /// </summary>
  127. public Vector2 GlobalToViewPosition(Vector2 globalPos)
  128. {
  129. //return globalPos;
  130. return globalPos / PixelScale - (ViewportSize / 2) + GameCamera.Main.GlobalPosition;
  131. }
  132.  
  133. /// <summary>
  134. /// 将 viewport 以内的全局坐标 转换成 viewport 外的全局坐标
  135. /// </summary>
  136. public Vector2 ViewToGlobalPosition(Vector2 viewPos)
  137. {
  138. // 3.5写法
  139. //return (viewPos - GameCamera.Main.GlobalPosition + (GameConfig.ViewportSize / 2)) * GameConfig.WindowScale - GameCamera.Main.SubPixelPosition;
  140. return (viewPos - (GameCamera.Main.GlobalPosition + GameCamera.Main.Offset) + (ViewportSize / 2)) * PixelScale;
  141. }
  142. /// <summary>
  143. /// 开启一个协程, 返回协程 id, 协程是在普通帧执行的, 支持: 协程嵌套, WaitForSeconds, WaitForFixedProcess, Task
  144. /// </summary>
  145. public long StartCoroutine(IEnumerator able)
  146. {
  147. return ProxyCoroutineHandler.ProxyStartCoroutine(ref _coroutineList, able);
  148. }
  149.  
  150. /// <summary>
  151. /// 根据协程 id 停止协程
  152. /// </summary>
  153. public void StopCoroutine(long coroutineId)
  154. {
  155. ProxyCoroutineHandler.ProxyStopCoroutine(ref _coroutineList, coroutineId);
  156. }
  157. /// <summary>
  158. /// 停止所有协程
  159. /// </summary>
  160. public void StopAllCoroutine()
  161. {
  162. ProxyCoroutineHandler.ProxyStopAllCoroutine(ref _coroutineList);
  163. }
  164.  
  165. //初始化房间配置
  166. private void InitRoomConfig()
  167. {
  168. //加载房间配置信息
  169. var file = FileAccess.Open(ResourcePath.resource_map_RoomConfig_json, FileAccess.ModeFlags.Read);
  170. var asText = file.GetAsText();
  171. RoomConfig = JsonSerializer.Deserialize<Dictionary<string, DungeonRoomGroup>>(asText);
  172. file.Dispose();
  173.  
  174. //初始化RoomConfigMap
  175. RoomConfigMap = new Dictionary<string, DungeonRoomSplit>();
  176. foreach (var dungeonRoomGroup in RoomConfig)
  177. {
  178. foreach (var dungeonRoomType in Enum.GetValues<DungeonRoomType>())
  179. {
  180. foreach (var dungeonRoomSplit in dungeonRoomGroup.Value.GetRoomList(dungeonRoomType))
  181. {
  182. RoomConfigMap.Add(dungeonRoomSplit.ScenePath, dungeonRoomSplit);
  183. }
  184. }
  185. }
  186. }
  187.  
  188. //窗体大小改变
  189. private void OnWindowSizeChanged()
  190. {
  191. var size = GetWindow().Size;
  192. ViewportSize = size / PixelScale;
  193. RefreshSubViewportSize();
  194. }
  195. //刷新视窗大小
  196. private void RefreshSubViewportSize()
  197. {
  198. var s = new Vector2I((int)ViewportSize.X, (int)ViewportSize.Y);
  199. s.X = s.X / 2 * 2;
  200. s.Y = s.Y / 2 * 2;
  201. SubViewport.Size = s;
  202. SubViewportContainer.Scale = new Vector2(PixelScale, PixelScale);
  203. SubViewportContainer.Size = s;
  204. }
  205.  
  206. #if TOOLS
  207. //调试模式下, 指定生成哪些房间
  208. private void InitDesignatedRoom()
  209. {
  210. if (DesignatedRoom != null && DesignatedRoom.Length > 0)
  211. {
  212. var list = new List<DungeonRoomSplit>();
  213. foreach (var packedScene in DesignatedRoom)
  214. {
  215. if (RoomConfigMap.TryGetValue(packedScene.ResourcePath, out var dungeonRoomSplit))
  216. {
  217. list.Add(dungeonRoomSplit);
  218. }
  219. }
  220. DungeonGenerator.SetDesignatedRoom(list);
  221. }
  222. }
  223. #endif
  224.  
  225. }