FlaxEngine学习笔记(六):Screen模块

2021SC@SDUSC

这次我们来看screen模块和commandLine模块,顾名思义,这两个模块是负责屏幕检测和命令行检测的。

1.Screen模块

由screen.cpp和screen.h组成,先观察screen.h:

API_PROPERTY() static bool GetIsFullscreen();//获取全屏模式
API_PROPERTY() static void SetIsFullscreen(bool value);//设置全屏模式
API_PROPERTY() static Vector2 GetSize();//获取屏幕尺寸
API_FUNCTION() static Vector2 ScreenToGameViewport(const Vector2& screenPos);//将屏幕转换为游戏窗口,即进入游戏窗口
API_FUNCTION() static Vector2 GameViewportToScreen(const Vector2& viewportPos);//将游戏窗口转为屏幕
API_PROPERTY() static void SetSize(const Vector2& value);//设置屏幕尺寸
API_PROPERTY() static bool GetCursorVisible();//获取鼠标可视
API_PROPERTY() static void SetCursorVisible(const bool value);//设置鼠标可视
API_PROPERTY() static CursorLockMode GetCursorLock();//获取鼠标锁定模式
API_PROPERTY() static void SetCursorLock(CursorLockMode mode);//设置鼠标锁定模式

可以看到这一文件定义了基本的接口方法,主要是屏幕模式和游戏窗口与普通窗口转换的方法。

接着我们去到screen.cpp看具体实现:

1.获取全屏模式:

bool Screen::GetIsFullscreen()
{
#if USE_EDITOR
    return false;
#else
	auto win = Engine::MainWindow;
	return win ? win->IsFullscreen() : false;
#endif
}

利用三目表达式,简单判断主屏幕是否全屏,返回true或false。

2.设置全屏模式:

void Screen::SetIsFullscreen(bool value)
{
    Fullscreen = value;
}

3.获取屏幕尺寸:

Vector2 Screen::GetSize()
{
#if USE_EDITOR
    return Editor::Managed->GetGameWindowSize();
#else
	auto win = Engine::MainWindow;
	return win ? win->GetClientSize() : Vector2::Zero;
#endif
}

调用GetClientSize()方法获取客户端尺寸,判断是否主屏幕,若是则函数返回客户端尺寸,若不是则传回0。

4.设置尺寸:

void Screen::SetSize(const Vector2& value)
{
    if (value.X <= 0 || value.Y <= 0)
    {
        LOG(Error, "Invalid Screen size to set.");
        return;
    }

    Size = value;
}

参数value作为屏幕尺寸参数,简单判断值是否合法后传值即可。

5.转换屏幕至游戏窗口:

Vector2 Screen::ScreenToGameViewport(const Vector2& screenPos)
{
#if USE_EDITOR
    return Editor::Managed->ScreenToGameViewport(screenPos);
#else
    auto win = Engine::MainWindow;
    return win ? win->ScreenToClient(screenPos) : Vector2::Minimum;
#endif
}

实际上就是转换至客户端窗口。

6.游戏窗口转换至屏幕:

Vector2 Screen::GameViewportToScreen(const Vector2& viewportPos)
{
#if USE_EDITOR
    return Editor::Managed->GameViewportToScreen(viewportPos);
#else
    auto win = Engine::MainWindow;
    return win ? win->ClientToScreen(viewportPos) : Vector2::Minimum;
#endif
}

与上面的方法类似。

7.获取鼠标光标可视:

bool Screen::GetCursorVisible()
{
#if USE_EDITOR
    const auto win = Editor::Managed->GetGameWindow();
#else
	const auto win = Engine::MainWindow;
#endif
    return win ? win->GetCursor() != CursorType::Hidden : true;
}

设置win窗口变量,若是编辑模式则传回游戏窗口,若不是则传回引擎主窗口。最后判断win窗口变量的鼠标光标是否隐藏。

8.设置鼠标光标可视:

void Screen::SetCursorVisible(const bool value)
{
#if USE_EDITOR
    const auto win = Editor::Managed->GetGameWindow();
#else
	const auto win = Engine::MainWindow;
#endif
    if (win)
    {
        win->SetCursor(value ? CursorType::Default : CursorType::Hidden);
    }
}

参数为bool类型,即true则不隐藏,false为隐藏。

9.光标锁定的get和set方法:

CursorLockMode Screen::GetCursorLock()
{
    return CursorLock;
}

void Screen::SetCursorLock(CursorLockMode mode)
{
    CursorLock = mode;
}

10.屏幕服务的绘制方法:

void ScreenService::Draw()
{
#if USE_EDITOR

    // Not supported

#else

	if (Fullscreen.HasValue())
	{
		auto win = Engine::MainWindow;
		if (win)
		{
			win->SetIsFullscreen(Fullscreen.GetValue());
		}

		Fullscreen.Reset();
	}

	if (Size.HasValue())
	{
		auto win = Engine::MainWindow;
		if (win)
		{
			win->SetClientSize(Size.GetValue());
		}

		Size.Reset();
	}

#endif
}

相当于一个初始化方法,全屏模式下则直接获取全屏的屏幕尺寸,窗口模式下则获取当前客户端显示尺寸,一个简单的初始化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值