1

問題が発生しました。描画ループでスプライトを描画しようとすると、描画されません。このクラスのコンストラクターでは、スプライトを設定しています。

私が持っているコンストラクター:

texture.loadFromFile("img1.png");
sprite.setTexture(texture);

スプライトとテクスチャはヘッダーファイルにあります

いくつかの実験を行いtexture.loadFromFile();ましたが、描画ループで使用すると機能します。しかし、その後、1秒間に60回画像を「リロード」する必要があります。

void PlayerReceiver::draw(sf::RenderWindow & rw){
        //texture.loadFromFile("mario.png");

        //std::cout<<texture.getSize().y<<std::endl;

            rw.draw(sprite);

    }

回答ありがとうございます。

4

2 に答える 2

1

問題が発生しました。描画ループでスプライトを描画しようとすると、描画されません。このクラスのコンストラクターでは、スプライトを設定しています。

この質問から私が理解していることから、コンストラクター内にテクスチャとスプライトをロードしたいのですが、描画ループから描画しようとすると機能しません。

私はコンストラクターにテクスチャーをロードするプログラムを持っていて、それはうまく動作するので、私が想像するのは間違っています(そして、上の投稿にあなたのプログラムの6行が表示されていないのでわかりません)スプライトオブジェクトはクラスレベルで定義されていません。

使用しているテクスチャオブジェクトのヘッダーファイルは次のとおりです。

class GraphPaper
{
    public:
        GraphPaper();
        ~GraphPaper();
        bool isObjectLoaded();
        sf::Sprite getSprite();

    private:
        void load(std::string filename);
        bool isLoaded;

        sf::Texture texture;
        sf::Sprite sprite;

        const std::string file = "images/Graph-Paper.png";
};

テクスチャオブジェクトとスプライトオブジェクトは、クラス全体のレベルでプライベートメンバーとしてリストされ、getterメソッドを介してアクセスされます。

そして、これがそのクラスのコンストラクターです(あなたがやりたいこととよりよく一致するように少し変更されました):

#include "GraphPaper.h"

GraphPaper::GraphPaper() //: isLoaded(false)
{
    if (texture.loadFromFile(file) == false)
        isLoaded = false;
    else
    {
        texture.setRepeated(true);
        sprite.setTexture(texture);
        isLoaded = true;
    }
    //load(file);
    assert(isObjectLoaded());
}

この後、「GraphPaper」オブジェクトを描画するだけです。

mainWindow.draw(paper.getSprite());

MainWindowヘッダーファイルで「paper」という「GraphPaper」オブジェクトを定義したので、すでにアクセスできます。

#pragma once
#include "GraphPaper.h"
#include "stdafx.h"

class MainWindow
{
    public:
         void close();
         void start();
         void moveCamera(sf::Event);

    private:
        bool leftMousePressed, rightMousePressed, isExiting;
        int r, g, b, mouseX, mouseY;

        GraphPaper paper;

        const sf::Color white = sf::Color(255, 255, 255);

        sf::RenderWindow mainWindow;
        sf::View view;
};

これがあなたがやりたいことであると仮定すると、あなたの問題はおそらくヘッダーファイルにあります。クラスレベルで定義されたオブジェクトは、一度ロードされると、クラス自体が破棄されるまで破棄されません。コンストラクターが含まれているクラスへの参照を破棄していないことを確認する必要があるかもしれません。たとえば、ループ内にクラスのインスタンスを作成すると、ループが終了した瞬間にクラスオブジェクトが破棄されます。

于 2016-04-28T00:21:04.977 に答える
0

ただの仮定:あなたはあなたのコンストラクターにこれを持っています:

PlayerReceiver::PlayerReceiver()
{
    sf::Texture texture;
    texture.loadFromFile("img1.png");
    sprite.setTexture(texture);
}

このようにして、コンストラクターが終了した直後にテクスチャオブジェクトが破棄されます。とは両方ともクラスのメンバーでspriteあるtexture必要があります。これにより、プレーヤー自体が破壊されるまで破壊されません。

これが問題ではない場合は、さらにコードを投稿してください。

于 2012-12-15T16:43:30.797 に答える