如何从VertexArray SFML中找到顶点的坐标

How to find the coordinates of a Vertex from a VertexArray SFML

本文关键字:顶点 坐标 VertexArray SFML      更新时间:2023-10-16

我使用带有Quads的VertexArray来制作一个小测试的TileMap。我试图找出如何找出什么顶点(四边形)的游戏对象上。

bool load(const std::string& tileset, sf::Vector2u tileSize, const int* tiles, unsigned int width, unsigned int height)
{
    // load the tileset texture
    if (!m_tileset.loadFromFile(tileset))
        return false;
    // resize the vertex array to fit the level size
    m_vertices.setPrimitiveType(sf::Quads);
    m_vertices.resize(width * height * 4);
    // populate the vertex array, with one quad per tile
    for (unsigned int i = 0; i < width; ++i)
    for (unsigned int j = 0; j < height; ++j)
    {
        // current tile number
        int tileNumber = tiles[i + j * width];
        // find its position in the tileset texture
        int tu = tileNumber % (m_tileset.getSize().x / tileSize.x);
        int tv = tileNumber / (m_tileset.getSize().x / tileSize.x);
        //std::cout << tu << " : " << tv << std::endl; <- Used this to out put it all, but it kept on showing the same coordinates and slowed the program down a lot.
        // current tile's quad
        sf::Vertex* quad = &m_vertices[(i + j * width) * 4];
        // 4 corners
        quad[0].position = sf::Vector2f(i * tileSize.x, j * tileSize.y);
        quad[1].position = sf::Vector2f((i + 1) * tileSize.x, j * tileSize.y);
        quad[2].position = sf::Vector2f((i + 1) * tileSize.x, (j + 1) * tileSize.y);
        quad[3].position = sf::Vector2f(i * tileSize.x, (j + 1) * tileSize.y);
        // 4 coordinates
        quad[0].texCoords = sf::Vector2f(tu * tileSize.x, tv * tileSize.y);
        quad[1].texCoords = sf::Vector2f((tu + 1) * tileSize.x, tv * tileSize.y);
        quad[2].texCoords = sf::Vector2f((tu + 1) * tileSize.x, (tv + 1) * tileSize.y);
        quad[3].texCoords = sf::Vector2f(tu * tileSize.x, (tv + 1) * tileSize.y);
    }
    return true;
}
私人:

virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const
{
    // apply the transform
    states.transform *= getTransform();
    // apply the tileset texture
    states.texture = &m_tileset;
    // draw the vertex array
    target.draw(m_vertices, states);
}
sf::VertexArray m_vertices;
sf::Texture m_tileset;

};

我已经尝试了一些其他的方法来显示它们,但是它们要么不能正确地执行,要么减慢了程序的速度。有人能给我指个正确的方向吗?

使用if语句检查TU和TV整数,这是您的瓷砖编号,因此检查它们是否等于您正在检查的瓷砖上的对象。

if (tu &TV == 1){std: <<"1"& lt; & lt;std:: endl;}