Ошибка SIGSEGV при использовании c ++ в linux с openGL и SDL - PullRequest
0 голосов
/ 24 января 2012

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

Main.cpp

Vector2 dudeDim(60,60);
Vector2 dudePos(300, 300);
Entity *test = new Entity("img/images.jpg", dudeDim, dudePos, false);

ведет к:

Entity.cpp

Entity::Entity(std::string filename, Vector2 size, Vector2 position, bool passable):
mTexture(filename)
{
    mTexture.load(false);
    mDimension2D = size;

    mPosition2D = position;

    mPassable = passable;
}

приводит к:

Textures.cpp

void Texture::load(bool generateMipmaps)
{
    FREE_IMAGE_FORMAT imgFormat = FIF_UNKNOWN;

    FIBITMAP *dib(0);

    imgFormat = FreeImage_GetFileType(mFilename.c_str(), 0);

//std::cout << "File format: " << imgFormat << std::endl;

if (FreeImage_FIFSupportsReading(imgFormat)) // Check if the plugin has reading capabilities and load the file
    dib = FreeImage_Load(imgFormat, mFilename.c_str());
if (!dib)
    std::cout << "Error loading texture files!" << std::endl;

BYTE* bDataPointer = FreeImage_GetBits(dib); // Retrieve the image data

mWidth = FreeImage_GetWidth(dib); // Get the image width and height
mHeight = FreeImage_GetHeight(dib);
mBitsPerPixel = FreeImage_GetBPP(dib);

if (!bDataPointer || !mWidth || !mHeight)
    std::cout << "Error loading texture files!" << std::endl;

// Generate and bind ID for this texture

vvvvvvvvvv !!! ОШИБКА ЗДЕСЬ !!! vvvvvvvvvvv

glGenTextures(1, &mId);

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 1019 *

glBindTexture(GL_TEXTURE_2D, mId); 

int format = mBitsPerPixel == 24 ? GL_BGR_EXT : mBitsPerPixel == 8 ? GL_LUMINANCE : 0; 
int iInternalFormat = mBitsPerPixel == 24 ? GL_RGB : GL_DEPTH_COMPONENT;  

if(generateMipmaps)
    glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, mWidth, mHeight, 0, format, GL_UNSIGNED_BYTE, bDataPointer); 
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); // Linear Filtering
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); // Linear Filtering

//std::cout << "texture generated " << mId << std::endl;
FreeImage_Unload(dib);
}

прочитав предложение Питера, я изменил свой файл main.cpp на:

#include <iostream>
#include <vector>

#include "Game.h"

using namespace std;


int main(int argc, char** argv)
{

Game theGame;

/* Initialize game control objects and resources */
if (theGame.onInit() != false)
{
    return theGame.onExecute();
}
else
{
    return -1;
}
}

и, похоже, ошибка SIGSEGV исчезла, и теперь у меня осталось что-то, что не инициализируется.Итак, спасибо, Питер, теперь ты был прав, я ухожу, чтобы решить эту проблему.

хорошо, так что это, очевидно, небольшой объем кода, но для того, чтобы сэкономить время и немного здравомыслия: весь коддоступно по адресу:

GitHub Repo

1 Ответ

2 голосов
/ 24 января 2012

Поэтому, посмотрев на ваш код, я могу сказать, что, вероятно, вы не инициализировали свой контекст OpenGL перед выполнением этого кода.

Вам нужно позвонить на Game::onInit(), который также вызывает RenderEngine::initGraphics(), прежде чем делать какие-либо звонки в OpenGL. Что вы в настоящее время не делаете. Вы в настоящее время делаете main()->Game ctor (calls rendering engine ctor but that ctor doesn't init SDL and OpenGL)->Entity ctor->load texture

Подробнее см. FAQ по OpenGL Wiki

...