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