代码之家  ›  专栏  ›  技术社区  ›  Ozan Deniz

SFML/C++在sf::精灵上闪烁命中效果

  •  1
  • Ozan Deniz  · 技术社区  · 7 年前

    在我搜索解决方案时,我只意识到sfml处理sf::Sprite对象上的setColor的方式。 它只是精灵中每个像素当前RGB值的乘积。

    这样就不可能在精灵上产生“白色”闪烁的命中效果。 闪现命中效果的意思是:当你击中敌人时,它会在一秒钟内变为纯白色,然后这种效果会迅速消失,直到精灵恢复到原来的状态。

    如何在SFML上产生这种白色闪烁的命中效果? (可能使用着色器?)

    谢谢

    2 回复  |  直到 7 年前
        1
  •  3
  •   Ozan Deniz    7 年前

    似乎最好的解决方案是为此编写自己的着色器。 我用这种方法解决了这个问题。代码如下:

    色调frag公司

    uniform sampler2D texture;
    
    uniform vec4 flashColor;
    
    void main()
    {
    
    
    vec4 pixel_color = texture2D(texture, gl_TexCoord[0].xy);
    float percent = flashColor.a;
    
    vec4 colorDifference = vec4(0,0,0,1);
    
    colorDifference.r = flashColor.r - pixel_color.r;
    colorDifference.g = flashColor.g - pixel_color.g;
    colorDifference.b = flashColor.b - pixel_color.b;
    pixel_color.r = pixel_color.r + colorDifference.r * percent;
    pixel_color.g = pixel_color.g +colorDifference.g * percent;
    pixel_color.b =pixel_color.b + colorDifference.b * percent;
    
    
    gl_FragColor = pixel_color; 
    
    }
    

    使用色调。frag文件(它是一个着色器文件)您应该发送flashColor值 按以下方式创建sf::着色器对象:

    .cpp代码

    flashColor.a = 1.0;//1.0 for 100% effect to 0.0 for 0% effect
    shader.loadFromFile("shader/tint.frag", sf::Shader::Fragment);//use your own 
    //file path
    shader.setUniform("flashColor", sf::Glsl::Vec4(1, 0, 0, 1));//from left to 
    //right: red,green,blue,alpha. Alpha is useless in this shader file.
    //max is 1, not 255.
    window.draw(yoursprite, &shader);
    

    通过改变闪光灯颜色。a、 可以更改着色效果。0为原始颜色,1为使用所需颜色对纹理进行完全着色。

        2
  •  0
  •   Tercalen    7 年前

    我认为没有现成的解决方案。

    但是,您可以尝试创建一个白色精灵,该精灵的大小与您要在其上制作动画的ennemy大小相同,并且接下来就是它。在游戏中,您将白色精灵的透明度设置为0以使其不可见(使用您提到的setColor),并且当达到ennemy时,将透明度值设置为255。然后,您可以随着时间的推移将其减小,以产生“淡出”效果。