3

画面に 10 個のブロックを描画するループを作成しようとしていますが、何も表示されません。エラーが発生しなかったので、ベクトルにスプライトが格納されていないと思います。私はSFMLを初めて使用するので、何が間違っているのかよくわかりません。

sf::Texture bTexture;
sf::Texture bloqueTexture;
sf::Sprite bloqueSprite;

//create vector of blocks
std::vector<sf::Sprite> bricks(10, sf::Sprite(bloqueTexture));

fondo.setTexture(img_mgr.getImage("fondo.jpg"));
personaje.setTexture(img_mgr.getImage("jumper.png"));
personaje.setPosition(100,POSICION_TERRENO_Y);
bloqueSprite.setTexture(img_mgr.getImage("bloque.png"));
bloqueTexture.loadFromFile("Recursos/imagenes/bloque.png");

//Fill the vector with the texture
for (int i = 0; i < bricks.size(); i++)
{
    bricks[i].setTexture(bloqueTexture);
    bricks[i].setPosition(100 + (i * 45) , 320);
    window.draw(bricks[i]);
}
4

2 に答える 2

2

最終回答付きの2回目の編集: SFMLでファイルを表示したい場合はpng、8ビットで保存してください。

編集: 2番目のコードに悪いコピー/貼り付けがありました。修正しました

SFML はマルチ メディア アプリケーション (主にゲーム) 用に作成されているため、1 秒間に何度も更新して画面に描画する必要があります (つまりframes)。そうは言っても、基本的なアプローチは、入力の処理、ゲーム ロジックの更新、描画の 3 つのことを行うメイン ループを用意することです。

SFML の Web サイトの古典的な例を参照してください。

#include <SFML/Graphics.hpp>

int main()
{
    sf::RenderWindow window(sf::VideoMode(200, 200), "SFML works!");
    sf::CircleShape shape(100.f);
    shape.setFillColor(sf::Color::Green);

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

        window.clear();
        window.draw(shape);
        window.display();
    }

    return 0;
}

テクスチャのロードとベクトルの塗りつぶしは、メイン ループの前に実行する必要がwindow.clear()あります。次に、window.display表示するすべてのもの (ブロック) を描画する必要があります。

あなたはこのようなものになるかもしれません:

#include <SFML/Graphics.hpp>

int main()
{
    sf::RenderWindow window(sf::VideoMode(200, 200), "SFML works!");

    sf::Texture bTexture;
    sf::Texture bloqueTexture;
    sf::Sprite bloqueSprite;

    //create vector of blocks
    std::vector<sf::Sprite> bricks(10, sf::Sprite(bloqueTexture));

    fondo.setTexture(img_mgr.getImage("fondo.jpg"));
    personaje.setTexture(img_mgr.getImage("jumper.png"));
    personaje.setPosition(100,POSICION_TERRENO_Y);
    bloqueSprite.setTexture(img_mgr.getImage("bloque.png"));
    bloqueTexture.loadFromFile("Recursos/imagenes/bloque.png");

    for (int i = 0; i < bricks.size(); i++)
    {
        bricks[i].setTexture(bloqueTexture);
        bricks[i].setPosition(100 + (i * 45) , 320);
    }

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

        window.clear();
        for (int i = 0; i < bricks.size(); i++)
        {
            window.draw(bricks[i];
        }
        // Consider doing this :
        // for(const auto& brick : bricks)
        //    window.draw(brick);

        window.display();

    }

    return 0;
}
于 2013-06-04T21:37:38.323 に答える
2

テクスチャの読み込みに問題があると思います。loadFromFile 関数が true を返すかどうかを確認してください。

于 2013-06-04T21:35:03.237 に答える