Я нашел это (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 http://oi43.tinypic.com/s5d9aw.jpg
Я имел в виду, что для этого нужно просто заполнить верхние 10 строк зеленым, но, видимо, это не то, что я сделал … Я думаю, что если я смогу выяснить, почему это не работает, я, вероятно, смогу решить основную проблему. Кроме того, если вы думаете, что есть лучший способ сделать это, вы можете дать мне знать 🙂
Спасибо!
Я думаю, что вы неправильно использовали массив вершин. Посмотрите на 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);