【问题标题】:SDL2 C++ Unhandled ExceptionSDL2 C++ 未处理异常
【发布时间】:2018-04-25 01:01:47
【问题描述】:

首先,我正在学习来自 C# 背景的 C++ 和 SDL2。我收到了一个未处理的异常,它应该包含在 try/catch 中,但是其他示例中的代码行应该成功执行。异常发生在 SDL_RenderCopy() 函数中。

在我漫长的 C++ 之旅中,任何帮助/指导都将不胜感激!

Gameboard.h

#ifndef GAMEBOARD_H
#define GAMEBOARD_H

#include "GenericEntity.h"
#include "GameboardParameters.h"
#include "Piece.h"
#include <iostream>

// Board witdh & height in pieces
#define BOARD_WIDTH 6
#define BOARD_HEIGHT 11

// Piece width & height in pixels
#define PIECE_WIDTH 32
#define PIECE_HEIGHT 32

// Define next pieces buffer 
#define NEXT_PIECES 255

class Gameboard : public GenericEntity {

public:
    Gameboard(SDL_Renderer *renderer, GameboardParameters parms);
    ~Gameboard();
    void Render(float delta);
    void Update(float delta);
    void CreateLevel();

public:
    float FALL_SPEED = 50;
    Piece p1_pieces[BOARD_WIDTH][BOARD_HEIGHT];
    Piece next_pieces[NEXT_PIECES];

private:
    SDL_Texture *sdlTextureBackground;
    SDL_Texture *sdlTextureBackgroundGrid;
    SDL_Texture *texTarget;

};

#endif //GAMEBOARD_H

Gameboard.cpp

Gameboard::Gameboard(SDL_Renderer *renderer, GameboardParameters parms) : GenericEntity(renderer) {
     SDL_Surface *sdlSurfaceBackground = IMG_Load("resources/backgrounds/SC_S_01.BMP");
     sdlTextureBackground = SDL_CreateTextureFromSurface(renderer, sdlSurfaceBackground);
     SDL_FreeSurface(sdlSurfaceBackground);

     SDL_Surface *sdlSurfaceBackgroundGrid = IMG_Load("resources/backgrounds/GRID-768X1408.PNG");
     sdlTextureBackgroundGrid = SDL_CreateTextureFromSurface(renderer, sdlSurfaceBackgroundGrid);
     SDL_FreeSurface(sdlSurfaceBackgroundGrid);
}

...

void Gameboard::Render(float delta) {

     // Clear screen
     SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
     SDL_RenderClear(renderer);
     SDL_RenderPresent(renderer);

     // Render background
     SDL_RenderCopy(renderer, sdlTextureBackground, NULL, NULL);
}

【问题讨论】:

  • SDL_CreateTextureFromSurface 可以返回NULL,确保sdlTextureBackground 在传递给SDL_RenderCopy 之前不为空
  • 该特定文件和变量存在错误。我不确切知道,但我相信是函数的顺序在复制纹理之前释放了纹理,这至少是我对它的理解。最终,本教程有助于更清楚地了解 SDL 绘制过程willusher.io/sdl2%20tutorials/2013/08/17/lesson-1-hello-world

标签: c++ sdl sdl-2


【解决方案1】:

其中一个初始化可能有错误。通常,您必须假设资源初始化可能会失败,因此您需要检查这些错误。 SDL offers methods 检查错误。

IMG_Loaddocumentation 声明在错误时返回 NULL。这可能是一个错误来源。您应该检查 null 并使用 IMG_GetError 以获得更多见解。

更多旅行提示:

您无法使用try/catch 捕获所有异常。 Here 是该信息的起点。

在 C++ 中,您想使用 RAII Idiom 进行采集。

您还应该考虑使用std::unique_ptr(或某些情况下的共享变体)来处理您的原始指针。这也适用于C-Style APIs,如 SDL。

对于 SDL,我还将通过 Lazy Foos tutorials 补充您的学习。

祝你好运。

【讨论】:

  • 感谢您的指导,我一定会跟进这些链接。我一直在关注 SDL 功能的 Lazy Foo 教程,但学习 C++ 语言也是其中的一些曲线(语法)。谢谢!
猜你喜欢
  • 1970-01-01
  • 2015-06-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-12
  • 2021-12-02
  • 2013-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多