C++ 如何停止调整 Sf 的大小 :: 屏幕上的文本调整大小但在同一位置

如何解决C++ 如何停止调整 Sf 的大小 :: 屏幕上的文本调整大小但在同一位置

我正在制作地图编辑器,我想添加调整大小的窗口,但是当我调整窗口大小时,我的 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();

这很好,直到我们调整窗口大小。
调整窗口大小后,即使视口已更改大小,视图也保持不变。如果窗口在水平方向上放大了两倍但在垂直方向上没有放大,GUI 将被水平拉伸。
我个人不喜欢拉伸,我认为它不好看。我们应该调整视图的大小。
您可以像调整地图视图大小一样调整视图大小。

m_guiView.setSize(m_defaultViewSize);
m_guiView.setSize(m_guiView.getSize() / m_zoomScale);

这将停止调整 GUI 元素的大小,但它们的位置将与我们没有调整窗口大小一样。您可能想要重新定位 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
);

您也可以将其设为类的功能。

你也可以使用比率以外的东西。
您可以制作相对于屏幕角落或其他比例的 GUI 元素。因此,您可以拥有相对于视图左上角的健康栏、耐力栏、法力栏。这只是计算左上角位置(视图中心 - 视图大小的一半),然后添加一些相对位置(例如,(0,0) 表示健康栏,(0,32) 表示耐力栏等)。

我建议您查看其他游戏引擎如何处理 GUI。 Unity 使用锚点。 Godot 使用容器。尝试重新创建一个您喜欢的系统。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?