Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / GameApplication.cs

using System.Collections.Generic;
using System.Text.Json;
using Godot;
using UI.RoomUI;

public partial class GameApplication : Node2D
{
	public static GameApplication Instance { get; private set; }

	/// <summary>
	/// 是否开启调试
	/// </summary>
	[Export] public bool Debug = false;

	/// <summary>
	/// 游戏渲染视口
	/// </summary>
	[Export] public SubViewport SubViewport;

	/// <summary>
	/// SubViewportContainer 组件
	/// </summary>
	[Export] public SubViewportContainer SubViewportContainer;

	/// <summary>
	/// 场景根节点
	/// </summary>
	[Export] public Node2D SceneRoot;
	
	/// <summary>
	/// 全局根节点
	/// </summary>
	[Export] public Node2D GlobalNodeRoot;

	/// <summary>
	/// 鼠标指针
	/// </summary>
	public Cursor Cursor { get; private set; }
	
	/// <summary>
	/// 游戏房间
	/// </summary>
	public RoomManager RoomManager { get; private set; }
	
	/// <summary>
	/// 房间配置
	/// </summary>
	public List<DungeonRoomSplit> RoomConfig { get; private set; }

	public GameApplication()
	{
		Instance = this;
		
		InitRoomConfig();

		//初始化 ActivityObject
		ActivityObject.InitActivity();
	}
	
	public override void _EnterTree()
	{
		//随机化种子
		//GD.Randomize();
		//固定帧率
		Engine.MaxFps = 60;
		//调试绘制开关
		ActivityObject.IsDebug = Debug;
		//Engine.TimeScale = 0.3f;

		//初始化ui
		UiManager.Init();
		
		// 初始化鼠标
		Input.MouseMode = Input.MouseModeEnum.Hidden;
		Cursor = ResourceManager.Load<PackedScene>(ResourcePath.prefab_ui_Cursor_tscn).Instantiate<Cursor>();
		AddChild(Cursor);

		//打开ui
		UiManager.Open_RoomUI();
		
		RoomManager = ResourceManager.Load<PackedScene>(ResourcePath.scene_Room_tscn).Instantiate<RoomManager>();
		SceneRoot.AddChild(RoomManager);
	}

	public override void _Process(double delta)
	{
		InputManager.Update((float)delta);
	}

	/// <summary>
	/// 将 viewport 以外的全局坐标 转换成 viewport 内的全局坐标
	/// </summary>
	public Vector2 GlobalToViewPosition(Vector2 globalPos)
	{
		//return globalPos;
		return globalPos / GameConfig.WindowScale - (GameConfig.ViewportSize / 2) + GameCamera.Main.GlobalPosition;
	}

	/// <summary>
	/// 将 viewport 以内的全局坐标 转换成 viewport 外的全局坐标
	/// </summary>
	public Vector2 ViewToGlobalPosition(Vector2 viewPos)
	{
		// 3.5写法
		//return (viewPos - GameCamera.Main.GlobalPosition + (GameConfig.ViewportSize / 2)) * GameConfig.WindowScale - GameCamera.Main.SubPixelPosition;
		return (viewPos - GameCamera.Main.GlobalPosition + (GameConfig.ViewportSize / 2)) * GameConfig.WindowScale;
	}

	//初始化房间配置
	private void InitRoomConfig()
	{
		//加载房间配置信息
		var file = FileAccess.Open(ResourcePath.resource_map_RoomConfig_json, FileAccess.ModeFlags.Read);
		var asText = file.GetAsText();
		RoomConfig = JsonSerializer.Deserialize<List<DungeonRoomSplit>>(asText);
		file.Dispose();
		
		//需要处理 DoorAreaInfos 长度为 0 的房间, 并为其配置默认值
		foreach (var roomSplit in RoomConfig)
		{
			var areaInfos = roomSplit.RoomInfo.DoorAreaInfos;
			if (areaInfos.Count == 0)
			{
				areaInfos.Add(new DoorAreaInfo(DoorDirection.N, GameConfig.TileCellSize, (roomSplit.RoomInfo.Size.X - 1) * GameConfig.TileCellSize));
				areaInfos.Add(new DoorAreaInfo(DoorDirection.S, GameConfig.TileCellSize, (roomSplit.RoomInfo.Size.X - 1) * GameConfig.TileCellSize));
				areaInfos.Add(new DoorAreaInfo(DoorDirection.W, GameConfig.TileCellSize, (roomSplit.RoomInfo.Size.Y - 1) * GameConfig.TileCellSize));
				areaInfos.Add(new DoorAreaInfo(DoorDirection.E, GameConfig.TileCellSize, (roomSplit.RoomInfo.Size.Y - 1) * GameConfig.TileCellSize));
			}
		}
	}
}