Получение пикселя для печати на экране с использованием SFML и C ++ - PullRequest
0 голосов
/ 28 октября 2018

Моя основная цель - преобразовать набор пар чисел из текстового файла (numbers.txt) и назначить каждое из этих чисел в виде координат пикселей. Затем мне нужно напечатать пиксель по каждой из этих координат, который в конечном итоге сформирует изображение Соединенных Штатов, состоящее только из отдельных пикселей.

Сейчас я просто пытаюсь заставить любой пиксель любого цвета выводить на экран с использованием SFML. Возможно, если я смогу зайти так далеко, я смогу каким-то образом взять числа, хранящиеся в файле numbers.txt, и преобразовать их в координаты с пикселем в каждом.

Вот мой код ...

#include <iostream>
#include <fstream> // the fstream class
#include <SFML/Graphics.hpp>

#include <string> // will help to use strings

using namespace std;

int main()
{

    string line;
    int width, height;
    fstream myFile;
    myFile.open("resources/numbers.txt");

    if (myFile)
    {
        cout << "This file is opened\n";
    }
    else
        return EXIT_FAILURE;

    cout << "Enter 2 integer values";
    cin >> width >> height;

    // Print a black window to the screen

    sf::RenderWindow window(sf::VideoMode(width, height), "MAP");

    sf::Texture texture;

    sf::Sprite sprite;
    sprite.setTexture(texture);

    while (window.isOpen())
    {
        sf::Event event;

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

                    break;
            }
        }

        window.clear();

        //window.draw(sprite);

        //*************DRAW THE SPRITE HERE****************
        // create a new vertex
        sf::Vertex vertex;

        // set its position
        vertex.position = sf::Vector2f(10.f, 50.f);

        // set its color
        vertex.color = sf::Color::Red;

        // set its texture coordinates
        vertex.texCoords = sf::Vector2f(100.f, 100.f);

        sf::VertexArray pixel(sf::Points);

        window.draw(pixel);

        //display window
        window.display();

    }
    return 0;
}

Это хорошо компилируется. Но отображает только черный экран для пользователя. Мне нужно как-то получить пиксель на этом черном экране. Я очень новичок в SFML и C ++ и посмотрел на главной странице SFML о точках и пикселях, но только дошел до этого. Кто-нибудь из вас, ребята, может помочь? Это супер ценится!

Всего наилучшего.

1 Ответ

0 голосов
/ 28 октября 2018

В SFML есть несколько подходов для рисования одного пикселя на экране. Первый - это то, что вы пытаетесь сделать с sf::VertexArray. На мой взгляд, более простым и интуитивно понятным является подход с sf::RectangleShape, где вы можете создать прямоугольник размером 1x1, и этот я собираюсь представить вам.

Во-первых, мы можем добавить полезную функцию, которая создаст «пиксель» в заданной позиции и цвете.

sf::RectangleShape addPixel(sf::Vector2f position, sf::Uint8 red, sf::Uint8 green, sf::Uint8 blue)
{
    sf::RectangleShape pixel;
    pixel.setSize({ 1.f, 1.f });
    pixel.setFillColor({ red, green, blue });
    pixel.setPosition(position);
    return pixel;
}

Эта функция вернет sf::RectangleShape с цветом, созданным из значений RGB, переданных в качестве аргументов этой функции.

Но вы должны хранить эти пиксели где-то.

Итак, давайте создадим окно и некоторый контейнер для хранения наших пикселей, например std::vector<sf::RectangleShape> и добавить к нему несколько пикселей:

sf::RenderWindow window(sf::VideoMode(800, 600), "SFML window");
std::vector<sf::RectangleShape> pixels;
pixels.push_back(addPixel({ 100, 100 }, 255, 0, 0));
pixels.push_back(addPixel({ 101, 100 }, 255, 255, 0));
pixels.push_back(addPixel({ 102, 100 }, 0, 0, 0));
pixels.push_back(addPixel({ 103, 100 }, 255, 0, 255));

Наконец, вы создаете основной цикл, в котором вы рисуете все пиксели в каждой итерации.

while (window.isOpen())
{
    window.clear();
    for (const auto& pixel : pixels)
    {
        window.draw(pixel);
    }
    window.display();
}

Убедитесь, что вы добавили больше пикселей, прежде чем пытаться отобразить его. На экране с высоким разрешением отдельные пиксели могут быть невидимыми.

РЕДАКТИРОВАТЬ: Ваш код также работает, но вы забыли добавить sf::Vertex к sf::VertexArray. Все, что вам нужно сделать, это:

sf::Vertex vertex1;
vertex1.position = sf::Vector2f(10.f, 50.f);
vertex1.color = sf::Color::Red;
sf::VertexArray pixel;
pixel.append(vertex1); // That's what you forgot.
window.draw(pixel);

Как и выше, при таком подходе также добавьте еще sf::Vertex рядом друг с другом, иначе вы можете не заметить один пиксель на экране.

Надеюсь, это поможет!

...