Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / GameApplication.cs
  1.  
  2. using System.Collections.Generic;
  3. using System.Text.Json;
  4. using Godot;
  5.  
  6. public partial class GameApplication : Node2D
  7. {
  8. public static GameApplication Instance { get; private set; }
  9.  
  10. /// <summary>
  11. /// 是否开启调试
  12. /// </summary>
  13. [Export] public bool Debug = false;
  14.  
  15. [Export] public PackedScene CursorPack;
  16.  
  17. [Export] public NodePath RoomPath;
  18.  
  19. [Export] public NodePath ViewportPath;
  20.  
  21. [Export] public NodePath ViewportContainerPath;
  22.  
  23. [Export] public NodePath UiPath;
  24.  
  25. [Export] public NodePath GlobalNodeRootPath;
  26.  
  27. [Export] public Font Font;
  28. /// <summary>
  29. /// 鼠标指针
  30. /// </summary>
  31. public Cursor Cursor { get; private set; }
  32.  
  33. /// <summary>
  34. /// 游戏房间
  35. /// </summary>
  36. public RoomManager RoomManager { get; private set; }
  37.  
  38. /// <summary>
  39. /// 游戏渲染视口
  40. /// </summary>
  41. public SubViewport SubViewport { get; private set; }
  42.  
  43. /// <summary>
  44. /// SubViewportContainer 组件
  45. /// </summary>
  46. public SubViewportContainer SubViewportContainer { get; private set; }
  47.  
  48. /// <summary>
  49. /// 游戏ui对象
  50. /// </summary>
  51. public RoomUI Ui { get; private set; }
  52.  
  53. /// <summary>
  54. /// 全局根节点
  55. /// </summary>
  56. public Node2D GlobalNodeRoot { get; private set; }
  57. /// <summary>
  58. /// 房间配置
  59. /// </summary>
  60. public List<DungeonRoomSplit> RoomConfig { get; private set; }
  61.  
  62. public GameApplication()
  63. {
  64. Instance = this;
  65. InitRoomConfig();
  66.  
  67. //扫描并注册当前程序集下的武器
  68. WeaponManager.RegisterWeaponFromAssembly(GetType().Assembly);
  69. }
  70. public override void _EnterTree()
  71. {
  72. //随机化种子
  73. //GD.Randomize();
  74. //固定帧率
  75. Engine.MaxFps = 60;
  76. //调试绘制开关
  77. ActivityObject.IsDebug = Debug;
  78. //Engine.TimeScale = 0.3f;
  79.  
  80. GlobalNodeRoot = GetNode<Node2D>(GlobalNodeRootPath);
  81. // 初始化鼠标
  82. Input.MouseMode = Input.MouseModeEnum.Hidden;
  83. Cursor = CursorPack.Instantiate<Cursor>();
  84.  
  85. RoomManager = GetNode<RoomManager>(RoomPath);
  86. SubViewport = GetNode<SubViewport>(ViewportPath);
  87. SubViewportContainer = GetNode<SubViewportContainer>(ViewportContainerPath);
  88. Ui = GetNode<RoomUI>(UiPath);
  89.  
  90. Ui.AddChild(Cursor);
  91. }
  92.  
  93. public override void _Process(double delta)
  94. {
  95. InputManager.Update((float)delta);
  96. }
  97.  
  98. /// <summary>
  99. /// 将 viewport 以外的全局坐标 转换成 viewport 内的全局坐标
  100. /// </summary>
  101. public Vector2 GlobalToViewPosition(Vector2 globalPos)
  102. {
  103. //return globalPos;
  104. return globalPos / GameConfig.WindowScale - (GameConfig.ViewportSize / 2) + GameCamera.Main.GlobalPosition;
  105. }
  106.  
  107. /// <summary>
  108. /// 将 viewport 以内的全局坐标 转换成 viewport 外的全局坐标
  109. /// </summary>
  110. public Vector2 ViewToGlobalPosition(Vector2 viewPos)
  111. {
  112. //return viewPos;
  113. return (viewPos - GameCamera.Main.GlobalPosition + (GameConfig.ViewportSize / 2)) * GameConfig.WindowScale - GameCamera.Main.SubPixelPosition;
  114. }
  115.  
  116. //初始化房间配置
  117. private void InitRoomConfig()
  118. {
  119. //加载房间配置信息
  120. var file = FileAccess.Open(ResourcePath.resource_map_RoomConfig_json, FileAccess.ModeFlags.Read);
  121. var asText = file.GetAsText();
  122. RoomConfig = JsonSerializer.Deserialize<List<DungeonRoomSplit>>(asText);
  123. file.Dispose();
  124. //需要处理 DoorAreaInfos 长度为 0 的房间, 并为其配置默认值
  125. foreach (var roomSplit in RoomConfig)
  126. {
  127. var areaInfos = roomSplit.RoomInfo.DoorAreaInfos;
  128. if (areaInfos.Count == 0)
  129. {
  130. areaInfos.Add(new DoorAreaInfo(DoorDirection.N, GenerateDungeon.TileCellSize, (roomSplit.RoomInfo.Size.X - 2) * GenerateDungeon.TileCellSize));
  131. areaInfos.Add(new DoorAreaInfo(DoorDirection.S, GenerateDungeon.TileCellSize, (roomSplit.RoomInfo.Size.X - 2) * GenerateDungeon.TileCellSize));
  132. areaInfos.Add(new DoorAreaInfo(DoorDirection.W, GenerateDungeon.TileCellSize, (roomSplit.RoomInfo.Size.Y - 2) * GenerateDungeon.TileCellSize));
  133. areaInfos.Add(new DoorAreaInfo(DoorDirection.E, GenerateDungeon.TileCellSize, (roomSplit.RoomInfo.Size.Y - 2) * GenerateDungeon.TileCellSize));
  134. }
  135. }
  136. }
  137. }