【问题标题】:Drawing in the main window from another class with SFML使用 SFML 从另一个类在主窗口中绘图
【发布时间】:2026-02-14 23:30:01
【问题描述】:

我需要一些帮助,因为我正在尝试制作俄罗斯方块游戏,这是我的第一个 C++ 项目,但我遇到了一些问题。

我想将主窗口声明保留在主文件中,并在同一窗口上从 BoxRenderer 类中绘制所有 Tetrominos、背景等。

但是我的 Sprite 没有显示,我有一个黑屏,这是我的代码:

main.cpp:

// SpaceOdyssey.cpp : définit le point d'entrée pour l'application console.
//

#include "stdafx.h"
#include <iostream>
#include <SFML/Graphics.hpp>
#include "BoxRenderer.h"

using namespace std;

int main()
{
    sf::RenderWindow window(sf::VideoMode(200, 280), "Tetris-like by Orionss");
    sf::Texture bgTexture;

    if (!bgTexture.loadFromFile("sprites\\background.png"))
        return EXIT_FAILURE;

    BoxRenderer renderer(bgTexture);

    while (window.isOpen())
    {
        sf::Event event;

        while (window.pollEvent(event))
            if (event.type == sf::Event::Closed)
                window.close();

        window.clear();
        renderer.render(window);
        window.display();
    }

    return 0;
}

BoxRenderer.cpp:

#include "stdafx.h"
#include "BoxRenderer.h"

BoxRenderer::BoxRenderer(sf::Texture bgTexture)
{
    m_bgTexture = bgTexture;
}

void BoxRenderer::render(sf::RenderWindow& win)
{
    m_bgTexture.update(win);
    sf::Sprite background(m_bgTexture);
    win.draw(background);
}

【问题讨论】:

    标签: c++ sfml


    【解决方案1】:

    来自void sf::Texture::update(const Window &amp;window) reference

    从窗口内容更新纹理。

    在那之前你正在清除窗口,这会覆盖你的纹理,所以它是完全黑色的。你根本不想打电话给m_bgTexture.update(win);

    【讨论】:

    • 就是这样!我不太了解更新功能,所以现在可以了。谢谢你:)