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