SDL_RenderCopy ничего не делает - PullRequest
0 голосов
/ 20 ноября 2018

Я звоню SDL_RenderCopy, и он вызывается и возвращается нормально, но ничего не рисует в окне. Отредактировано, чтобы сделать вопрос и код более понятным. Я думаю, что, возможно, пытаюсь использовать что-то за пределами своей области и, следовательно, это не может быть вызвано, но это не приводит к какой-либо ошибке, поэтому я не уверен. Вот простая картина, на которую я ссылаюсь https://commons.wikimedia.org/wiki/Category:PNG_chess_pieces/Standard_transparent#/media/File:Chess_kdt60.png

#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>

// Recreation of the problem. Doesnt draw anything onto the white screen.

class King{

public:
  King(SDL_Renderer *renderer){
    SDL_Surface *Piece;
    Piece = IMG_Load("Pieces/BK.png"); // I'll attach the picture
    king = SDL_CreateTextureFromSurface(renderer, Piece);
    SDL_FreeSurface(Piece);
    kingRect.h = 100;
    kingRect.w = 100;
  }
  ~King(){}

  void render(SDL_Renderer *renderer){
    SDL_RenderCopy(renderer, king, NULL, &kingRect); // 99% sure the     problem is this
  }

private:
  SDL_Texture *king;
  SDL_Rect kingRect;
};

class Game {

 public:
  Game(const char *title, int sidelength){
    isRunning = true;
    if(SDL_Init(SDL_INIT_EVERYTHING) != 0) isRunning = false;

window = SDL_CreateWindow(title, SDL_WINDOWPOS_CENTERED,   SDL_WINDOWPOS_CENTERED, sidelength, sidelength, SDL_WINDOW_OPENGL);
if(window == NULL) isRunning = false;

renderer = SDL_CreateRenderer(window, -1, 0);
if(!renderer) isRunning = false;

SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
  }
  ~Game(){}
  void handleEvents(){
    //Handles Events. I know this works.
    }
  }

  void update(){};

  void render(){
    SDL_RenderClear(renderer);
    BK.render(renderer);
    SDL_RenderPresent(renderer);
  }

  void clean(){
    //Cleans up after. I know this works.
    SDL_DestroyWindow(window);
    SDL_DestroyRenderer(renderer);
    SDL_Quit();
  }
  bool running(){return(isRunning);}
  King BK{renderer};
private:
  bool isRunning{true};
  SDL_Window *window;
  SDL_Renderer *renderer;
};

Game *game = nullptr;

int main(int argc, const char *argv[]){
  game = new Game("Testing Window", 800);

  while(game->running()){
    game->handleEvents();
    game->update();
    game->render();
  }
  game->clean();
  return(0);
}

1 Ответ

0 голосов
/ 20 ноября 2018
Поле

King BK{renderer}; инициализируется до того, как ваш Game::Game завершает работу, и получает возможность назначить средство визуализации, поэтому вместо него оно получает NULL. NULL не является корректным средством визуализации и не может создавать текстуры. Если бы вы проверили ошибку, вы бы получили сообщение Invalid renderer. Также приличный компилятор с включенными предупреждениями скажет что-то вроде warning: 'Game::renderer' is used uninitialized in this function [-Wuninitialized]; рассмотрите возможность включения лучших уровней предупреждений в вашем компиляторе.

Во-вторых, вы никогда не звонили IMG_Init с необходимыми форматами изображений, которые вы намерены загружать.

В-третьих, код не отформатирован и не будет компилироваться без изменений. Я предлагаю протестировать код, который вы публикуете как MCCVE, чтобы он оставался компилируемым и воспроизводил вашу проблему (как и подразумевает MCCVE).

...