2017-01-24 10 views
0

昨日のSFMLスムーズな動きについてquestionに尋ねましたが、その問題は解決されましたが、今回使用しているスプライトは白い四角形として表示されています。SFMLスプライト白い四角

私はリファレンスとしてdrawship関数にスプ​​ライトを送信しようとしているが、私はmain.cppにその機能を使用していますので、私はthis answerに語られている何をすることはできませんよ。だから私はこの問題をどのように修正できるのだろうかと思っています。

main.cppに

#include <SFML/Audio.hpp> 
#include <SFML/Graphics.hpp> 
#include "Spaceship.hpp" 
#include <vector> 

#include "ResourcePath.hpp" 

int main(int, char const**) 
{ 

    // Create the main window 
    sf::RenderWindow window(sf::VideoMode(800, 600), "SpaceShuttle"); 
    window.setFramerateLimit(30); 
    // Call to non-static member function without an object argument 
    // Set the Icon 
    sf::Image icon; 
    if (!icon.loadFromFile(resourcePath() + "space-shuttle.png")) { 
     return EXIT_FAILURE; 
    } 
    window.setIcon(icon.getSize().x, icon.getSize().y, icon.getPixelsPtr()); 

    // Load a sprite to display 
    sf::Texture texture; 
    if (!texture.loadFromFile(resourcePath() + "bg.png")) { 
     return EXIT_FAILURE; 
    } 
    sf::Sprite sprite(texture); 

    // Create a graphical text to display 
    sf::Font font; 
    if (!font.loadFromFile(resourcePath() + "sansation.ttf")) { 
     return EXIT_FAILURE; 
    } 
    sf::Text text("SpaceShuttle K1LLM33K", font, 50); 
    text.setFillColor(sf::Color::White); 
    text.setPosition(100.0, 130.0); 


    // Load a music to play 
    /* sf::Music music; if (!music.openFromFile(resourcePath() + "nice_music.ogg")) { return EXIT_FAILURE; } 
    // Play the music 
    music.play(); 
    */ 

    Spaceship spaceship(window); 
    sf::Clock sf_clock; 


    // Start the game loop 
    while (window.isOpen()) { 
     // Get time elapsed since last frame 
     float dt = sf_clock.restart().asSeconds(); 

     // Process events 
     sf::Event event; 
     while (window.pollEvent(event)) { 
      // Close window: exit 
      if (event.type == sf::Event::Closed) { 
       window.close(); 
      } 

      // Escape pressed: exit 
      if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Escape) { 
       window.close(); 
      } 


     } 
     //move spaceship 
     if(sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) { spaceship.moveship(dt, 'l'); } 
     else if(sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) { spaceship.moveship(dt, 'r'); } 
     else if(sf::Keyboard::isKeyPressed(sf::Keyboard::Up)) { spaceship.moveship(dt, 'u'); } 
     else if(sf::Keyboard::isKeyPressed(sf::Keyboard::Down)) { spaceship.moveship(dt, 'd'); } 
     // Clear screen 
     window.clear(); 

     // Draw the sprite(s) 
     window.draw(sprite); 
     // 
     // To draw the Spaceship 
     // 
     spaceship.drawsprite(window); 

     // Draw the string(s) 
     window.draw(text); 

     // Update the window 
     window.display(); 
    } 

    return EXIT_SUCCESS; 
} 

spaceship.cpp

#include <SFML/Audio.hpp> 
#include <SFML/Graphics.hpp> 
#include "ResourcePath.hpp" 
#include "Spaceship.hpp" 

Spaceship::Spaceship(sf::RenderWindow& game_window){ 
    auto surface = game_window.getSize(); 
    ss_x = ss_y = 0.5f; 
    ss_speed_x = 250.f/surface.x; 
    ss_speed_y = 250.f/surface.y; 
    ss_width = 128; 
    ss_height = 128; 
    ss_radius = ss_width/2; 

    sf::Texture ship; 
    if (!ship.loadFromFile(resourcePath() + "space-shuttle-64.png")) { 
     return EXIT_FAILURE; 
    } 

    ss_sprite = sf::Sprite(ship); 
    ss_sprite.setOrigin(ss_width/2, ss_height/2); 

} 


void Spaceship::drawsprite(sf::RenderWindow& game_window){ 
    auto size = game_window.getSize(); 
    ss_sprite.setPosition(ss_x * size.x, ss_y * size.y); 
    game_window.draw(ss_sprite); 
} 

void Spaceship::moveship(float dt, char move){ 
    switch (move) { 
     case 'l': ss_x -= dt * ss_speed_x; break; 
     case 'r': ss_x += dt * ss_speed_x; break; 
     case 'u': ss_y -= dt * ss_speed_y; break; 
     case 'd': ss_y += dt * ss_speed_y; break; 
    } 
} 

Spaceship::~Spaceship(){} 

spaceship.hpp

#ifndef Spaceship_hpp 
#define Spaceship_hpp 
#include <iostream> 
#include <SFML/Audio.hpp> 
#include <SFML/Graphics.hpp> 
#include <stdio.h> 

using namespace std; 

class Spaceship { 
public: 
    Spaceship(); 
    Spaceship(sf::RenderWindow&); 
    ~Spaceship(); 
    void moveship(float, char); 
    void drawsprite(sf::RenderWindow&); 
private: 
    float ss_x, ss_y; 
    float ss_speed_x, ss_speed_y; 
    int ss_width, ss_height, ss_radius; 
    sf::Sprite ss_sprite; 

}; 

#endif /* Spaceship_hpp */ 
+0

'sf :: Texture ship;は' Spaceship'のコンストラクタに対してローカルです。あなたはそれをより広い範囲で宣言する必要があります。その寿命は、少なくとも宇宙船の寿命以上です。 – Quentin

+0

あなたはそれをより広い範囲でデカールしますか? –

答えて

2

to the docsをよると、「質感は限りスプライトがそれを使用して存在している必要があります。実際、スプライトはテクスチャのコピーを保存していないので、ちょうどsf::TextureをコンストラクタからSpaceshipのメンバに変更する必要があります。

class Spaceship { 
    // Some stuff 
    sf::Texture ss_ship_texture; 
}; 

Spaceship::Spaceship(const sf::RenderWindow& window) { 
    // Some stuff 
    ss_ship_texture.loadFromFile("path/to/ship/image"); 
    ss_ship.setTexture(ss_ship_texture); 
} 
+0

私はそれをメンバー関数の中に置いても何度も何度も作成していませんか? –

+0

Thnx alot man:Dこれは今ではうまくいきます。 –

+1

最初の質問では、フレームごとにテクスチャをロードしていましたが、これはひどく非効率的です。これをコンストラクタで行うと、これは一度だけ発生します。これはこの問題に取り組む最も簡単な方法ですが、最もクリーンで賢明ではありません。 Marioが答えて指摘したように、すべての資産を管理するためのリソースマネージャークラスを持つことができます。しかし、あなたのケースでは、コンストラクタでそれを維持すると、十分に簡単で十分です – Zouch

2

白い四角ではなく、あなたのテクスチャは通常、テクスチャ/初期化作成したか、/無効破壊されていないほのめかします。

場合によっては、Spaceshipコンストラクタにテクスチャオブジェクトを作成しています。このオブジェクトは、コンストラクタが完了すると無効になります。 sf::Spriteは、実際のテクスチャのコピーではなく、テクスチャへの参照(ポインタ)を受け取る/格納するだけであることに注意してください。

あなたは外部に保存する必要があります。いくつかのリソースマネージャークラスの一部として、または単純にあなたのSpaceshipコンストラクターに渡します。

関連する問題