Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / GameApplication.cs
@小李xl 小李xl on 29 May 2023 6 KB 资源移动位置
  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 World World { get; private set; }
  50.  
  51. /// <summary>
  52. /// 地牢管理器
  53. /// </summary>
  54. public DungeonManager DungeonManager { get; private set; }
  55. /// <summary>
  56. /// 房间配置
  57. /// </summary>
  58. public Dictionary<string, DungeonRoomGroup> RoomConfig { get; private set; }
  59. /// <summary>
  60. /// 房间配置数据, key: 模板房间资源路径
  61. /// </summary>
  62. public Dictionary<string, DungeonRoomSplit> RoomConfigMap { get; private set; }
  63.  
  64. /// <summary>
  65. /// 游戏视图大小
  66. /// </summary>
  67. public Vector2 ViewportSize { get; private set; } = new Vector2(480, 270);
  68. /// <summary>
  69. /// 像素缩放
  70. /// </summary>
  71. public int PixelScale { get; private set; } = 4;
  72. /// <summary>
  73. /// 地牢配置信息
  74. /// </summary>
  75. public DungeonConfig DungeonConfig { get; private set; }
  76.  
  77. //开启的协程
  78. private List<CoroutineData> _coroutineList;
  79. public GameApplication()
  80. {
  81. Instance = this;
  82. InitRoomConfig();
  83.  
  84. //初始化 ActivityObject
  85. ActivityObject.InitActivity();
  86. DungeonConfig = new DungeonConfig();
  87. DungeonConfig.GroupName = "testGroup";
  88. DungeonConfig.RoomCount = 5;
  89. }
  90. public override void _EnterTree()
  91. {
  92. //随机化种子
  93. //GD.Randomize();
  94. //固定帧率
  95. Engine.MaxFps = 60;
  96. //调试绘制开关
  97. ActivityObject.IsDebug = Debug;
  98. //Engine.TimeScale = 0.2f;
  99.  
  100. //窗体大小改变
  101. GetWindow().SizeChanged += OnWindowSizeChanged;
  102. RefreshSubViewportSize();
  103.  
  104. #if TOOLS
  105. InitDesignatedRoom();
  106. #endif
  107. //初始化ui
  108. UiManager.Init();
  109. // 初始化鼠标
  110. InitCursor();
  111. //地牢管理器
  112. DungeonManager = new DungeonManager();
  113. DungeonManager.Name = "DungeonManager";
  114. SceneRoot.AddChild(DungeonManager);
  115. //打开主菜单Ui
  116. UiManager.Open_Main();
  117. }
  118.  
  119. public override void _Process(double delta)
  120. {
  121. var newDelta = (float)delta;
  122. InputManager.Update(newDelta);
  123. //协程更新
  124. if (_coroutineList != null)
  125. {
  126. ProxyCoroutineHandler.ProxyUpdateCoroutine(ref _coroutineList, newDelta);
  127. }
  128. }
  129.  
  130. /// <summary>
  131. /// 创建新的 World 对象, 相当于清理房间
  132. /// </summary>
  133. public World CreateNewWorld()
  134. {
  135. if (World != null)
  136. {
  137. World.QueueFree();
  138. }
  139. World = ResourceManager.LoadAndInstantiate<World>(ResourcePath.scene_World_tscn);
  140. SceneRoot.AddChild(World);
  141. return World;
  142. }
  143.  
  144. /// <summary>
  145. /// 销毁 World 对象, 相当于清理房间
  146. /// </summary>
  147. public void DestroyWorld()
  148. {
  149. if (World != null)
  150. {
  151. World.QueueFree();
  152. }
  153.  
  154. World = null;
  155. }
  156. /// <summary>
  157. /// 将 viewport 以外的全局坐标 转换成 viewport 内的全局坐标
  158. /// </summary>
  159. public Vector2 GlobalToViewPosition(Vector2 globalPos)
  160. {
  161. //return globalPos;
  162. return globalPos / PixelScale - (ViewportSize / 2) + GameCamera.Main.GlobalPosition;
  163. }
  164.  
  165. /// <summary>
  166. /// 将 viewport 以内的全局坐标 转换成 viewport 外的全局坐标
  167. /// </summary>
  168. public Vector2 ViewToGlobalPosition(Vector2 viewPos)
  169. {
  170. // 3.5写法
  171. //return (viewPos - GameCamera.Main.GlobalPosition + (GameConfig.ViewportSize / 2)) * GameConfig.WindowScale - GameCamera.Main.SubPixelPosition;
  172. return (viewPos - (GameCamera.Main.GlobalPosition + GameCamera.Main.Offset) + (ViewportSize / 2)) * PixelScale;
  173. }
  174. /// <summary>
  175. /// 开启一个协程, 返回协程 id, 协程是在普通帧执行的, 支持: 协程嵌套, WaitForSeconds, WaitForFixedProcess, Task, SignalAwaiter
  176. /// </summary>
  177. public long StartCoroutine(IEnumerator able)
  178. {
  179. return ProxyCoroutineHandler.ProxyStartCoroutine(ref _coroutineList, able);
  180. }
  181.  
  182. /// <summary>
  183. /// 根据协程 id 停止协程
  184. /// </summary>
  185. public void StopCoroutine(long coroutineId)
  186. {
  187. ProxyCoroutineHandler.ProxyStopCoroutine(ref _coroutineList, coroutineId);
  188. }
  189. /// <summary>
  190. /// 停止所有协程
  191. /// </summary>
  192. public void StopAllCoroutine()
  193. {
  194. ProxyCoroutineHandler.ProxyStopAllCoroutine(ref _coroutineList);
  195. }
  196.  
  197. //初始化房间配置
  198. private void InitRoomConfig()
  199. {
  200. //加载房间配置信息
  201. var file = FileAccess.Open(ResourcePath.resource_map_RoomConfig_json, FileAccess.ModeFlags.Read);
  202. var asText = file.GetAsText();
  203. RoomConfig = JsonSerializer.Deserialize<Dictionary<string, DungeonRoomGroup>>(asText);
  204. file.Dispose();
  205.  
  206. //初始化RoomConfigMap
  207. RoomConfigMap = new Dictionary<string, DungeonRoomSplit>();
  208. foreach (var dungeonRoomGroup in RoomConfig)
  209. {
  210. foreach (var dungeonRoomType in Enum.GetValues<DungeonRoomType>())
  211. {
  212. foreach (var dungeonRoomSplit in dungeonRoomGroup.Value.GetRoomList(dungeonRoomType))
  213. {
  214. RoomConfigMap.Add(dungeonRoomSplit.ScenePath, dungeonRoomSplit);
  215. }
  216. }
  217. }
  218. }
  219.  
  220. //窗体大小改变
  221. private void OnWindowSizeChanged()
  222. {
  223. var size = GetWindow().Size;
  224. ViewportSize = size / PixelScale;
  225. RefreshSubViewportSize();
  226. }
  227. //刷新视窗大小
  228. private void RefreshSubViewportSize()
  229. {
  230. var s = new Vector2I((int)ViewportSize.X, (int)ViewportSize.Y);
  231. s.X = s.X / 2 * 2;
  232. s.Y = s.Y / 2 * 2;
  233. SubViewport.Size = s;
  234. SubViewportContainer.Scale = new Vector2(PixelScale, PixelScale);
  235. SubViewportContainer.Size = s;
  236. }
  237.  
  238. //初始化鼠标
  239. private void InitCursor()
  240. {
  241. Input.MouseMode = Input.MouseModeEnum.Hidden;
  242. Cursor = ResourceManager.LoadAndInstantiate<Cursor>(ResourcePath.prefab_Cursor_tscn);
  243. var cursorLayer = new CanvasLayer();
  244. cursorLayer.Name = "CursorLayer";
  245. cursorLayer.Layer = UiManager.GetUiLayer(UiLayer.Pop).Layer + 10;
  246. AddChild(cursorLayer);
  247. cursorLayer.AddChild(Cursor);
  248. }
  249.  
  250. #if TOOLS
  251. //调试模式下, 指定生成哪些房间
  252. private void InitDesignatedRoom()
  253. {
  254. if (DesignatedRoom != null && DesignatedRoom.Length > 0)
  255. {
  256. var list = new List<DungeonRoomSplit>();
  257. foreach (var packedScene in DesignatedRoom)
  258. {
  259. if (RoomConfigMap.TryGetValue(packedScene.ResourcePath, out var dungeonRoomSplit))
  260. {
  261. list.Add(dungeonRoomSplit);
  262. }
  263. }
  264. DungeonGenerator.SetDesignatedRoom(list);
  265. }
  266. }
  267. #endif
  268.  
  269. }