#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;
}
我不明白为什么实际上只绘制了窗口的某些部分。由于程序非常小,我会常常猜测问题是通过切换高度和宽度变量来创建的,但这不是这里的情况,因为两者都是相同的。
SFML文档说如果我没有明确地将纹理的大小放在sprite.setTexture()
中,它将默认为纹理的大小。
为什么这种奇怪的行为?我错过了什么吗?
答案 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...