Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / GameApplication.cs
@lijincheng lijincheng on 13 Feb 2023 2 KB 更改工程结构

using Godot;

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

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

	[Export] public PackedScene CursorPack;

	[Export] public NodePath RoomPath;

	[Export] public NodePath ViewportPath;

	[Export] public NodePath ViewportContainerPath;

	[Export] public NodePath UiPath;

	[Export] public NodePath GlobalNodeRootPath;

	[Export] public Font Font;
	
	/// <summary>
	/// 鼠标指针
	/// </summary>
	public Cursor Cursor { get; private set; }

	/// <summary>
	/// 游戏房间
	/// </summary>
	public RoomManager RoomManager { get; private set; }

	/// <summary>
	/// 游戏渲染视口
	/// </summary>
	public SubViewport SubViewport { get; private set; }

	/// <summary>
	/// SubViewportContainer 组件
	/// </summary>
	public SubViewportContainer SubViewportContainer { get; private set; }

	/// <summary>
	/// 游戏ui对象
	/// </summary>
	public RoomUI Ui { get; private set; }

	/// <summary>
	/// 全局根节点
	/// </summary>
	public Node2D GlobalNodeRoot { get; private set; }

	public GameApplication()
	{
		Instance = this;
		
		//扫描并注册当前程序集下的武器
		WeaponManager.RegisterWeaponFromAssembly(GetType().Assembly);
	}
	
	public override void _EnterTree()
	{
		//随机化种子
		GD.Randomize();
		//固定帧率
		Engine.MaxFps = 60;
		//调试绘制开关
		ActivityObject.IsDebug = Debug;
		//Engine.TimeScale = 0.3f;

		GlobalNodeRoot = GetNode<Node2D>(GlobalNodeRootPath);
		// 初始化鼠标
		Input.MouseMode = Input.MouseModeEnum.Hidden;
		Cursor = CursorPack.Instantiate<Cursor>();

		RoomManager = GetNode<RoomManager>(RoomPath);
		SubViewport = GetNode<SubViewport>(ViewportPath);
		SubViewportContainer = GetNode<SubViewportContainer>(ViewportContainerPath);
		Ui = GetNode<RoomUI>(UiPath);

		Ui.AddChild(Cursor);
	}

	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)
	{
		//return viewPos;
		return (viewPos - GameCamera.Main.GlobalPosition + (GameConfig.ViewportSize / 2)) * GameConfig.WindowScale - GameCamera.Main.SubPixelPosition;
	}
}