2015-01-04 1 views
0

SDL_Renderer에 약간의 문제가 있습니다. 왜 작동하지 않는지 나는 이해할 수 없다. 의이 예를 살펴 보자, 그것을 잘 작동합니다 :SDL_Renderer는 함수를 통과 한 후에 텍스처를 표시하지 않습니다.

bool running = true; 
SDL_Window* window = SDL_CreateWindow("ASDF", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_SHOWN); 
SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); 
SDL_Texture* texture = IMG_LoadTexture(renderer, "asdf.bmp"); 
SDL_Event event; 

while(running) 
{ 
    while(SDL_PollEvent(&event)) 
    { 
     switch(event.type) 
     { 
      case SDL_KEYDOWN: 
       if(event.key.keysym.sym == SDLK_ESCAPE) 
       { 
        running = false; 
       } 
       break; 
      default: 
       break; 
     } 
    } 
    SDL_RenderClear(renderer); 
    SDL_RenderCopy(renderer, texture, NULL, NULL); 
    SDL_RenderPresent(renderer); 
} 
SDL_DestroyTexture(texture); 

그 다음이 클래스에 와서 내가 기능을 통해 렌더러를 통과 할 때, 그것은 더 이상 작동하지 않습니다.

class Sprite 
{ 
public: 
    Sprite(const std::string& path) : filePath(path) {}; 
    ~Sprite() { SDL_DestroyTexture(tex); }; 
    void draw(SDL_Renderer* renderer); 

private: 
    const std::string& filePath; 
    SDL_Texture* tex; 
}; 

void Sprite::draw(SDL_Renderer* renderer) 
{ 
    printf("renderer sprite = %p\n", renderer); 

    tex = IMG_LoadTexture(renderer, filePath.c_str()); 
    SDL_RenderCopy(renderer, tex, NULL, NULL); 
} 

int main(int argc, char **argv) 
{ 
    bool running = true; 
    SDL_Window* window = SDL_CreateWindow("ASDF", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_SHOWN); 
    SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); 
    SDL_Event event; 

    Sprite* sprite = new Sprite("asdf.bmp"); 
    while(running) 
    { 
     printf("renderer main = %p\n", renderer); 

     while(SDL_PollEvent(&event)) 
     { 
      switch(event.type) 
      { 
       case SDL_KEYDOWN: 
        if(event.key.keysym.sym == SDLK_ESCAPE) 
        { 
         running = false; 
        } 
        break; 
       default: 
        break; 
      } 
     } 
     SDL_RenderClear(renderer); 
     sprite->draw(renderer); 
     SDL_RenderPresent(renderer); 
    } 

    return 0; 
} 

렌더러의 주소는 주 기능과 그리기 기능에서 동일합니다. 나는 아마 여기 초보자가 실수를하고있는 것을 알고 있지만 그것을 발견 할 수는 없다.

+0

원인인지는 모르겠지만 'sprite-> draw'를 호출 할 때마다 텍스처를 반복해서로드하고 있습니다. 생성자 또는 미디어를로드하는 함수에서 한 번 수행해야합니다. 방금로드 된 이미지이므로 렌더링 할 준비가되지 않았을 수 있습니다. – Zammalad

+0

Zammalad 고맙습니다! 그게 효과가 있었어! – siwers

+0

좋아, 답으로 써 줄게. – Zammalad

답변

1

sprite->draw을 호출하면 텍스처가 모든 프레임에로드됩니다.

tex = IMG_LoadTexture(renderer, filePath.c_str()); 행을 한 번만로드되도록 생성자로 이동해야합니다.

이 이유는 텍스처가로드 된 동일한 프레임에서 텍스처를 렌더링 할 준비가되지 않기 때문입니다.

보조 사례로 SDL_Window 또는 SDL_Renderer을 해당 파괴 기능으로 정리하거나 SDL_Quit으로 호출하는 것으로 보지 않습니다. 코드 예제 제출시이 부분이 생략되었을 수도 있습니다.

관련 문제