SFML: Problem mit Sprites (nur 3 Sprites werden angzeigt)



  • Hi,

    ich habe ein Problem mit SFML 2. Es werden immer nur 3 Sprites gezeichnet.

    int main(int argc, char **argv) {
    	sf::RenderWindow w(sf::VideoMode(800, 600, 32), "Test");
    	sf::Texture tex;
    	tex.loadFromFile("Test.bmp");
    	while(w.isOpen() ) {
    		for(sf::Event e; w.pollEvent(e); ) {
    			switch(e.type) {
    				case sf::Event::Closed:
    					w.close();
    					break;
    			}
    		}
    		w.clear(sf::Color::White);
    		sf::Sprite s(tex);
    		for(std::size_t y = 0; y < 3; ++y) {
    			for(std::size_t x = 0; x < 2; ++x) {
    				s.setPosition(x * 32, y * 32);
    				w.draw(s);
    			}
    		}
    		w.display();
    	}
    }
    

    Egal welche Zahlen man für die Vergleiche bei den Schleifen einsetzt, es werden immer nur die ersten drei Sprites gezeichnet. Wenn man z.B y < 2 und x < 2 nimmt, werden 2 Sprites auf der ersten Zeile und ein Sprite auf der zweiten Zeile gezeichnet. Ich habe schon verschiedene Bildformate probiert (tga, bmp, png). Hat jemand eine Ahnung, woran das liegen könnte? Bei Bedarf kann ich auch noch meine Bilddatei (ist bloß ein rotes 32x32 Pixel Quadrat) hochladen.



  • Outch...
    Benutze am besten einfach Container, dann sieht es
    zum einen viel ordentlicher und lesbarer aus und wird dazu auch noch sicher funktionieren...

    Das könnte dann z.B so aussehen:

    sf::Sprite s(tex);
    
    std::vector<sf::Sprite> spriteVector;
    
    // Zum Container hinzufügen
    
    for(int i = 0; i < NUMBER_OF_SPRITES; i++)
    {
       spriteVector.push_back(s);
    }
    
    // Positionieren
    
    for(unsigned int i = 0; i < spriteVector.size(); i++)
    {
       for(int y = 0; y < 3; ++y) 
       {
          for(int x = 0; x < 2; ++x) 
          {
              spriteVector.at(i).setPosition(x * 32, y * 32);
              i++;
          }
       }
    }
    
    // Und dann nur noch zeichnen
    
    for(std::vector<sf::Sprite>::iterator it = spriteVector.begin(); it != spriteVector.end(); ++it)
    {
       w.draw(*it);
    }
    

    Btw.:
    Du solltest auf die Warnungen, die dir dein Compiler ausspuckt hören! 🙂

    MfG Usama



  • Mein Compiler gibt mit -Wall -Wextra -Werror -pedantic-errors -Wno-error=unused-variable -Wno-error=unused-parameter keine Fehler/Warnungen aus. Außerdem habe ich das mit dem Container schon probiert, selber Effekt.

    Edit: Übrigens, dein Code macht etwas anderes als mein Code.
    Edit2: Heute bekomme ich einen anderen Effekt, und zwar wird NUR das 3. Sprite gezeichnet. Seltsam ...



  • Ich habe jetzt nochmal die Schleife von Hand "un-rolled" und auch für jedes Sprite ein extra sf::Texture Objekt verwendet. Selber Effekt. Allerdings habe ich festgestellt, das wenn ich den w.clear() Aufruf rausnehme, wieder der ersten 3 Sprites gezeichnet werden (nicht nur das Dritte). Mit sf::RectangleShape funktioniert der Code übrigens.

    Edit: Sieht mir sehr nach einem Bug in SFML 2 aus. Mit SFML 1.6 funktioniert es.
    Edit2: Ich teste mal den Treiber von NVidia statt Nouveau.



  • Ok, es scheint ein Bug im Nouveau Treiber zu sein. Ich habe jetzt den proprietären Treiber installiert und alles funktioniert.


Anmelden zum Antworten