【发布时间】: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