コード例 #1
0
void ComplexTileMap::Render(unsigned short minX, unsigned short minY, unsigned short maxX, unsigned short maxY)
{
    glPushMatrix();

    if(minX >= m_size[0])
        minX = m_size[0] - 1;
    if(minY >= m_size[1])
        minY = m_size[1] - 1;
    if(maxX >= m_size[0])
        maxX = m_size[0] - 1;
    if(maxY >= m_size[1])
        maxY = m_size[1] - 1;

    glEnable(GL_TEXTURE_2D);

    Image *lastImage = 0;
    glBegin(GL_QUADS);
    for(unsigned int a = minX; a < maxX; a++)
        for(unsigned int b = minY; b < maxY; b++)
        {
            for(vector<ComplexTileMap::Tile *>::iterator it = m_tiles[a][b].begin(); it != m_tiles[a][b].end(); it++)
            {
                Tile *tile = *it;
                TileSet *tileSet = tile->m_tileSet;
                if(tileSet)
                {
                    Vector2<unsigned short> tileSetSize = tileSet->GetSize();
                    if(tile->m_value[0] < tileSetSize[0] && tile->m_value[1] < tileSetSize[1])
                    {
                        unsigned int x, y, X, Y, _x, _y, _X, _Y;
                        x = a * m_tileSize[0];
                        y = b * m_tileSize[1];
                        X = x + m_tileSize[0];
                        Y = y + m_tileSize[1];

                        _x = tile->m_value[0] * m_tileSize[0];
                        _y = tile->m_value[1] * m_tileSize[1];
                        _X = _x + m_tileSize[0];
                        _Y = _y + m_tileSize[1];

                        Image *tileSetImage = tileSet->GetImage();
                        Vector2<unsigned int> tileSetImageSize = tileSetImage->GetSize();

                        float tx, ty, tX, tY;
                        tx = ((float)_x + 0.5f) / ((float)tileSetImageSize[0]);
                        ty = ((float)_y + 0.5f) / ((float)tileSetImageSize[1]);
                        tX = ((float)_X - 0.5f) / ((float)tileSetImageSize[0]);
                        tY = ((float)_Y - 0.5f) / ((float)tileSetImageSize[1]);

                        if(lastImage != tileSetImage)
                        {
                            glEnd();
                            tileSetImage->Bind();
                            glBegin(GL_QUADS);
                            lastImage = tileSetImage;
                        }

                        glTexCoord2f(tx, tY);
                        glVertex2i(x, y);
                        glTexCoord2f(tX, tY);
                        glVertex2i(X, y);
                        glTexCoord2f(tX, ty);
                        glVertex2i(X, Y);
                        glTexCoord2f(tx, ty);
                        glVertex2i(x, Y);
                    }
                }
            }
        }
    glEnd();

    glDisable(GL_TEXTURE_2D);
    glPopMatrix();
}