【问题标题】:SDL_RenderCopy not doing anythingSDL_RenderCopy 没有做任何事情
【发布时间】:2018-11-19 23:37:04
【问题描述】:

我正在调用 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);
}

【问题讨论】:

  • 这还不足以说明错误来自何处。您是否在检查 SDL 函数的返回值并在出现故障时检查 SDL_GetError()?请edit您的问题包含重现问题的信息,并考虑创建Minimal, Complete, Verifiable Example
  • 感谢您提醒我注意不够清晰。我创建了一个重现相同问题的小程序。 SDL_GetError 没有发现任何属于问题的错误。
  • 谢谢!这看起来好多了。我怀疑kingRect.xkingRect.y 未初始化并且可能有垃圾值,这可能会将目标矩形放置在离屏幕非常远的地方。尝试在构造函数中添加kingRect.x = 0; kingRect.y = 0;

标签: c++ sdl sdl-2 sdl-image


【解决方案1】:

King BK{renderer}; 字段在您的 Game::Game 完成并有机会分配渲染器之前被初始化,因此它改为使用 NULLNULL 不是有效的渲染器,无法创建纹理。如果您检查了错误,您将收到Invalid renderer 消息。启用警告的体面编译器也会告诉类似warning: 'Game::renderer' is used uninitialized in this function [-Wuninitialized];考虑在编译器中启用更好的警告级别。

第二件事是您从未使用您打算加载的所需图像格式调用IMG_Init

第三件事是代码格式错误,如果不修改就无法编译。我建议测试您发布为 MCCVE 的代码是否仍然可编译并重现您的问题(正如 MCCVE 所暗示的那样)。

【讨论】:

  • 谢谢。似乎有两个问题。第一个是您在第一段中描述的内容,第二个是即使我使用图片路径调用 IMG_LOAD 也不会加载它。所以我把 png 移到了这个项目的实际代码旁边,然后它就会加载。
猜你喜欢
  • 2012-09-07
  • 2016-10-02
  • 2013-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多