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 来补充你的学习。
祝你好运。
首先,我正在学习来自 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 来补充你的学习。
祝你好运。