SFML Pixel манипулирование - изменение размера одного символа в окне - PullRequest
0 голосов
/ 01 июня 2018

Есть ли способ изменить размер одного пикселя в окне, потому что я бы предпочел работать с одиночными символами консоли, которые имеют размер 8x8, а не 1x1.

1 Ответ

0 голосов
/ 01 июня 2018

Если вы хотите увеличить (или уменьшить) все в окне, проще всего было бы изменить sf::View окна, вызвав sf::RenderWindow::setView():

sf::RenderWindow myWindow(sf::VideoMode(640, 480), "Test");

// Define a view that's 320x240 units (i.e. pixels) in size and is centered at (160, 120)
sf::View myView(sf::Vector2f(160, 120), sf::Vector2f(320, 240));

// Apply the view
myWindow.setView(myView);

После запуска этого кода,все визуализированные в окне будут увеличены в 2 раза (так как вы показываете 320x240 в пределах 640x480).Аналогичным образом вы можете достичь коэффициента масштабирования 8, например, сделав свое окно (800, 800) и установив свой вид на (100, 100).

Однако, в зависимости от того, что вы делаете, вы выигралине получит пиксельный вид.

Если вы хотите создать пиксельную графику с резкими / увеличенными пикселями, я бы рекомендовал просто отрисовать вашу сцену с рендерингом текстуры с желаемым разрешением, а затем рендерить эту текстуру вфактическое окно, масштабированное (и с отключенной фильтрацией):

#include <SFML/Graphics.hpp>

int main(int argc, char **argv) {
    sf::RenderWindow window(sf::VideoMode(800, 600), "Scaling", sf::Style::Default);

    // Set the view to upscale
    // Use 1/8th of the window's size
    sf::View view(sf::Vector2f(50, 37.5f), sf::Vector2f(100, 75));
    window.setView(view);

    // Let's create a render texture as buffer
    // (I'm skipping error checking for simplicity)
    sf::RenderTexture buffer;
    buffer.create(100, 75); // Again 1/8th of the window size

    sf::Sprite bufferSprite(buffer.getTexture());

    // Something to draw
    sf::CircleShape circle(20, 6);
    circle.setFillColor(sf::Color::Transparent);
    circle.setOutlineColor(sf::Color::Black);
    circle.setOutlineThickness(2);
    circle.setOrigin(20, 20); // Move origin to center

    // Let's use a simple sf::Clock to animate a bit
    sf::Clock timer;

    while (window.isOpen()) {
        sf::Event event;
        while (window.pollEvent(event)) {
            switch (event.type) {
            case sf::Event::Closed:
                window.close();
                break;
            }
        }

        // Rotate the circle
        circle.setRotation(timer.getElapsedTime().asMilliseconds() / 10);

        // Clear the scene in the render texture
        buffer.clear(sf::Color(64, 127, 192));

        // Draw our circle
        circle.setPosition(25, 37.5f); // Despite the float offset, the result will be pixel accurate!
        buffer.draw(circle);

        // Finish the render texture drawing
        buffer.display();

        // Draw the render texture's contents
        window.draw(bufferSprite);

        // Let's render the upscaled shape for comparison
        circle.setPosition(75, 37.5f);
        window.draw(circle);

        // Display the results
        window.display();
    }

    return 0;
}

После компиляции это приведет к двум вращающимся шестигранным «кругам», одному пикселированному (по разрешению текстуры рендеринга) и одному резкому (из-задо простого масштабирования):

Example program running.

...