2017-10-27 4 views
0

を表示していないし、私はこの問題を解決することはできません。私は動作し、私のスプライトを表示する必要がありますが、画面上に何も表示されない2つのクラスがあります。私はいくつかのことを試してみましたが、それらのどれも私がここに頼むことにしました理由です、これまで働いていない:あなたの助けのいずれかのために/SFMLは、私が最近SFMLで作業を開始したスプライト

おかげで、チップも理解されるであろう;)

メイン。 CPP:

#include <SFML\Graphics.hpp> 
#include "Player.hpp" 

sf::RenderWindow frame; 
sf::Texture player_texture; 
Player player(player_texture, 100, 100); 
bool quit; 

bool handle_events() { 
    sf::Event event; 
    if (frame.pollEvent(event)) { 
     if (event.type == sf::Event::Closed) { 
      return true; 
     } 
    } 
    return false; 
} 

void update() { 

} 

void render() { 
    frame.clear(sf::Color(127, 142, 123)); 
    player.draw_player(frame); 
    frame.display(); 
} 

void run() { 
    while (quit != true) { 
     quit = handle_events(); 
     update(); 
     render(); 
    } 
} 

int main() { 
    player_texture.loadFromFile("player.png"); 
    frame.create(sf::VideoMode(800, 600), "frame"); 

    run(); 

    return 0; 
} 

Player.cpp:

#include "Player.hpp" 

Player::Player(sf::Texture & player_texture, int pos_x, int pos_y) { 
    player_sprite.setTexture(player_texture); 
    player_sprite.setPosition(pos_x, pos_y); 
    player_sprite.scale(4, 4); 
} 

void Player::draw_player(sf::RenderWindow & frame) { 
    frame.draw(player_sprite); 
} 

Player.hpp:

#ifndef Player_hpp 
#define Player_hpp 

#include <SFML\Graphics.hpp> 
#include <iostream> 

class Player 
{ 
private: 
    sf::Sprite player_sprite; 
public: 
    Player::Player(sf::Texture & player_texture, int pos_x, int pos_y); 
    void Player::draw_player(sf::RenderWindow & frame); 
}; 

#endif 
+0

「プレーヤー」はどこに作成されていますか?そのテクスチャに価値を与えるコンストラクタ内にあり、呼び出された場所がわかりません。 – alseether

答えて

1

あなたのプレーヤースプライトは、空のテクスチャで初期化されます。次に、別の画像をテクスチャにロードすると、プレーヤスプライトはこれを認識しません。スプライトがテクスチャ上に作成したすべての計算(たとえばサイズ)は現在無効です。

テクスチャをロードしてからの前にスプライトに渡すようにしてください。それ以降は変更しないでください。

0

テクスチャが正しく読み込まれていますか?テストする戻り値sf::Texture::loadFromFileを確認してください。

よりオーバー、なぜあなたのクラスPlayersf::Spriteから延びていないのですか?私は、このケースでは、継承がより充実していると考えています。ユーザーがウィンドウを閉じたいとき

また、あなたの関数のhandle_eventsに、あなたは直接メソッドRenderWindow::closeを呼び出すことができます。その後、関数の実行で、RenderWindow::isOpenに電話して、アプリを続行できるかどうかを確認します。これは、この醜い初期化されていないquit変数よりも、あまり汚いことはありません。

+0

この回答のほとんどは、質問とあなたの意見(回答ではなくコメントでなければならない)についてのあなたの意見ですが、本当に質問に答えたり、問題を解決したりしていません。 – Eddge

+1

これは質問に対する答えを提供しません。批評をしたり、著者の説明を求めるには、投稿の下にコメントを残してください。 - [レビューの投稿](/レビュー/低品質の投稿/ 17793632) – Alejandro

0

nvoigtは完全に右です。

あなたが最初に(プレイヤーのコンストラクタで)スプライトのテクスチャを設定し、(メイン機能で)後でそれをロードします。

... 
player_sprite.setTexture(player_texture); 
... 
player_texture.loadFromFile("player.png"); 
... 

あなたはどちらかのメイン内部.setTextureで再びテクスチャをリロードする必要があります機能後に読み込まれます。または、コードを再構成する必要があります。ところで

は、このif (frame.pollEvent(event))は良いアイデアではありません。 フレーム上で複数のイベントが発生している可能性があります。たとえば、マウスの移動やウィンドウの終了などです。 ifでは、2番目のイベントを探していたとしても、このフレームの最初のイベント(マウスの動きのみ)を処理します。したがって、すべてのイベントが処理されていることを確認するためにしばらく(while (frame.pollEvent(event)))する必要があります。