字体渲染函数C ++ SDL中未处理的异常

时间:2013-12-29 02:39:17

标签: c++ class exception sdl

我正在制作一个PONG克隆,只是在标题画面上。我有一个类来处理状态机的标题屏幕循环,它只使用很少的,只有一个精灵和一个真正的类型字体消息。但是当我调用函数将消息呈现到SDL_Surface时,它会使我的程序陷入困境。我收到的错误是Unhandled exception at 0x6F4C2A9D (SDL_ttf.dll) in Pong.exe: 0xC0000005: Access violation reading location 0x00000000.通常这意味着我没有初始化某些内容或者没有在类定义中定义它,但这一切似乎都是有序的。所以我会在这里发布代码,希望有人能够看到渲染功能或其周围的部分。

非常清楚这一行引发了异常:

Title_Message = TTF_RenderText_Solid(字体," PONG",颜色);

//start code
/*CLASSES*/

class GameState
{
public:
    virtual void events() = 0;
    virtual void logic() = 0;
    virtual void render() = 0;
    virtual ~GameState(){};
};

class Button
{
public:
    SDL_Rect button_clip[2];
    SDL_Rect button;
    SDL_Surface *button_sprite = NULL;
    Button();
};

class Title : public GameState
{
private:
    SDL_Surface *Title_Message = NULL;
    SDL_Rect *clip;
    Button Title_Button;
public:
    void events();
    void logic();
    void render();
    Title();
    ~Title();
};

/*FONTS*/
SDL_Color color = { 255, 255, 255 };
TTF_Font *font = NULL;

bool init()
{
    //initialize all SDL subsystems
    if (SDL_Init(SDL_INIT_EVERYTHING) == -1)
    {
        return false;
    }
    //set up screen
    screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE);
    //check screen
    if (screen == NULL)
    {
        return false;
    }
    //init TTF
    if (TTF_Init() == -1)
    {
        return false;
    }
    //set window caption
    SDL_WM_SetCaption("PONG", NULL);
    //if evetything worked
    return true;
}

//load files
bool load_files()
{
    font = TTF_OpenFont("PIXELITE.ttf", 45);
    if (font == NULL)
    {
        return false;
    }
    return true;
}

/*CLASS DEFINITIONS*/

Button::Button()
{

}

Title::Title()
{
    Title_Message = TTF_RenderText_Solid(font, "PONG", color);
    Title_Button.button_sprite = load_image("Start.png");
    Title_Button.button.x = 200;
    Title_Button.button.y = 350;
    Title_Button.button.w = 100;
    Title_Button.button.h = 50;
    //clips not hover
    Title_Button.button_clip[0].x = 0;
    Title_Button.button_clip[0].y = 0;
    Title_Button.button_clip[0].w = 100;
    Title_Button.button_clip[0].h = 50;
    //clips hover
    Title_Button.button_clip[1].x = 0;
    Title_Button.button_clip[1].y = 50;
    Title_Button.button_clip[1].w = 100;
    Title_Button.button_clip[1].h = 50;
}

Title::~Title()
{
    SDL_FreeSurface(Title_Message);
    SDL_FreeSurface(Title_Button.button_sprite);
}

void Title::events()
{
    int x = 0;
    int y = 0;
    while (SDL_PollEvent(&event))
    {
        if (event.type == SDL_MOUSEMOTION)
        {
            x = event.motion.x;
            y = event.motion.y;
            if ((x > Title_Button.button.x) && (x < (Title_Button.button.x + Title_Button.button.w)) && (y > Title_Button.button.y) && (y < (Title_Button.button.y + Title_Button.button.h)))
            {
                clip = &Title_Button.button_clip[1];
            }
            else
            {
                clip = &Title_Button.button_clip[0];
            }
        }
        if (event.type == SDL_QUIT)
        {
            quit = true;
        }
    }
}

void Title::logic()
{

}

void Title::render()
{
    apply_surface(Title_Button.button.x, Title_Button.button.y, Title_Button.button_sprite, screen, clip);
    apply_surface((SCREEN_WIDTH - Title_Message->w) / 2, 100, Title_Message, screen);
}

有人有个主意吗?谢谢!

1 个答案:

答案 0 :(得分:1)

我会将评论中的建议作为实际答案发布:

导致问题的行Title_Message = TTF_RenderText_Solid(font, "PONG", color);引用类型为font的全局变量TTF_Font*。该行也是类Title的构造函数的一部分。

main看起来像这样:

int main(int argc, char* args[])
{
    //init SDL
    init();
    //load everything
    load_files();
    currentState = new Title;
    //...

font在声明时初始化为NULL,实际对象仅在load_files()中分配,该mainTitle开头load_files()之前执行第一次实例化。

因此font必须指定一个指向main的有效指针,否则load_files()中的下一行将导致访问冲突。

main提供返回值,具体取决于创建和分配此对象是否成功。但是font从不检查此值,因此无法保证load_files()是有效指针。

正如knefcy指出问题是{{1}}中的文件名错误。