C++ 如何停止调整 Sf :: 屏幕上的文本调整大小(但在同一位置)
C++ How do I stop resizing Sf :: Text on screen resize ( but at the same position)
我正在制作地图编辑器,我想添加调整大小 window 但是当我调整大小时 window 我的 gui 元素也在调整大小我怎么能阻止它,
我停止使用设置新的地图视图大小来调整地图表面的大小,但我无法使用 gui 元素进行调整,因为它会改变 gui 元素的位置
if(events.type == sf::Event::Resized)
{
m_defaultViewSize.x = events.size.width;
m_defaultViewSize.y = events.size.height;
m_mapView.setSize(m_defaultViewSize);
m_mapView.setSize(m_mapView.getSize() / m_zoomScale);// Apply the zoom level
m_stateData->window->setView(m_mapView);
}
抱歉我的英语不好
如果您目前没有 GUI 视图,您的渲染代码可能类似于:
m_stateData->window->clear();
m_stateData->window->setView(m_mapView);
m_stateData->window->draw(m_map);
m_stateData->window->draw(m_gui);
m_stateData->window->display();
这是在与地图相同的视图上绘制 GUI,因此如果地图视图发生变化,GUI 也会随之变化。如果地图没有改变,这可能没问题,但如果您计划移动、缩放或旋转地图,最好创建一个 GUI 视图。
现在渲染可能如下所示:
m_stateData->window->clear();
m_stateData->window->setView(m_mapView);
m_stateData->window->draw(m_map);
m_stateData->window->setView(m_guiView);
m_stateData->window->draw(m_gui);
m_stateData->window->display();
这很好,直到我们调整 window。
调整 window 大小后,即使视口大小发生变化,视图仍保持不变。如果 window 在水平方向而非垂直方向放大两倍,则 GUI 将被水平拉伸。
我个人不喜欢拉伸,我觉得它不好看。我们应该调整视图大小。
您可以像调整地图视图一样调整视图大小。
m_guiView.setSize(m_defaultViewSize);
m_guiView.setSize(m_guiView.getSize() / m_zoomScale);
这将停止调整 GUI 元素的大小,但它们的位置将与我们未调整 window 的大小相同。您可能想要重新定位 GUI 元素。一种简单的方法是将 GUI 元素的位置存储为沿屏幕水平和垂直方向的比率。因此,左上角可能是 (-0.5, -0.5),右下角可能是 (0.5, 0.5)。
这可能看起来像(以 (0, 0) 为中心的视图):
// get ratio position of gui element
sf::Vector2f ratio_position = {
(m_gui.getPosition().x) / m_guiView.getSize().x,
(m_gui.getPosition().y) / m_guiView.getSize().y
};
// resize view
m_guiView.setSize(m_defaultViewSize);
m_guiView.setSize(m_guiView.getSize() / m_zoomScale);
// set position of gui element
m_gui.setPosition(
(ratio_position.x)* m_guiView.getSize().x,
(ratio_position.y) * m_guiView.getSize().y
);
您也可以将此作为 class 的功能。
你也可以使用比率以外的东西。
您可以使 GUI 元素相对于屏幕的角或其他比率。所以你可以在视图的左上角设置健康栏、耐力栏、法力栏。这只是计算左上角的位置(视图中心 - 视图大小的一半),然后添加一些相对位置(例如,(0, 0) 用于健康栏,(0, 32) 用于耐力栏等)。
我建议您看看其他游戏引擎如何处理 GUI。 Unity 使用锚点。 Godot 使用容器。尝试重新创建您喜欢的系统。
我正在制作地图编辑器,我想添加调整大小 window 但是当我调整大小时 window 我的 gui 元素也在调整大小我怎么能阻止它, 我停止使用设置新的地图视图大小来调整地图表面的大小,但我无法使用 gui 元素进行调整,因为它会改变 gui 元素的位置
if(events.type == sf::Event::Resized)
{
m_defaultViewSize.x = events.size.width;
m_defaultViewSize.y = events.size.height;
m_mapView.setSize(m_defaultViewSize);
m_mapView.setSize(m_mapView.getSize() / m_zoomScale);// Apply the zoom level
m_stateData->window->setView(m_mapView);
}
抱歉我的英语不好
如果您目前没有 GUI 视图,您的渲染代码可能类似于:
m_stateData->window->clear();
m_stateData->window->setView(m_mapView);
m_stateData->window->draw(m_map);
m_stateData->window->draw(m_gui);
m_stateData->window->display();
这是在与地图相同的视图上绘制 GUI,因此如果地图视图发生变化,GUI 也会随之变化。如果地图没有改变,这可能没问题,但如果您计划移动、缩放或旋转地图,最好创建一个 GUI 视图。
现在渲染可能如下所示:
m_stateData->window->clear();
m_stateData->window->setView(m_mapView);
m_stateData->window->draw(m_map);
m_stateData->window->setView(m_guiView);
m_stateData->window->draw(m_gui);
m_stateData->window->display();
这很好,直到我们调整 window。
调整 window 大小后,即使视口大小发生变化,视图仍保持不变。如果 window 在水平方向而非垂直方向放大两倍,则 GUI 将被水平拉伸。
我个人不喜欢拉伸,我觉得它不好看。我们应该调整视图大小。
您可以像调整地图视图一样调整视图大小。
m_guiView.setSize(m_defaultViewSize);
m_guiView.setSize(m_guiView.getSize() / m_zoomScale);
这将停止调整 GUI 元素的大小,但它们的位置将与我们未调整 window 的大小相同。您可能想要重新定位 GUI 元素。一种简单的方法是将 GUI 元素的位置存储为沿屏幕水平和垂直方向的比率。因此,左上角可能是 (-0.5, -0.5),右下角可能是 (0.5, 0.5)。 这可能看起来像(以 (0, 0) 为中心的视图):
// get ratio position of gui element
sf::Vector2f ratio_position = {
(m_gui.getPosition().x) / m_guiView.getSize().x,
(m_gui.getPosition().y) / m_guiView.getSize().y
};
// resize view
m_guiView.setSize(m_defaultViewSize);
m_guiView.setSize(m_guiView.getSize() / m_zoomScale);
// set position of gui element
m_gui.setPosition(
(ratio_position.x)* m_guiView.getSize().x,
(ratio_position.y) * m_guiView.getSize().y
);
您也可以将此作为 class 的功能。
你也可以使用比率以外的东西。
您可以使 GUI 元素相对于屏幕的角或其他比率。所以你可以在视图的左上角设置健康栏、耐力栏、法力栏。这只是计算左上角的位置(视图中心 - 视图大小的一半),然后添加一些相对位置(例如,(0, 0) 用于健康栏,(0, 32) 用于耐力栏等)。
我建议您看看其他游戏引擎如何处理 GUI。 Unity 使用锚点。 Godot 使用容器。尝试重新创建您喜欢的系统。