【问题标题】:Why my sprite is not drawn on the whole window in SFML?为什么我的精灵没有绘制在 SFML 的整个窗口上?
【发布时间】:2018-02-05 03:40:16
【问题描述】:
#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() 中,它将默认为纹理的大小。

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

【问题讨论】:

    标签: c++ graphics sfml


    【解决方案1】:
    for(int i = 0; i < height * width; i+= 4)
    

    您的像素缓冲区大小为height * width * 4,但您仅在i &lt; height * width 时循环。将 for 循环中的条件更改为 i &lt; 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...
    

    【讨论】:

    • 我也增加了 4 而不是 1。
    • 我应该删除问题吗?因为这是一个小问题。
    • @123:不,大多数问题都属于“小问题”的范畴。除非是拼写错误,并且您打算输入 height * width * 4,但没有注意到您遗漏了 4。
    • 不,不是错字。我认为如果我放 *4 会导致溢出错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-27
    相关资源
    最近更新 更多