Как изменить альфа-значение изображения без полной перезагрузки каждого пикселя в каждом кадре / ОПТИМИЗАЦИЯ - PullRequest
0 голосов
/ 17 августа 2011

, поэтому я пытаюсь сделать изображение видимым в sfml 1.6, меняя его альфа-значение в каждом кадре. к сожалению, для изображения не существует общего альфа-значения, поэтому мне нужно просмотреть каждый пиксель один за другим и изменить его альфа-значение.

Однако это очень медленно, поэтому мне интересно , как я мог бы оптимизировать свой простой код, или есть ли другой способ, специфичный для sfml, чтобы справиться с этим.

в любом случае вот код:

Каждый новый кадр I Перекрасить спрайт с добавленным альфа-значением 1,7.

// @Return Ptr: a pointer to the stack allocated image so the 
//              user can deallocate it later
sf::Image* RecolorSprite(sf::Sprite& sprite, sf::Color filter, bool subtract){
    // the image has to survive so it's put ont he stack
    sf::Image* image = new sf::Image;
    *image = *sprite.GetImage();

    RecolorImage(*image, filter, subtract);
    sprite.SetImage(*image);

    return image;
}

void RecolorImage(sf::Image& image, sf::Color filter, bool subtract){
    for( int x= 0; x< image.GetWidth(); x++){
        for(int y= 0; y< image.GetHeight(); y++){
            if(subtract){
                sf::Color pixel = image.GetPixel(x, y);
                SubtractColor(pixel, filter);
                image.SetPixel(x, y, pixel);
            }
            else
                image.SetPixel(x, y, image.GetPixel(x, y) + filter);
        }
    }
}

// int used to stop illegal operations on unsigned chars 
void SubtractColor(sf::Color& col1, sf::Color& col2){
    int diff = ((int)col1.r) - ((int)col2.r);
        if(diff >= 0)
            col1.r -= col2.r;
        else
            col1.r = 0;

    diff = ((int)col1.g) - ((int)col2.g);
        if(diff >= 0)
            col1.g -= col2.g;
        else
            col1.g = 0;

    diff = ((int)col1.b) - ((int)col2.b);
        if(diff >= 0)
            col1.b -= col2.b;
        else
            col1.b = 0;

    diff = ((int)col1.a) - ((int)col2.a);
        if(diff >= 0)
            col1.a -= col2.a;
        else
            col1.a = 0;
}

1 Ответ

3 голосов
/ 03 сентября 2011

Если я не понимаю ваш вопрос, вы можете использовать для этого sf :: Drawable :: SetColor , указав в качестве аргумента белый цвет, но с другим значением альфа.Например, чтобы установить альфа sprite на 50%, вы можете сделать следующее:

sprite.SetColor(sf::Color(255, 255, 255, 128));
...