1

私のクラスには、2 つの画像をロードする関数がありますが、特定の条件に基づいて 1 回しか表示されません。

問題は、条件の前に最初に画像をロードする必要があることです。これはメインループで発生しています。そして、それが賢明かどうかわからないので、もう少しエレガントにするために何ができるのか疑問に思っていました....

これは私が持っているものです:


Main Loop:

btn_quit.RenderBttn(window,mouseX,mouseY);

Class function

void RenderBttn(sf::RenderWindow &destination,int mouseX, int mouseY)
{

    std::string img = "button.png";
    sf::Texture button;
    if (!button.loadFromFile(img)){
      exit(4);
    }

    std::string img_on = "button_on.png";
    sf::Texture button_on;
    if (!button_on.loadFromFile(img_on)){
      exit(5);
    }

    sf::Sprite sprite(button);
    m_w = sprite.getLocalBounds().width; //get dimensions
    m_h = sprite.getLocalBounds().height; //get dimensions

    sf::Sprite result(IsIn(mouseX,mouseY) ? button_on : button);    //check if mouse is over the button 
    result.setPosition(m_x,m_y);
    destination.draw(result);
}

私が持っていた1つの解決策は、固定数のボタンサイズを使用することでしたが、後で画像サイズを変更する機能が制限されました.

しかし、毎回メインループに2つの画像をロードしていますが、これは確かにパフォーマンスに悪いですか?

あなたが助けてくれることを願っています:)

4

2 に答える 2

2

あなたがすべきことは、ロードされた画像をメインループでアクセスできる変数として保存することです。たとえば、メインループがクラス内にある場合は、それにsf::Texture button;メンバー変数を追加します。プログラムをロードするときは、これら2つのイメージをロードします。その後、ループの反復ごとにチェックを実行して、それらを描画するかどうかを確認できます。ここで重要なのは、一度ロードしてメモリに保存し、必要なときに使用することを選択することです。プレイするほとんどのゲームで、通常はマップの開始時に、テクスチャ、サウンドなどのすべてのリソースが「ロード画面」にロードされ、使用されるまでその時点でメモリに保持されます(注意しないでください)。すべてのゲームはこのようなものですが、それは単なる例です)。

于 2012-11-07T00:30:28.663 に答える
0

最初に条件をテストしてから画像を読み込んでみませんか?例えば、

編集:メインループからロードを引き出す必要があります。クラスに2つのボタン変数があり、コンストラクターに次のコードを配置します。

if (button.loadFromFile("button.png")) {
  exit(4);
}

if (button_on.loadFromFile("button.png")) {
  exit(4);
}

メインループでは、ファイルを何度もロードする必要はありません。

于 2012-11-07T00:32:46.103 に答える