Пиксельный массив рисования SFML

Я нашел это ( http://lodev.org/cgtutor/raycasting.html) учебное пособие в Интернете и заинтересовался и хотел сделать свое собственное. Я хотел сделать это в SFML, и я хотел расширить его и сделать 3D-версию, чтобы игрок мог пройти разные уровни. Таким образом, вам потребуется 1 луч на каждый пиксель, и, таким образом, каждый пиксель должен быть нарисован независимо. Я нашел это ( http://www.sfml-dev.org/tutorials/2.1/graphics-vertex-array.php) учебное пособие, и, казалось, достаточно просто иметь массив из отдельных вершин. Для начала я решил, что лучше всего создать класс, который мог бы считывать пиксели, возвращаемые лучами, и рисовать их на экране. Я использовал VertexArray, но по какой-то причине все не работает. Я пытался выделить проблему, но у меня был небольшой успех. Я написал простой массив вершин, состоящий только из зеленых пикселей, который должен заполнить часть экрана, и все же есть проблемы. Пиксели показывают только мой код и рис. о чем я

#include "SFML/Graphics.hpp"  
int main() {
sf::RenderWindow window(sf::VideoMode(400, 240), "Test Window");
window.setFramerateLimit(30);
sf::VertexArray pointmap(sf::Points, 400 * 10);
for(register int a = 0;a < 400 * 10;a++) {
    pointmap[a].position = sf::Vector2f(a % 400,a / 400);
    pointmap[a].color = sf::Color::Green;
}
while (window.isOpen()) {
    sf::Event event;
    while (window.pollEvent(event)) {
        if (event.type == sf::Event::Closed)
        window.close();
    }
    window.clear();
    window.draw(pointmap);
    //</debug>
    window.display();
}
return 0;

}

http://oi43.tinypic.com/s5d9aw.jpg

Я имел в виду, что для этого нужно просто заполнить первые 10 строк зеленым, но, видимо, это не то, что я сделал... Думаю, если я смогу выяснить, почему это не работает, я, вероятно, смогу решить основную проблему. Кроме того, если вы думаете, что есть лучший способ сделать это, вы можете дать мне знать:)

Спасибо!

2 ответа

Я думаю, что вы неправильно использовали массив вершин. Посмотрите на sf::Quads Примитив в таблице урока: вам нужно определить 4 точки (координаты), чтобы нарисовать квад, а пиксель - это всего лишь четверка боковой длины 1.

Итак, что вам нужно, это создать массив вершин размера 400*10*4и установите одинаковое положение для каждой из следующих четырех вершин.

Вы также можете использовать другой метод, предоставляемый SFML: рисовать текстуру попиксельно и отображать ее. Возможно, это не самая эффективная вещь (вам придется сравнивать ее с вершинами), но она имеет преимущество в том, что она довольно проста.

const unsigned int W = 400;
const unsigned int H = 10; // you can change this to full window size later

sf::UInt8* pixels = new sf::UInt8[W*H*4];

sf::Texture texture;
texture.create(W, H); 

sf::Sprite sprite(texture); // needed to draw the texture on screen

// ...

for(register int i = 0; i < W*H*4; i += 4) {
    pixels[i] = r; // obviously, assign the values you need here to form your color
    pixels[i+1] = g;
    pixels[i+2] = b;
    pixels[i+3] = a;
}

texture.update(pixels);

// ...

window.draw(sprite);

sf::Texture::update функция принимает массив sf::UInt8. Они представляют цвет каждого пикселя текстуры. Но так как пиксели должны быть 32bit RGBA, 4 подписки sf::UInt8 являются RGBA-компонентами пикселя.

Заменить строку:

pointmap[a].position = sf::Vector2f(a % 400,a / 400);

С:

pointmap[a].position = sf::Vector2f(a % 400,(a/400) % 400);
Другие вопросы по тегам