【发布时间】: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.x和kingRect.y未初始化并且可能有垃圾值,这可能会将目标矩形放置在离屏幕非常远的地方。尝试在构造函数中添加kingRect.x = 0; kingRect.y = 0;