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

相关问题