2016-06-28 4 views
0

起動時にすべてをロードするのではなく、起動時に必要なリソースだけをロードし、使用する必要がある場合にのみ個々のリソースをロードできますか?プログラムの実行中にSprites、Textures、Musicを関数経由でロードすることは可能ですか?

どうすればいいですか?

私はC++/SFMLを試してみましたが、これを試してみるとエラーになります。起動時に一度にすべてを読み込む必要がないようにしたいのは、スタートアップ時にプログラムを30秒間白い画面に表示するので、画面がはるかに速くなることが望ましいからです。明確にするため

、私は、sf::Textureを参照sf::Spritesf::Music、などだ

UPDATE:ここではいくつかのコードが

#include "SFML/Audio.hpp" 
#include "SFML/Graphics.hpp" 
#include <iostream> 


void loadResources(); 

int main() 
{ 


//create the main window 
sf::RenderWindow window(sf::VideoMode(720, 500), "Sky Ocean"); 
window.setFramerateLimit(60); 
window.setKeyRepeatEnabled(false); 

//View 
sf::View view1(sf::FloatRect(200, 200, 300, 200)); 
view1.setSize(sf::Vector2f(window.getSize().x, window.getSize().y)); 
view1.setCenter(sf::Vector2f(view1.getSize().x/2, view1.getSize().y/2)); 
window.setView(view1); 

//load resources 
loadResources(); 

//npc object 
class npc npc1; 
npc1.sprite.setTexture(textureNPC); 

class npc npc2; 
npc2.sprite.setTexture(textureNPC2); 

class npc npc3; 
npc3.sprite.setTexture(textureNPC3); 

class npc npc4; 
npc4.sprite.setTexture(textureNPC4); 

あなたが見ることができるように、私はテクスチャを設定する前に関数を呼び出しますが、私はまだエラーが発生します。

void loadResources() 
{ 
//load npc texture 
sf::Texture textureNPC; 
if (!textureNPC.loadFromFile("images/npc.png")) 
    return EXIT_FAILURE; 

sf::Texture textureNPC2; 
if (!textureNPC2.loadFromFile("images/npc2.png")) 
    return EXIT_FAILURE; 

sf::Texture textureNPC3; 
if (!textureNPC3.loadFromFile("images/npc3.png")) 
    return EXIT_FAILURE; 

sf::Texture textureNPC4; 
if (!textureNPC4.loadFromFile("images/npc4.png")) 
    return EXIT_FAILURE; 
} 

「宣言されていない識別子」というエラーが表示されます。どうすればこの作品を作れますか?

+0

なぜできないのですか?あなたのプログラムがすべてのリソースをロードするために30秒かかる場合、おそらく何か間違っているでしょう。 – Taywee

+0

これを変更して動作させるにはどうすればよいですか? – anarchyistheanswer

答えて

0

問題は、読み込み機能でtextureNPCを宣言していることです。それが終わると、彼らは範囲外になり、もはや存在しません。 SFMLのようなライブラリを学ぶ前に、基本を学ぶ必要があります。 問題を解決するには、同じ範囲になるように物事を再構成します。あなたは、クラス/構造体を介して、または関数への参照/ポインタを渡すことによってそれを行うことができます。

注:

あなたは代わりに白い画面の楽しい何かを表示することができます - それはあなたのessentialyロード画面です。

シェーダを再コンパイルするときに、Direct3D(DirectXレンダラ)でコンテキストを再作成する必要があることに注意してください。 SFMLはそれを処理すべきだと思うが、副作用があるかもしれない。

struct Resources 
{ 
    sf::Texture textureNPC; 
    sf::Texture textureNPC2; 
    sf::Texture textureNPC3; 
    sf::Texture textureNPC4; 

    Resources() 
    { 
     //load npc texture 
     if (!textureNPC.loadFromFile("images/npc.png")) 
     return EXIT_FAILURE; 

     if (!textureNPC2.loadFromFile("images/npc2.png")) 
      return EXIT_FAILURE; 

     if (!textureNPC3.loadFromFile("images/npc3.png")) 
      return EXIT_FAILURE; 

     if (!textureNPC4.loadFromFile("images/npc4.png")) 
      return EXIT_FAILURE; 
    } 
} 
+0

コードとエラー情報 – anarchyistheanswer

+1

でアップデートしました。それに応じて私の答えを編集しました。 –

+0

@IvanRubinson SFMLはDirectXのOpenGLでは動作しません。しかし、あなたの答えの要点は正しいです! – Hiura

関連する問題