2016-06-17 2 views
0

私はテクスチャを変更するためにSDL_SetTextureColorMod関数を使用しています。 In this question's answerのように、この関数はテクスチャ自体を変更することはなく、描画するときにのみ色の変更を行います。SDLの消去SDL_SetTextureColorModの効果

問題は、SDL_SetTextureColorModを呼び出すと、エフェクトをリセットできないため、オンラインで何も見つかりませんでした。要するに、例えば、ダークン効果をテクスチャに追加したいと思います。しかし、その後、私は元のテクスチャを描くことができるようにしたい。 アプリケーションでGキーを押すと、エフェクトが適用されます。 は、私はまた、

SDL_SetTextureColorMod(texture, 1, 1, 1); 

を試してみましたが、それが有効に

コード

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

#include <iostream> 

using namespace std; 

int main2(); 

int WinMain() 
{ 
    main2(); 
} 
SDL_Texture* LoadTexture(const string& Filename, SDL_Renderer * renderer) 
{ 
    if(renderer == nullptr) 
     return nullptr; 

    SDL_Texture* texture = IMG_LoadTexture(renderer, Filename.c_str()); 
    if (texture == nullptr) 
    { 
     std::cout << __FUNCTION__ << "(...): " << "Failed to load texture " << Filename << " error : " << SDL_GetError() << std::endl; 
     return nullptr; 
    } 

    return texture; 
} 
int main2() 
{ 
    bool quit = false; 
    SDL_Event event; 

    SDL_Init(SDL_INIT_VIDEO); 
    IMG_Init(IMG_INIT_JPG); 

    SDL_Window * window = SDL_CreateWindow("SDL2 Grayscale", 
     SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, 0); 
    SDL_Renderer * renderer = SDL_CreateRenderer(window, -1, 0); 
    SDL_Texture * texture = LoadTexture("teeth.png", renderer); 
    if(!texture) 
     return 0; 

    while (!quit) 
    { 
     SDL_WaitEvent(&event); 

     switch (event.type) 
     { 
     case SDL_QUIT: 
      quit = true; 
      break; 
     case SDL_KEYDOWN: 
      switch (event.key.keysym.sym) 
      { 
      case SDLK_g: 
       //Uint8 * r, *g, *b; 


       SDL_SetTextureColorMod(texture, 100, 100, 100); 
       //greytexture = Greyscale(image, renderer, GreyscalePercentage); 
       break; 
      case SDLK_1: 
       SDL_SetTextureColorMod(texture, 1, 1, 1); 
       break; 
      } 
      break; 
     } 

     SDL_RenderCopy(renderer, texture, NULL, NULL); 
     SDL_RenderPresent(renderer); 
    } 

    SDL_DestroyTexture(texture); 
    //SDL_FreeSurface(image); 
    SDL_DestroyRenderer(renderer); 
    SDL_DestroyWindow(window); 
    IMG_Quit(); 
    SDL_Quit(); 

    return 0; 
} 

をリセットしませんでした任意の助けのためにありがとうございました。

答えて

1

SDL_SetTextureColorMod関数は、赤、緑、青のカラー値にUint8を使用します。値0は色なしです。値255は最大の色になります。したがって、色を通常にリセットするには、Red、Green、Blueに255を使用します。次のように:

SDL_SetTextureColorMod(texture, 255, 255, 255);