Ошибка подтверждения при попытке включения текстур SDL2 c ++ - PullRequest
0 голосов
/ 23 февраля 2019

Я сделал графический движок с SDL2, и когда я добавляю текстуру, она отображает ошибку:

Screenshot

Однако, еслия не включаю текстуры, все работает нормально.

У меня также есть основания полагать, что ошибка связана с IDE, потому что я читаю другие вопросы.

Моя IDE: VS 2017 pro

Код

run ()

void maingame::run()
{
    initSystems();
    _sprite.init(-1.0f, -1.0f, 2.0f, 2.0f);
    _enemyTexture = ImageLoader::loadPNG("textures/jimmyJump_pack/PNG/CharacterRight_Standing.png");
    gameLoop();
}

Метод run () вызывается функцией main () func

Инициализацияиз спрайта:

void targetSprite::init(float x, float y, float width, float height)
{
    _x = x;
    _y = y;
    _width = width;
    _height = height;

    if (_vboID == 0) {
        glGenBuffers(1, &_vboID);
    }
    Vertex vertexData[6];
    //1st
    vertexData[0].setPos(_x + _width, _y + _height);
    vertexData[0].setUV(1.0f, 1.0f);

    vertexData[1].setPos(_x, _y + _height);
    vertexData[1].setUV(0.0f, 1.0f);

    vertexData[2].setPos(_x, _y);
    vertexData[2].setUV(0.0f, 0.0f);

    //2nd

    vertexData[3].setPos(_x, _y);
    vertexData[3].setUV(0.0f, 0.0f);

    vertexData[4].setPos(_x + _width, _y);
    vertexData[4].setUV(1.0f, 0.0f);

    vertexData[5].setPos(_x + _width, _y + _height);
    vertexData[5].setUV(1.0f, 1.0f);

    for (int i = 0; i < 6; i++) {
        vertexData[i].setColor(127, 127, 255, 255);
    }

    vertexData[1].setColor(255, 0, 255, 255);
    vertexData[4].setColor(0, 255, 255, 255);

    glBindBuffer(GL_ARRAY_BUFFER, _vboID);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData), vertexData, GL_STATIC_DRAW);

    glBindBuffer(GL_ARRAY_BUFFER, _vboID);
}

Я отправил это, потому что я верю, что здесь ошибка.

Но это не обязательно, потому что этот же код запускает текстуры без текста.

В строке 10 «Vertex» - это структура.

Я пытался изменить сборку с отладочной на выпускную, но затем у меня возникли проблемы с файлами DLL.

РЕДАКТИРОВАТЬ:

Это вызывает ошибку в векторе:

GLTexture ImageLoader::loadPNG(std::string filePath)
{
    GLTexture texture = {};
    std::vector<unsigned char> out;
    unsigned long width;
    unsigned long height;
    std::vector<unsigned char> in;
    if (IOManager::readFileToBuffer(filePath, in) == false) { //read the texture to buffer
        fatalError2("FTB 1");
    }
    int errorCode = decodePNG(out, width, height, &(in[0]), in.size()); //error line
    if (errorCode != 0) {
        fatalError2("DPNG 1: " + std::to_string(errorCode));
    }

    glGenTextures(1, &(texture.id));
    glBindTexture(GL_TEXTURE_2D, texture.id);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, &(out[0]));
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
    glGenerateMipmap(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, 0);

    texture.width = width;
    texture.height = height;

    return texture;
}

Строка 25, затем возвращается к run (), main (), а затем открывает окно «sdl_windows_main.c not found».

Итак, я думаю, вопрос в том, где находится этот файл?

РЕДАКТИРОВАТЬ 2

метод readFileToBuffer (), я считаю, что отвечает за заполнение вектора "в"

bool IOManager::readFileToBuffer(std::string filePath, std::vector<unsigned char> buffer)
{
    std::ifstream file(filePath, std::ios::binary);
    if (file.fail()) {
        perror(filePath.c_str());
        return false;
    }
    file.seekg(0, std::ios::end);
    int fileSize = file.tellg();
    file.seekg(0, std::ios::beg);
    fileSize = fileSize - file.tellg();
    buffer.resize(fileSize);
    file.read((char *)&(buffer[0]), fileSize);
    file.close();
    return true;
}

1 Ответ

0 голосов
/ 07 марта 2019

Решением было передать «буфер» по ссылке

bool IOManager::readFileToBuffer(std::string filePath, std::vector<unsigned char>&buffer)
{
    std::ifstream file(filePath, std::ios::binary);
    if (file.fail()) {
        perror(filePath.c_str());
        return false;
    }
    file.seekg(0, std::ios::end);
    int fileSize = file.tellg();
    file.seekg(0, std::ios::beg);
    fileSize = fileSize - file.tellg();
    buffer.resize(fileSize);
    file.read((char *)&(buffer[0]), fileSize);
    file.close();
    return true;
}
´´´
...