Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / GameApplication.cs
@lijincheng lijincheng on 11 Jul 2023 7 KB 绘制cell功能
  1.  
  2. using System;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using System.Text.Json;
  6. using Config;
  7. using Godot;
  8. using UI.BottomTips;
  9.  
  10. public partial class GameApplication : Node2D
  11. {
  12. public static GameApplication Instance { get; private set; }
  13. /// <summary>
  14. /// 游戏渲染视口
  15. /// </summary>
  16. [Export] public SubViewport SubViewport;
  17.  
  18. /// <summary>
  19. /// SubViewportContainer 组件
  20. /// </summary>
  21. [Export] public SubViewportContainer SubViewportContainer;
  22.  
  23. /// <summary>
  24. /// 场景根节点
  25. /// </summary>
  26. [Export] public Node2D SceneRoot;
  27. /// <summary>
  28. /// 全局根节点
  29. /// </summary>
  30. [Export] public Node2D GlobalNodeRoot;
  31.  
  32. /// <summary>
  33. /// 是否开启调试
  34. /// </summary>
  35. [ExportGroup("Debug")]
  36. [Export] public bool Debug = false;
  37.  
  38. /// <summary>
  39. /// 测试用, 指定生成的房间
  40. /// </summary>
  41. [Export]
  42. public PackedScene[] DesignatedRoom;
  43.  
  44. /// <summary>
  45. /// 鼠标指针
  46. /// </summary>
  47. public Cursor Cursor { get; private set; }
  48. /// <summary>
  49. /// 游戏世界
  50. /// </summary>
  51. public World World { get; private set; }
  52.  
  53. /// <summary>
  54. /// 地牢管理器
  55. /// </summary>
  56. public DungeonManager DungeonManager { get; private set; }
  57. /// <summary>
  58. /// 房间配置
  59. /// </summary>
  60. public Dictionary<string, DungeonRoomGroup> RoomConfig { get; private set; }
  61. /// <summary>
  62. /// 房间配置数据, key: 模板房间资源路径
  63. /// </summary>
  64. public Dictionary<string, DungeonRoomSplit> RoomConfigMap { get; private set; }
  65.  
  66. /// <summary>
  67. /// 游戏视图大小
  68. /// </summary>
  69. public Vector2 ViewportSize { get; private set; } = new Vector2(480, 270);
  70. /// <summary>
  71. /// 像素缩放
  72. /// </summary>
  73. public int PixelScale { get; private set; } = 4;
  74. /// <summary>
  75. /// 地牢配置信息
  76. /// </summary>
  77. public DungeonConfig DungeonConfig { get; private set; }
  78.  
  79. //开启的协程
  80. private List<CoroutineData> _coroutineList;
  81. public GameApplication()
  82. {
  83. Instance = this;
  84.  
  85. //初始化配置表
  86. ExcelConfig.Init();
  87. //初始化房间配置数据
  88. InitRoomConfig();
  89. //初始化 ActivityObject
  90. ActivityObject.InitActivity();
  91. //初始化武器数据
  92. Weapon.InitWeaponAttribute();
  93. DungeonConfig = new DungeonConfig();
  94. DungeonConfig.GroupName = "testGroup";
  95. DungeonConfig.RoomCount = 20;
  96. }
  97. public override void _EnterTree()
  98. {
  99. //随机化种子
  100. //GD.Randomize();
  101. //固定帧率
  102. Engine.MaxFps = 60;
  103. //调试绘制开关
  104. ActivityObject.IsDebug = Debug;
  105. //Engine.TimeScale = 0.2f;
  106.  
  107. ImageCanvas.Init(GetTree().CurrentScene);
  108. //窗体大小改变
  109. GetWindow().SizeChanged += OnWindowSizeChanged;
  110. RefreshSubViewportSize();
  111.  
  112. #if TOOLS
  113. InitDesignatedRoom();
  114. #endif
  115. //初始化ui
  116. UiManager.Init();
  117. // 初始化鼠标
  118. InitCursor();
  119. //地牢管理器
  120. DungeonManager = new DungeonManager();
  121. DungeonManager.Name = "DungeonManager";
  122. SceneRoot.AddChild(DungeonManager);
  123.  
  124. BottomTipsPanel.Init();
  125. //打开主菜单Ui
  126. //UiManager.Open_Main();
  127. UiManager.Open_MapEditor();
  128. }
  129.  
  130. public override void _Process(double delta)
  131. {
  132. var newDelta = (float)delta;
  133. InputManager.Update(newDelta);
  134. SoundManager.Update(newDelta);
  135. //协程更新
  136. if (_coroutineList != null)
  137. {
  138. ProxyCoroutineHandler.ProxyUpdateCoroutine(ref _coroutineList, newDelta);
  139. }
  140. }
  141.  
  142. /// <summary>
  143. /// 创建新的 World 对象, 相当于清理房间
  144. /// </summary>
  145. public World CreateNewWorld()
  146. {
  147. if (World != null)
  148. {
  149. ClearWorld();
  150. World.QueueFree();
  151. }
  152. World = ResourceManager.LoadAndInstantiate<World>(ResourcePath.scene_World_tscn);
  153. SceneRoot.AddChild(World);
  154. return World;
  155. }
  156.  
  157. /// <summary>
  158. /// 销毁 World 对象, 相当于清理房间
  159. /// </summary>
  160. public void DestroyWorld()
  161. {
  162. if (World != null)
  163. {
  164. ClearWorld();
  165. World.QueueFree();
  166. }
  167.  
  168. World = null;
  169. }
  170. /// <summary>
  171. /// 将 viewport 以外的全局坐标 转换成 viewport 内的全局坐标
  172. /// </summary>
  173. public Vector2 GlobalToViewPosition(Vector2 globalPos)
  174. {
  175. //return globalPos;
  176. return globalPos / PixelScale - (ViewportSize / 2) + GameCamera.Main.GlobalPosition;
  177. }
  178.  
  179. /// <summary>
  180. /// 将 viewport 以内的全局坐标 转换成 viewport 外的全局坐标
  181. /// </summary>
  182. public Vector2 ViewToGlobalPosition(Vector2 viewPos)
  183. {
  184. // 3.5写法
  185. //return (viewPos - GameCamera.Main.GlobalPosition + (GameConfig.ViewportSize / 2)) * GameConfig.WindowScale - GameCamera.Main.SubPixelPosition;
  186. return (viewPos - (GameCamera.Main.GlobalPosition + GameCamera.Main.Offset) + (ViewportSize / 2)) * PixelScale;
  187. }
  188. /// <summary>
  189. /// 开启一个协程, 返回协程 id, 协程是在普通帧执行的, 支持: 协程嵌套, WaitForSeconds, WaitForFixedProcess, Task, SignalAwaiter
  190. /// </summary>
  191. public long StartCoroutine(IEnumerator able)
  192. {
  193. return ProxyCoroutineHandler.ProxyStartCoroutine(ref _coroutineList, able);
  194. }
  195.  
  196. /// <summary>
  197. /// 根据协程 id 停止协程
  198. /// </summary>
  199. public void StopCoroutine(long coroutineId)
  200. {
  201. ProxyCoroutineHandler.ProxyStopCoroutine(ref _coroutineList, coroutineId);
  202. }
  203. /// <summary>
  204. /// 停止所有协程
  205. /// </summary>
  206. public void StopAllCoroutine()
  207. {
  208. ProxyCoroutineHandler.ProxyStopAllCoroutine(ref _coroutineList);
  209. }
  210.  
  211. //初始化房间配置
  212. private void InitRoomConfig()
  213. {
  214. //加载房间配置信息
  215. var file = FileAccess.Open(ResourcePath.resource_map_RoomConfig_json, FileAccess.ModeFlags.Read);
  216. var asText = file.GetAsText();
  217. RoomConfig = JsonSerializer.Deserialize<Dictionary<string, DungeonRoomGroup>>(asText);
  218. file.Dispose();
  219.  
  220. //初始化RoomConfigMap
  221. RoomConfigMap = new Dictionary<string, DungeonRoomSplit>();
  222. foreach (var dungeonRoomGroup in RoomConfig)
  223. {
  224. foreach (var dungeonRoomType in Enum.GetValues<DungeonRoomType>())
  225. {
  226. foreach (var dungeonRoomSplit in dungeonRoomGroup.Value.GetRoomList(dungeonRoomType))
  227. {
  228. RoomConfigMap.Add(dungeonRoomSplit.ScenePath, dungeonRoomSplit);
  229. }
  230. }
  231. }
  232. }
  233.  
  234. //窗体大小改变
  235. private void OnWindowSizeChanged()
  236. {
  237. var size = GetWindow().Size;
  238. ViewportSize = size / PixelScale;
  239. RefreshSubViewportSize();
  240. }
  241. //刷新视窗大小
  242. private void RefreshSubViewportSize()
  243. {
  244. var s = new Vector2I((int)ViewportSize.X, (int)ViewportSize.Y);
  245. s.X = s.X / 2 * 2;
  246. s.Y = s.Y / 2 * 2;
  247. SubViewport.Size = s;
  248. SubViewportContainer.Scale = new Vector2(PixelScale, PixelScale);
  249. SubViewportContainer.Size = s;
  250. }
  251.  
  252. //初始化鼠标
  253. private void InitCursor()
  254. {
  255. Input.MouseMode = Input.MouseModeEnum.Hidden;
  256. Cursor = ResourceManager.LoadAndInstantiate<Cursor>(ResourcePath.prefab_Cursor_tscn);
  257. var cursorLayer = new CanvasLayer();
  258. cursorLayer.Name = "CursorLayer";
  259. cursorLayer.Layer = UiManager.GetUiLayer(UiLayer.Pop).Layer + 10;
  260. AddChild(cursorLayer);
  261. cursorLayer.AddChild(Cursor);
  262. }
  263.  
  264. //清理世界
  265. private void ClearWorld()
  266. {
  267. var childCount = World.NormalLayer.GetChildCount();
  268. for (var i = 0; i < childCount; i++)
  269. {
  270. var c = World.NormalLayer.GetChild(i);
  271. if (c is IDestroy destroy)
  272. {
  273. destroy.Destroy();
  274. }
  275. }
  276. childCount = World.YSortLayer.GetChildCount();
  277. for (var i = 0; i < childCount; i++)
  278. {
  279. var c = World.YSortLayer.GetChild(i);
  280. if (c is IDestroy destroy)
  281. {
  282. destroy.Destroy();
  283. }
  284. }
  285. }
  286.  
  287. #if TOOLS
  288. //调试模式下, 指定生成哪些房间
  289. private void InitDesignatedRoom()
  290. {
  291. if (DesignatedRoom != null && DesignatedRoom.Length > 0)
  292. {
  293. var list = new List<DungeonRoomSplit>();
  294. foreach (var packedScene in DesignatedRoom)
  295. {
  296. if (RoomConfigMap.TryGetValue(packedScene.ResourcePath, out var dungeonRoomSplit))
  297. {
  298. list.Add(dungeonRoomSplit);
  299. }
  300. }
  301. DungeonGenerator.SetDesignatedRoom(list);
  302. }
  303. }
  304. #endif
  305.  
  306. }