SFML Vertex Array не рисует - PullRequest
       34

SFML Vertex Array не рисует

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

Я пытаюсь закодировать Hex Game, используя SFML, и для этого я хочу нарисовать гексагоны, выровненные по сетке.Для этого я попытался использовать выпуклую фигуру, которая не работала, и массив вершин, который сделал то же самое.

Вот моя функция рендеринга:

void Game::render(std::vector<int>& Vector)
{
    mWindow.clear(sf::Color(100, 100, 100));

    drawCells(Vector);

    mWindow.display();
}

А вот функция drawCells:

void Game::drawCells(std::vector<int>& Vector)
{
for (unsigned int x = 0; x < mColCount; ++x)
{
    for (unsigned int y = 0; y < mRowCount; ++y)
    {
        sf::VertexArray hexagone(sf::Triangles, 6);
        sf::Color color;
        if (Vector[getIndex(x, y)] == WHITE)
        {
            color = sf::Color(255, 255, 255);
        }
        else if (Vector[getIndex(x, y)] == BLUE)
        {
            color = sf::Color(200, 50, 50);
        }
        else // Red hexagon
        {
            color = sf::Color(50, 50, 200);
        }

        hexagone[0] = sf::Vertex(sf::Vector2f((x + 1.0 / 2.0) * mCellHorSize + mHorOffset, y * mCellVerSize + mVerOffset), color);
        hexagone[1] = sf::Vertex(sf::Vector2f((x + 1.0) * mCellHorSize + mHorOffset, (y + 1.0 / 3.0) * mCellVerSize + mVerOffset), color);
        hexagone[2] = sf::Vertex(sf::Vector2f((x + 1.0) * mCellHorSize + mHorOffset, (y + 2.0 / 3.0) * mCellVerSize + mVerOffset), color);
        hexagone[3] = sf::Vertex(sf::Vector2f((x + 1.0 / 2.0) * mCellHorSize + mHorOffset, (y + 1) * mCellVerSize + mVerOffset), color);
        hexagone[4] = sf::Vertex(sf::Vector2f(x*mCellHorSize + mHorOffset, (y + 2.0 / 3.0) * mCellVerSize + mVerOffset), color);
        hexagone[5] = sf::Vertex(sf::Vector2f(x*mCellHorSize + mHorOffset, (y + 1.0 / 3.0) * mCellVerSize + mVerOffset), color);



        /*sf::VertexArray hexagone(6);
        hexagone.setOutlineColor(sf::Color::Black);
        hexagone.setOutlineThickness(4);

        hexagone.setPoint(0, sf::Vector2f((x + 1.0 / 2.0)*mCellHorSize + mHorOffset, y*mCellVerSize + mVerOffset));
        hexagone.setPoint(1, sf::Vector2f((x + 1.0)*mCellHorSize + mHorOffset, (y + 1.0 / 3.0)*mCellVerSize + mVerOffset));
        hexagone.setPoint(2, sf::Vector2f((x + 1.0)*mCellHorSize + mHorOffset, (y + 2.0 / 3.0)*mCellVerSize + mVerOffset));
        hexagone.setPoint(3, sf::Vector2f((x + 1.0 / 2.0)*mCellHorSize + mHorOffset, (y+1)*mCellVerSize + mVerOffset));
        hexagone.setPoint(4, sf::Vector2f(x*mCellHorSize + mHorOffset, (y + 2.0 / 3.0)*mCellVerSize + mVerOffset));
        hexagone.setPoint(5, sf::Vector2f(x*mCellHorSize + mHorOffset, (y + 1.0 / 3.0)*mCellVerSize + mVerOffset));

        if (Vector[getIndex(x, y)] == WHITE)
        {
            hexagone.setFillColor(sf::Color(255, 255, 255));
        }
        else if (Vector[getIndex(x, y)] == BLUE)
        {
            hexagone.setFillColor(sf::Color(200, 50, 50));
        }
        else // Red hexagon
        {
            hexagone.setFillColor(sf::Color(50, 50, 200));
        }*/

        mWindow.draw(hexagone);
    }
}

}

Я уже потратил много часов на это, и я хотел бы перейти к следующему шагу, поэтому я спрашиваю вас, ребята, знаете ли вы, почему гексагоныне рендерингЯ забыл упомянуть, но window.clear работает отлично, поэтому это должна быть функция drawCells.

PS: Если вы обнаружите ошибки на английском языке, исправьте их, так как я хочу улучшить свой английский.Спасибо.

1 Ответ

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

Хотя я не могу говорить о том, что вы используете sf::ConvexShape, наверняка, точки, которые вы проходите, не будут образовывать шестиугольник, построенный из Triangles (который вы определили для sf::VertexArray).Если вы передадите Triangles, вам нужно будет определить одиночные треугольники для рисования, а не только точки контура.

Однако вы можете пропустить всю эту математику, просто потому что вы можете просто нарисовать свои шестиугольники каккруги построены из 6 точек (потому что именно так вы по сути определяете шестиугольник).

Вот краткий пример построения сетки 10x10:

#include <SFML/Graphics.hpp>
#include <vector>

int main()
{
    sf::RenderWindow window({640, 480}, "Hexagons");

    // We're simply abusing a `CircleShape` here,
    // since a circle defined by 6 points IS a hexagon!
    sf::CircleShape hexagon(25, 6);
    hexagon.setOutlineColor(sf::Color::Black);
    hexagon.setOutlineThickness(5);
    hexagon.setFillColor(sf::Color::White);
    hexagon.setOrigin(25, 25);

    while (window.isOpen()) {
        sf::Event event;
        while (window.pollEvent(event)) {
            if (event.type == sf::Event::Closed)
                window.close();
        }

        window.clear(sf::Color::White);

        for (int y = 0; y < 10; ++y) {
            for (int x = 0; x < 10; ++x) {
                // The horizontal/vertical offsets of 50 and 40
                // might feel off, but that's due to the way SFML
                // calculates the circle outline
                hexagon.setPosition((y % 2 ? 75 : 50) + x * 50.f, 50 + y * 40.f);
                hexagon.setFillColor(sf::Color(x * 25, y * 25, 0));
                window.draw(hexagon);
            }
        }
        window.display();
    }
}

При выполнении этого примера вы в конечном итоге получитес таким окном:

Example

Также обратите внимание, что, как правило, не идеально (повторно) создавать свои чертежи снова и снова.Используйте их снова.

...