2017-08-27 106 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