【问题标题】:std::unique_ptr interfering with certain sf::RenderWindow functions?std::unique_ptr 干扰某些 sf::RenderWindow 函数?
【发布时间】:2016-08-21 18:05:35
【问题描述】:

sf::RenderWindow::getPosition() 总是返回0, 0,而不是当我从创建窗口的同一范围调用它时返回正确的位置。

这是重现问题的示例代码:

#include <iostream>
#include <memory>
#include <SFML/Graphics.hpp>

int main() {
  std::unique_ptr<sf::RenderWindow> window_;

  window_ = std::unique_ptr<sf::RenderWindow>(
    new sf::RenderWindow(sf::VideoMode(800, 600), "asd", sf::Style::Default)
  );
  window_->setFramerateLimit(30);
  window_->setVerticalSyncEnabled(false);

  while (window_->isOpen()) {
    sf::Event evt;
    while (window_->pollEvent(evt)) {
      if (evt.type == sf::Event::Closed) { window_->close(); }
    }
    window_->clear();
    window_->display();
  }

  const sf::Vector2i wpos = window_->getPosition();
  std::cout << "window position: " << wpos.x << "/" << wpos.y <<std::endl;

  return 0;
}

问题是:例如,我有一个类MainMenu,我将sf::RenderWindow * 传递给它(带有window_.get())。

当我从MainMenu 调用window_-&gt;getPosition() 时,它会报告正确的位置,所以getPosition() 本身没有故障。只有当我在同一范围内(在 main 中)调用它时才会出错。

顺便说一下,我使用的是 SFML 2.3.1

【问题讨论】:

  • 你应该同时构造unique_ptr并初始化它:unique_ptr&lt;sf::RenderWindow&gt; window_(new sf::RenderWindow(sf::VideoMode(800, 600), "asd", sf::Style::Default));
  • 我知道,但这只是一个示例代码。在我的真实游戏中,unique_ptr 是一个类成员变量,我稍后会构建窗口
  • 顺便说一句,不需要new RenderWindow

标签: c++ pointers sfml smart-pointers unique-ptr


【解决方案1】:

您正在对while (window_-&gt;isOpen()) 进行循环后打印窗口位置。这意味着窗口已关闭,即当您调用 getPosition() 时它不存在。因此,没有“正确”报告窗口位置也就不足为奇了,因为窗口已经关闭(永久关闭,因此没有位置)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    • 2018-02-26
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多