SFML顶点数组未绘制

时间:2018-10-03 04:11:16

标签: c++ sfml

我正在尝试使用SFML编写Hex Game,为此,我现在想绘制像网格一样对齐的六边形。为此,我尝试使用无效的凸形和相同的顶点阵列。

这是我的渲染功能:

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 :(得分:0)

虽然我无法使用sf::ConvexShape来谈论您,但可以肯定的是,您要传递的点不会形成由Triangles(为{{1}定义的}。如果您通过sf::VertexArray,则必须为可绘制对象定义单个三角形,而不仅是轮廓点。

但是,您可以跳过所有数学运算,仅因为您可以将六边形绘制为由6个点构建的圆(因为这实际上就是定义六边形的方式)。

下面是一个绘制10x10网格的简单示例:

Triangles

运行此示例时,您将看到一个像这样的窗口:

Example

还要注意,通常不理想的是一遍又一遍地(重新)创建可绘制对象。重复使用它们。