2017-08-27 1 views
0
#include<SFML/Window.hpp> 
#include<SFML/Graphics.hpp> 
#include<cstdint> 
#include<iostream> 

const int width = 500; 
const int height = 500; 

int main(){ 
    sf::RenderWindow window(sf::VideoMode(width, height), "Window", sf::Style::Close); 
    window.setVerticalSyncEnabled(true); 

    sf::Event event; 

    uint8_t *pixels = new uint8_t[height *width *4]; 

    for(int i = 0; i < height * width; i+= 4){ 
     pixels[i] = 00; //r 
     pixels[i + 1] = 00;//g 
     pixels[i + 2] = 00;//b 
     pixels[i + 3] = 255;//a 
    } 

    sf::Texture texture; 
    texture.create(width, height); 

    sf::Sprite sprite; 

    while(window.isOpen()){ 
     while(window.pollEvent(event)){ 
      if(event.type == sf::Event::Closed){ 
       window.close(); 
      } 
     } 

     window.clear(sf::Color::White); 

     texture.update(pixels); 
     sprite.setTexture(texture); 

     window.draw(sprite); 
     window.display(); 
    } 

    delete pixels; 
    return 0; 
} 

Der Ausgang I für folgendes Programm bin immer ist: enter image description hereWarum wird mein Sprite in SFML nicht auf das gesamte Fenster gezeichnet?

Ich verstehe nicht, warum nur ein Teil des Fensters tatsächlich gezogen wird. Da das Programm sehr klein ist, würde ich normalerweise vermuten, dass das Problem durch das Umschalten der Variablen Höhe und Breite erzeugt wird, aber das ist hier nicht der Fall, da beide gleich sind.

Die SFML-Dokumentation sagt, dass, wenn ich nicht explizit die Größe der Textur in sprite.setTexture() setzen wird es standardmäßig auf die Größe der Textur.

Warum ist dieses seltsame Verhalten? Fehle ich etwas?

Antwort

2
for(int i = 0; i < height * width; i+= 4) 

Ihr Pixelpuffer ist von Größe height * width * 4, aber Sie sind Looping nur während i < height * width. Ändern Sie die Bedingung in Ihrer for-Schleife in i < height * width * 4. Tatsächlich würde es Ihren Code viel klarer machen, wenn Sie eine andere Variable deklarierten, um diesen Wert zu speichern. d.h.

int pixel_buffer_size = width * height * 4; 
uint8_t *pixels = new uint8_t[pixel_buffer_size]; 

for(int i = 0; i < pixel_buffer_size; i+= 4) { 
    etc... 
+0

Ich bin auch inkrementieren um 4 nicht 1. – user45914123

+0

@ 123: Ja. Das habe ich gesehen. Das ist richtig. –

+0

Sollte ich die Frage löschen? Weil das ein kleines Problem war. – user45914123

Verwandte Themen