为什么我的精灵没有在SFML的整个窗口中绘制?

时间:2017-08-27 21:03:08

标签: c++ graphics sfml

#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文档说如果我没有明确地将纹理的大小放在sprite.setTexture()中,它将默认为纹理的大小。

为什么这种奇怪的行为?我错过了什么吗?

1 个答案:

答案 0 :(得分: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...
相关问题