2017-08-27 11 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; 
} 

出力は次のとおりです。ウィンドウの一部だけが実際に描かれている理由 enter image description here私のスプライトがSFMLのウィンドウ全体に描画されないのはなぜですか?私は、次のプログラムのために取得しています

私は理解していません。プログラムは非常に小さいので、高さと幅の変数を切り替えることによって問題が生成されることは通常のように推測されますが、両方が等しいのでここではそうではありません。

SFMLドキュメントでは、明示的にテクスチャのサイズをsprite.setTexture()に設定していないと、テクスチャのサイズがデフォルトになります。

なぜこの奇妙な動作ですか?何か不足していますか?

答えて

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

あなたのピクセルバッファのサイズheight * width * 4のですが、あなただけのi < height * widthながらループしています。 forループの条件をi < height * width * 4に変更します。実際には、その値を格納する別の変数を宣言すると、コードをもっとはっきりさせることができます。すなわち

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

また、私は4ではなく1をインクリメントしています。 – user45914123

+0

@ 123:はい。私はそれを観た。それは正しいです。 –

+0

質問を削除する必要がありますか?これは小さな問題だったので。 – user45914123

関連する問題