SDL2 C++ 未处理的异常

SDL2 C++ Unhandled Exception

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

在我漫长的 C++ 之旅中,任何 help/direction 都将不胜感激!

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 offers methods 检查错误。

documentation for IMG_Load states that NULL is returned on error. That may be an error source. You should check for null and use IMG_GetError 以获得更多见解。

更多旅程提示:

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

在 C++ 中,您想使用 RAII Idiom 进行获取。

您还应该考虑使用像 SDL 这样的 std::unique_ptr (or the shared variant in some cases) to handle your raw pointers. This also works for C-Style APIs

对于 SDL,我还会用 Lazy Foos tutorials 来补充你的学习。

祝你好运。