SDL2 C ++ необработанное исключение - PullRequest
0 голосов
/ 25 апреля 2018

Прежде всего, я нахожусь в процессе изучения C ++ и SDL2 из C # фона.Я получаю необработанное исключение, которое должно содержаться в try / catch, но строка кода из других примеров должна выполняться успешно.Исключение происходит в функции SDL_RenderCopy().

Любая помощь / направление будет наиболее ценной в моем долгом путешествии по C ++!

SDL2 C++ Exception

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);
}

1 Ответ

0 голосов
/ 25 апреля 2018

Вероятна ошибка в одной из инициализаций.В общем, вы должны предположить, что инициализация ресурса может завершиться неудачей, поэтому вам нужно будет проверить эти ошибки. SDL предлагает методы для проверки ошибок.

Документация для IMG_Load гласит, что NULL возвращается при ошибке.Это может быть источником ошибки.Вы должны проверить на ноль и использовать IMG_GetError , чтобы получить больше информации.

Дополнительные советы для вашего путешествия:

Вы не можете перехватить все исключения, используя try / catch. Здесь является отправной точкой для этой информации.

В C ++ вы хотите использовать RAII Idiom для получения.

Вы также должны учитыватьиспользуя std :: unique_ptr (или совместно используемый вариант в некоторых случаях) для обработки ваших необработанных указателей.Это также работает для API в стиле C * , таких как SDL.

Для SDL я также дополнил бы ваши учебные курсы Lazy Foos учебниками .

Удачи.

...